View neighborhood according to City - CAKEPHP

2

I'm using cakephp in a real estate project, when I add a real estate the client selects the city, so I need to be listed the list of neighborhoods in this city ....

View / add:

    echo $this->Form->input('cidade', array('label' => 'Cidade', 'empty' => 'Selecione uma Cidade', 'options' => $Cidades));
    echo $this->Form->input('bairro', array('label' => 'Bairro', 'empty' => 'Selecione o Bairro', 'options' => array()));

Ajax calling the pagesController (where I get the neighborhoods of the city):

    $('#ImovelCidade').change(function(e) {
    $('#ImovelBairro').html($('<option />').val('').text('Carregando...'));
    $.getJSON(
        "<?php echo Router::url(array('controller' => 'pages', 'action' => 'pegarBairros')) ?>", 
        { "cidade" : $(this).val() }, 
        function (data) { 
            $('#ImovelBairro').html($('<option />').val('').text('Selecione'));
            $.each(data, function (chave, valor) {
                $('#ImovelBairro').append($('<option />').val(chave).text(valor));
            } );
        }
    );

PagesController:

     public function pegarBairros ($cidade = null) {
    $this->layout = 'json';
    $result = array();

    if (in_array($_REQUEST['cidade'], array_keys($this->cidade))) {
        $this->loadModel('Bairro');
        $bairros = $this->Bairro->find('list','fields' => array('id','bairro'), 'conditions' => array('cidade' => $this->cidade[$_REQUEST['cidade']]));
        foreach ($bairros as $id => $bairro) {
            if (!empty($bairro)){
                $result[$id] = $bairro;
                $arr = $result;
                json_encode($arr);
            }
     }
    } else $result[] = 'error';
    $this->set('data', $arr);
}

addController:

        public function add () {
            if ( !empty($this->request->data) ){ 
                    $data = $this->request->data;
                    if ($data['Imovel']['opcoes']) $data['Imovel']['opcoes'] = implode(';', $data['Imovel']['opcoes']);
                    $data['Imovel']['ativo'] = $data['Imovel']['ativoPeloAdm'] = 1;
                    $data['Imovel']['creator'] = $data['Imovel']['modifier'] = $this->Session->read('Auth.User.Imobiliaria.id');
                    if ($data['Imovel']['bairro']) {
                        $this->loadModel('Bairro');
                        $bairro = $this->Bairro->find('first', array('conditions' => array('id' => $data['Imovel']['bairro']), 'order' => array('bairro ASC')));
                        $data['Imovel']['bairroNome'] = $bairro['Bairro']['bairro'];
                    }

                    if ($data['Imovel']['cidade']) {
                        $cidade = $this->Cidade->find('first', array('conditions' => array('id' => $data['Imovel']['cidade'])));
                        $data['Imovel']['cidadeNome'] = $cidade['Cidade']['nome'];
                    }

                $data['Imovel']['especificacao'] = $data['Imovel']['imovel'];
                if ($this->Imovel->save($data)) $this->redirect(array('action' => 'index'));
            }
        }
    
asked by anonymous 27.02.2014 / 12:57

2 answers

2

Dude, I have a simpler solution. You'll have to change your code a little bit.

Throughout the code I put some comments to help you.

Come on:

Your view:

echo $this->Form->input('cidade', array('label' => 'Cidade', 'empty' => 'Selecione uma Cidade', 'options' => $Cidades));
echo $this->Form->input('bairro', array('label' => 'Bairro', 'empty' => 'Selecione o Bairro'); // retirei o array

Now the javascript

 $(document).ready(function() {
$('#ImovelBairro').hide()

        $("#ImovelCidade").change(function(){

            $.ajax({
                type: 'POST',
                data: { select: $('#ImovelCidade').val()},
                url: '/pages/pegarBairros', // CRIAREMOS ESSE ACTION MAIS ABAIXO; ESSE ENDEREÇO IRÁ VARIAR, AJUSTE CONFORME SUA ACTION

                success: function(data) {
                          //preenche o select de bairros com os dados que retornam do ajax.
                     $("#ImovelBairro").html(data).show();

                }
            });
        });
    });

Now, we create the action pegarBairros where it will receive the id of the city and will pick up the corresponding neighborhood

function pegarBairros() {

    if($this->request->is('ajax')) {

        $this->layout = 'ajax';
        $this->set('bairros',$this->Bairro->find('list','fields' => array('id','bairro'), 'conditions' => array('cidade' => $this->request->data['select']]));)))
 // $this->request->data['select'] é a cidade que vem do Ajax
        );
    }
}

Finally, we create the view of action pegarBairros to contain the options:

<option value="">Selecione</option>
<?php foreach($bairros as $bairro): ?>
<option value="<?php echo $bairro['Bairro']['id']; ?>"> <?php echo $filial['Bairro']['bairro']; ?></option>
<?php endforeach ?>

If you have any questions or do not work for some reason, just comment ...

    
28.02.2014 / 14:26
0

@Furlan,

Are you doing it in Php pure? ... if it is in Wordpress I have a good idea for you a simple and easy explanatory tutorial, it's a very good research form with me, I'm going to leave a link to a look.

link

    
25.07.2015 / 17:57