Grocery Crud PHP - caixa relacionada e dependente / combinação suspensa

Índice

Mencionamos em outro tutorial como iniciar o desenvolvimento com Grocerycrud para Codeigniter PHP, a seguir veremos como fazer vários caixa de combinação ou lista suspensa eles estão relacionados entre si e dependem uns dos outros.

Vejamos um exemplo completo com um Banco de Dados denominado Imóveis, a estrutura será a seguinte:

Estrutura da mesa para a mesa `imobiliário`

 CRIAR TABELA SE NÃO EXISTIR `real estate` (` propertyid` int (11) NOT NULL, `userid` int (11) DEFAULT NULL,` highdate` date DEFAULT '0000-00-00', `property id` int (6 ) PADRÃO '0', `preço` decimal (10,2) PADRÃO '0,00', texto da descrição,` idprovincia` int (10) PADRÃO NULL, `idlocalidade` int (10) PADRÃO NULL,` endereço` varchar ( 150) DEFAULT NULL, `foto` varchar (255) DEFAULT NULL,` available` enum ('Sim', 'Não') DEFAULT NULL) ENGINE = MyISAM AUTO_INCREMENT = 1 DEFAULT CHARSET = latin1; CRIAR TABELA SE NÃO EXISTIR `localidades` (` id da cidade` int (11) NÃO NULO, `localidade` varchar (200) DEFAULT NULL,` província id` int (11) DEFAULT '0') ENGINE = MyISAM AUTO_INCREMENT = 3604 DEFAULT CHARSET = utf8; CREATE TABLE IF NOT EXISTS `users` (` userid` int (11) NOT NULL, `name` varchar (150) NOT NULL DEFAULT '') ENGINE = MyISAM AUTO_INCREMENT = 161 DEFAULT CHARSET = latin1; CRIAR TABELA SE NÃO EXISTIR `propertytype` (` propertytypeid` int (6) NOT NULL, `propertytype` varchar (150) NOT NULL DEFAULT '') ENGINE = MyISAM AUTO_INCREMENT = 15 DEFAULT CHARSET = latin1; CRIAR TABELA SE NÃO EXISTIR `províncias` (` idprovince` int (11) NÃO NULO, `província` varchar (255) COLLATE latin1_spanish_ci PADRÃO NULL) ENGINE = MyISAM AUTO_INCREMENT = 32 PADRÃO CHARSET = latin1 COLLATE = latin1_spanish_ci; 
Podemos atuar por meio de phpmyadmin um diagrama de relacionamento que será o seguinte:

No tutorial anterior, vimos como instalar e configurar o Grocerycrud, aqui vamos criar o aplicativo, criamos o controlador Inmo.php

 carregar-> banco de dados (); $ this-> load-> helper ('url'); $ this-> load-> model ('grocery_crud_model'); $ this-> load-> library ('Grocery_CRUD'); } índice de função pública () {$ crud = new grocery_CRUD (); $ crud-> set_theme ('flexigrid'); $ crud-> set_table ('imóveis'); $ output = $ crud-> render (); $ this-> load-> view ('immolist', $ output); }}?> var13 -> 
Em seguida, criamos a visão que chamaremos Listainmo.php, os arquivos CSS e JQuery irão retirá-los da configuração do Grocery Crud portanto, nós apenas os listamos aqui:
 
O resultado ao executar a web em um navegador http: // localhost / pro… os / inmobi / Inmo /

Podemos ver que o id mostra números ao invés de dados isso porque as tabelas não estão relacionadas para relacioná-los faremos o seguinte, no controlador abaixo set_table iremos indicar.

 $ crud-> set_relation ('gorelating', 'tablerelating', 'showfield');
Como exemplo, quero mostrar o nome de usuário da tabela de usuários, com o ID do usuário da tabela de imóveis, então, terei que escrever o seguinte código:
 $ crud-> set_relation ('id do usuário', 'usuários', 'nome');
Como resultado da execução, veremos que, em vez de um número em ID do usuário nos mostra o nome.

A seguir listaremos os campos, províncias e localidades.

 $ crud-> set_relation ('id do tipo de propriedade', 'tipo de propriedade', 'tipo de propriedade'); $ crud-> set_relation ('província id', 'províncias', 'província'); $ crud-> set_relation ('localidade id', 'localidades', 'localidade'); 
Depois de executar, veremos o ir com sua respectiva relação:

No caso de imagens devemos usar

 $ crud-> set_field_upload (campo, 'imagepath');
Portanto, usaremos o mesmo diretório crud do Grocery para salvar as imagens
 $ crud-> set_field_upload ('foto', 'ativos / uploads / arquivos');
Embora possamos mostrar os campos e combos relacionados na lista, eles não são dependentes, queremos que ao selecionar uma província no combo de províncias, o combo de localidades seja ativado automaticamente e seja preenchido com as localidades daquela província, também queremos essa relação é mantida quando adicionamos uma propriedade ou quando a editamos.

