Băcănie Crud PHP - Combinat / drop-down înrudit și dependent

Cuprins

Am menționat într-un alt tutorial cum să începeți dezvoltarea Grocerycrud la Codeigniter PHP, în continuare vom vedea cum să facem mai multe casetă combinată sau listă derulantă sunt legate între ele și depind unele de altele.

Să vedem un exemplu complet cu o bază de date numită Imobiliare, structura va fi după cum urmează:

Structura tabelului pentru masă "imobiliare"

 CREAȚI TABELUL DACĂ NU EXISTĂ „real estate” („propertyid” int (11) NOT NULL, „userid” int (11) DEFAULT NULL, „highdate” data DEFAULT '0000-00-00', „property id” int (6 ) DEFAULT '0', 'price' decimal (10,2) DEFAULT '0.00', text 'description', `idprovincia` int (10) DEFAULT NULL,` idlocality` int (10) DEFAULT NULL, `address` varchar ( 150) DEFAULT NULL, `photo` varchar (255) DEFAULT NULL,„ disponibil` enum ('Da', 'Nu') DEFAULT NULL) MOTOR = MyISAM AUTO_INCREMENT = 1 DEFAULT CHARSET = latin1; CREAȚI TABELUL DACĂ NU EXISTĂ „localități” („city id” int (11) NOT NULL, „locality` varchar (200) DEFAULT NULL,„ province id` int (11) DEFAULT '0') MOTOR = MyISAM AUTO_INCREMENT = 3604 DEFAULT CHARSET = utf8; CREAȚI TABELUL DACĂ NU EXISTĂ „utilizatori” („userid” int (11) NOT NULL, „name` varchar (150) NOT NULL DEFAULT”)) MOTOR = MyISAM AUTO_INCREMENT = 161 DEFAULT CHARSET = latin1; CREAȚI TABELUL DACĂ NU EXISTĂ `propertytype` (` propertytypeid` int (6) NOT NULL, `propertytype` varchar (150) NOT NULL DEFAULT ') MOTOR = MyISAM AUTO_INCREMENT = 15 DEFAULT CHARSET = latin1; CREAȚI TABELUL DACĂ NU EXISTĂ `provinces` (` idprovince` int (11) NOT NULL, `province` varchar (255) COLLATE latin1_spanish_ci DEFAULT NULL) MOTOR = MyISAM AUTO_INCREMENT = 32 DEFAULT CHARSET = latin1 COLLATE = latin1_spanish_ci; 
Putem efectua prin phpmyadmin o diagramă de relații care va fi următoarea:

În tutorialul anterior am văzut cum se instalează și se configurează Grocerycrud, aici vom crea aplicația, vom crea controlerul Inmo.php

 load-> database (); $ this-> load-> helper ('url'); $ this-> load-> model ('grocery_crud_model'); $ this-> load-> library ('Grocery_CRUD'); } index funcție publică () {$ crud = new grocery_CRUD (); $ crud-> set_theme ('flexigrid'); $ crud-> set_table ('imobiliar'); $ output = $ crud-> render (); $ this-> load-> view ('imolist', $ output); }}?> var13 -> 
Apoi creăm vizualizarea pe care o vom apela Listainmo.php, fișierele CSS și JQuery le vor prelua din configurația Băcănie Crud prin urmare, le enumerăm doar aici:
 
Rezultatul la executarea webului într-un browser http: // localhost / pro … os / inmobi / Inmo /

Putem vedea că ID-ul arată numerele în loc de date, deoarece tabelele nu sunt legate de ele, vom face următoarele, în controlerul de mai jos set_table vom indica.

 $ crud-> set_relation ('gorelating', 'tablerelating', 'showfield');
De exemplu, vreau să arăt numele de utilizator al tabelului utilizator, cu ID-ul de utilizator din tabelul imobiliar, atunci va trebui să scriu următorul cod:
 $ crud-> set_relation ('userid', 'users', 'name');
Ca urmare a executării vom vedea că în schimb un număr în ID-ul de utilizator ne arată numele.

În continuare vom enumera domeniile, provincia și localitățile.

 $ crud-> set_relation ('propertytype id', 'propertytype', 'propertytype'); $ crud-> set_relation („ID-ul provinciei”, „provinciile”, „provincia”); $ crud-> set_relation ('locality id', 'localities', 'locality'); 
După executare vom vedea merge cu relația lor respectivă:

În cazul imaginilor trebuie să folosim

 $ crud-> set_field_upload (câmp, 'imagepath');
Așa că vom folosi același director de băcănie pentru a salva imagini
 $ crud-> set_field_upload ('fotografie', 'active / încărcări / fișiere');
Deși putem afișa câmpurile și combo-urile aferente în listă, acestea nu sunt dependente, dorim ca la selectarea unei provincii din combo-ul de provincie, combo-ul localități să fie activat automat și să fie completat cu localitățile din provincia respectivă, de asemenea, dorim relația respectivă se menține atunci când adăugăm o proprietate sau când o edităm.

