Nesse exemplo será construído dois combo boxs com framework Ext JS, um de estados e outro de cidades.
O combo box de cidades será carregado após selecionar o estado, ou seja, será exibido as cidades de um determinado estado.
Crie duas variáveis globais:
1 2 | var SELECTED_STATE; var CITY_STORE; |
Crie o data store de estados e o combo box de estados:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | var state_store = new Ext.data.JsonStore({ fields: [ {name: 'id', type: 'int'}, {name: 'short', type: 'string'} ], proxy: new Ext.data.HttpProxy({ url: 'getStates.php', method: 'GET' }) }); var state = new Ext.form.ComboBox({ store: state_store, displayField: 'short', fieldLabel: 'Estado', name: 'state', anchor: '100%', emptyText: 'Selecione o estado...', typeAhead: true, forceSelection: true, triggerAction: 'all', selectOnFocus: true }); |
Quando o combo box de estado for iniciado, será disparado uma requisição ajax para getStates.php e deve retorna um json de estados com os atributos id e short (usado para o nome curto do estado, por exemplo PR, SP, RJ, …)
Agora vamos criar o combo box de cidades:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | CITY_STORE = new Ext.data.JsonStore({ fields: [ {name: 'id', type: 'int'}, {name: 'name', type: 'string'} ], proxy: new Ext.data.HttpProxy({ url: 'getCities.php', method: 'GET' }) }); var city = new Ext.form.ComboBox({ store: CITY_STORE, displayField: 'name', fieldLabel: 'Cidade', name: 'city', anchor: '100%', emptyText: 'Selecione a cidade...', typeAhead: true, forceSelection: true, triggerAction: 'all', selectOnFocus: true }); |
Repare que o data store de cidades usa a variável global CITY_STORE, vamos precisar acessar esse data store dentro de algumas funções.
A ideia aqui é quando for selecionado o estado, armazenar o id selecionado e usar para fazer a requisição ajax para getCities.php, buscando somente pelas cidades de um determinado estado. Para fazer isso precisamos adicionar um listener na combo box de estados:
1 | state.addListener('select', onStateSelect); |
Agora crie a função onStateSelect:
1 2 3 4 5 | function onStateSelect(obj, record, index) { SELECTED_STATE = record.get('id'); CITY_STORE.removeAll(); CITY_STORE.load(); } |
No código acima usamos a variável global SELECTED_STATE para armazenar o id do estado selecionado, também limpamos o data store de cidades caso já tenha sido uma requisição é zerado o combo box de cidades e disparamos a requisição para preencher o combo box de cidades.
Mas só fazendo isso não vai funcionar, é necessário adicionar o parâmetro state_id na requisição ajax para obter as cidades, podemos fazer isso da seguinte forma, adicione o código:
1 2 3 4 | CITY_STORE.proxy.on('beforeload', function(proxy, params) { city.clearValue(); params.state_id = SELECTED_STATE; }); |
Antes de fazer a requisição ajax para as cidades, será adicionado o parâmetro state_id, usando um controle de eventos no Ext JS. Também limpo aqui o valor selecionado na combo box de cidades.
Bom, o Ext JS é fodinha mesmo, é meio complicado, a documentação é tão ampla que quebra as pernas. Ae você tem que balancear para ver até que ponto vale a pena usar ele. Uma coisa é verdade ele gera ótimas interfaces, mas toda essa sintaxe parece muito com o Swing do Java (coisa que eu não gosto em nada :-().
Esse exemplo é meio genérico, dá para usar tanto em combo box isolados ou com formulários em ext. Por isso você tem que fazer alguns ajustes para imprimir os combo boxs.