Para tornar os combos dependentes, usaremos uma função de retorno de chamada. UMA ligue de volta o callback é uma alternativa ao polimorfismo, este foi um tópico que abordamos em outro tutorial para saber como implementar as classes:

Classes e polimorfismo com PHP

Onde uma função é atribuída como parâmetro, outra função, uma função de nível inferior. UMA ligue de volta ele pode atuar quando um registro é adicionado ou modificado. Este método permite uma ótima reutilização de código.

A instrução de um retorno de chamada pode ser a seguinte no controlador.

 $ crud-> callback_add_field ('callbackname', Array (parâmetros));
Neste caso, o retorno de chamada será idlocalidad e a função será cbklocalidades
 $ crud-> callback_add_field ('idlocalidad', array ($ this, 'cbklocalidades')); $ crud-> callback_edit_field ('idlocality', array ($ this, 'cbklocalities')); 
Em seguida, criamos a função cbklocations que será nosso retorno de chamada invocado quando adicionarmos ou editarmos um registro.
 // Callback que gera a função combo idlocalidades cbklocalidades () {// criamos o combo $ combo = ''; $ fincombo = ''; // Pegamos o id da propriedade se ele foi enviado como um parâmetro pela url $ idinmuebleurl = $ this-> uri-> segment (4); // Verificamos a operação que estamos fazendo se adicionarmos ou editarmos $ crud = new grocery_CRUD (); $ state = $ crud-> getState (); // Se estivermos editando e o id da propriedade não estiver vazio if (isset ($ idinmuebleurl) && $ state == "edit") {// consultamos a província e a localização atual da propriedade $ this-> db-> select ('idprovincia, idlocalidad') -> from ('propriedades') -> where ('idinmueble', $ idinmuebleurl); $ db = $ this-> db-> get (); $ linha = $ db-> linha (0); $ província id = $ row-> província id; $ idlocality = $ row-> idlocality; // Carregamos o combo com todas as localidades da província $ this-> db-> select ('*') -> from ('localities') -> where ('province id', $ province id); $ db = $ this-> db-> get (); // Se encontrarmos o id do local atual, o colocamos como selecionado // caso contrário, continuamos carregando os outros locais foreach ($ db-> result () como $ row): if ($ row-> idlocalidad == $ idlocalidad ) {$ combo. = 'idlocalidade.' "selected =" selected "> '. $ row-> locale.' ';} else {$ combo. =' idlocality. '">'. $ row-> locale. ' '; } endforeach; // Retornamos o combo carregado return $ combo. $ Fincombo; } else {return $ combo. $ fincombo; }} 
Em seguida, devemos criar a função de busca por locais, que é o que indicamos como uma função de consulta dentro do Callback:
 // Função de consulta de localidades searchlocalities () {// Eu tomo o id da província que foi enviado como um parâmetro por url ao selecionar // uma província do combo province id $ province id = $ this-> uri-> segment (3); // Eu consulto as localidades de acordo com a província selecionada $ this-> db-> select ("*") -> from ('localidades') -> where ('id da província', $ id da província); $ db = $ this-> db-> get (); // Eu atribuo a resposta sql a um array $ array = array (); foreach ($ db-> result () as $ row): $ array [] = array ("value" => $ row-> idlocality, "property" => $ row-> locality); endforeach; echo json_encode ($ array); saída; } 
Em seguida, teremos que criar a visão que processa os combos e adicionar as instruções jquery dinamicamente. Para isso, criaremos na pasta de visão um arquivo chamado dependente_combos.php.
 
Para terminar, vamos para a visão e adicionamos o seguinte código que relaciona a visão com o arquivo dependente_combos.php
 load-> view ('ependent_combos ', $ combo_setup); }?> var13 -> 

Então, se executarmos, podemos ver quando adicionamos uma nova propriedade ou quando editamos como os combos de província e localidades foram relacionados e localidades, depende da província.

Se quisermos fazer vários combos dependentes, teremos que fazer um ligue de volta para cada par de combos.

Suponha que temos países, províncias e localidades e queremos tornar os países dependentes com províncias e províncias com cidades, então devemos criar um callback para cada dependência, por exemplo:

 $ crud-> callback_add_field (id da província, array ($ this, 'cbk province')); $ crud-> callback_edit_field ('province id', array ($ this, 'cbk province')); $ crud-> callback_add_field ('idlocalidad', array ($ this, 'cbklocalidades')); $ crud-> callback_edit_field ('idlocality', array ($ this, 'cbklocalities')); 
Para a combinação de países, um ligue de volta por ser o primeiro na hierarquia não depende de outro combo.

Gostou e ajudou este tutorial?Você pode recompensar o autor pressionando este botão para dar a ele um ponto positivo

Você vai ajudar o desenvolvimento do site, compartilhando a página com seus amigos

wave wave wave wave wave