Pentru a face combo-urile dependente vom folosi o funcție de apel invers. A sună din nou o callback este o alternativă la polimorfism, acesta a fost un subiect pe care l-am abordat într-un alt tutorial pentru a ști cum să implementăm clasele:

Cursuri și polimorfism cu PHP

În cazul în care unei funcții i se atribuie ca parametru o altă funcție, o funcție de nivel inferior. A sună din nou poate acționa atunci când se adaugă o înregistrare sau când este modificată. Această metodă permite reutilizarea excelentă a codului.

Declarația unui apel invers poate fi următoarea în controler.

 $ crud-> callback_add_field ('callbackname', Array (parametri));
În acest caz, apelarea va fi idlocalidad și funcția va fi cbklocalidades
 $ crud-> callback_add_field ('idlocalidad', matrice ($ this, 'cbklocalidades')); $ crud-> callback_edit_field ('idlocality', array ($ this, 'cbklocalities')); 
Apoi creăm funcția cbklocations care va fi apelul nostru invocat atunci când adăugăm sau edităm o înregistrare.
 // Callback care generează funcția combo idlocalidades cbklocalidades () {// creăm combo $ combo = ""; $ fincombo = "; // Luăm ID-ul proprietății dacă a fost trimis ca parametru de către url $ idinmuebleurl = $ this-> uri-> segment (4); // Verificăm operațiunea pe care o facem dacă adăugăm sau modificăm $ crud = new grocery_CRUD (); $ state = $ crud-> getState (); // Dacă edităm și ID-ul proprietății nu este gol dacă (isset ($ idinmuebleurl) && $ state == "edit") {// consultăm provincia și locația curentă a proprietății $ this-> db-> selectați ('idprovincia, idlocalidad') -> din ('properties') -> unde ('idinmueble', $ idinmuebleurl); $ db = $ this-> db-> get (); $ rând = $ db-> rând (0); $ provincia id = $ rând-> id provincie; $ idlocality = $ row-> idlocality; // Încărcăm combo-ul cu toate localitățile provinciei $ this-> db-> select ('*') -> din ('localities') -> where ('province id', $ province id); $ db = $ this-> db-> get (); // Dacă găsim id-ul locației curente îl punem așa cum este selectat // altfel continuăm să încărcăm celelalte locații pentru fiecare ($ db-> result () ca $ rând): if ($ rând-> idlocalidad == $ idlocalidad ) {$ combo. = 'idlocality.' "selected =" selected "> '. $ row-> locale.' ';} else {$ combo. =' idlocality. '">'. $ row-> locale. ' '; } endforeach; // Returnăm combo-ul încărcat returnează $ combo. $ Fincombo; } else {return $ combo. $ fincombo; }} 
Apoi, trebuie să creăm funcția de căutare pentru locații, ceea ce indicăm ca funcție de interogare în Callback:
 // Interogare localizare funcție searchlocalities () {// Iau ID-ul provinciei care a fost trimis ca parametru prin URL când selectez // o provincie din combo provincia id $ province id = $ this-> uri-> segment (3); // Consult localitățile în funcție de provincia selectată $ this-> db-> select ("*") -> from ('localities') -> where ('province id', $ province id); $ db = $ this-> db-> get (); // Aloc răspunsul sql unui tablou $ array = array (); foreach ($ db-> result () ca $ rând): $ array [] = array ("valoare" => $ rând-> idlocalitate, "proprietate" => $ rând-> localitate); endforeach; echo json_encode ($ array); Ieșire; } 
Apoi va trebui să creăm vizualizarea care procesează combo-urile și să adăugăm dinamic instrucțiunile jQuery. Pentru aceasta vom crea în dosarul vizualizare un fișier numit dependent_combos.php.
 
Pentru a termina, mergem la vizualizare și adăugăm următorul cod care leagă vizualizarea cu fișierul dependent_combos.php
 load-> view ('dependent_combos', $ combo_setup); }?> var13 -> 

Apoi, dacă executăm, putem vedea atât când adăugăm o proprietate nouă, fie când modificăm cum au fost corelate provinciile și localitățile și localitățile, depinde de provincie.

Dacă vrem să facem mai multe combinații dependente, va trebui să facem un sună din nou pentru fiecare pereche de combo-uri.

Să presupunem că avem țări, provincii și localități și vrem să facem țări dependente cu provincie și provincii cu orașe, atunci trebuie să creăm un apel invers pentru fiecare dependență, de exemplu:

 $ crud-> callback_add_field (ID provincie, matrice ($ this, 'cbk province')); $ crud-> callback_edit_field ('ID de provincie', matrice ($ this, 'cbk province')); $ crud-> callback_add_field ('idlocalidad', matrice ($ this, 'cbklocalidades')); $ crud-> callback_edit_field ('idlocality', array ($ this, 'cbklocalities')); 
Pentru combo-ul țărilor, a sună din nou deoarece este primul din ierarhie nu depinde de o altă combinație.

V-a plăcut și ați ajutat acest tutorial?Puteți recompensa autorul apăsând acest buton pentru a-i oferi un punct pozitiv
wave wave wave wave wave