Épicerie Crud PHP - Boîte associée et dépendante / Combo déroulant

Table des matières

Nous avions mentionné dans un autre tutoriel comment démarrer le développement avec Épicerie à Codeigniter PHP, nous verrons ensuite comment faire plusieurs zone de liste déroulante ou liste déroulante ils sont liés les uns aux autres et dépendent les uns des autres.

Voyons un exemple complet avec une base de données appelée Real Estate, la structure sera la suivante :

Structure de table pour la table « immobilier »

 CREATE TABLE IF NOT EXISTS `real estate` (` propertyid` int (11) NOT NULL, `userid` int (11) DEFAULT NULL,` highdate` date DEFAULT '0000-00-00', `property id` int (6 ) DEFAULT '0', 'price' décimal (10,2) DEFAULT '0.00', 'description' text, 'idprovincia' int (10) DEFAULT NULL,` idlocality` int (10) DEFAULT NULL, `address` varchar ( 150) DEFAULT NULL, `photo` varchar (255) DEFAULT NULL,` available` enum ('Yes', 'No') DEFAULT NULL) ENGINE = MyISAM AUTO_INCREMENT = 1 DEFAULT CHARSET = latin1; CREATE TABLE IF NOT EXISTS `localities` (` city id` int (11) NOT NULL, `locality` varchar (200) DEFAULT NULL,` province 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; CREATE TABLE IF NOT EXIST `propertytype` (` propertytypeid` int (6) NOT NULL, `propertytype` varchar (150) NOT NULL DEFAULT '') ENGINE = MyISAM AUTO_INCREMENT = 15 DEFAULT CHARSET = latin1; CREATE TABLE IF NOT EXISTS `provinces` (` idprovince` int (11) NOT NULL, `province` varchar (255) COLLATE latin1_spanish_ci DEFAULT NULL) ENGINE = MyISAM AUTO_INCREMENT = 32 DEFAULT CHARSET = latin1 COLLATE = latin1_spanish_ci; 
Nous pouvons effectuer à travers phpmyadmin un diagramme de relations qui sera le suivant :

Dans le tutoriel précédent, nous avons vu comment installer et configurer Grocerycrud, ici nous allons créer l'application, nous créons le contrôleur Inmo.php

 charger-> base de données (); $ this-> load-> helper ('url'); $ this-> load-> model ('grocery_crud_model'); $ this-> load-> library ('Grocery_CRUD'); } index de fonction publique () {$ crud = new epicerie_CRUD (); $ crud-> set_theme ('flexigrid'); $ crud-> set_table ('immobilier'); $ output = $ crud-> render (); $ this-> load-> view ('immolist', $ output); }} ?> var13 -> 
Ensuite, nous créons la vue que nous appellerons Listinmo.php, les fichiers CSS et JQuery les reprendront de la configuration de Crud d'épicerie c'est pourquoi nous ne les listons ici que :
 
Le résultat lors de l'exécution du web dans un navigateur http: // localhost / pro… os / inmobi / Inmo /

Nous pouvons voir que l'identifiant affiche des nombres au lieu de données, c'est parce que les tables ne sont pas liées pour les relier, nous allons procéder comme suit, dans le contrôleur ci-dessous set_table, nous indiquerons.

 $ crud-> set_relation ('gorelating', 'tablerelating', 'showfield');
À titre d'exemple, je veux montrer le nom d'utilisateur de la table utilisateur, avec le Identifiant d'utilisateur de la table de l'immobilier alors je vais devoir écrire le code suivant :
 $ crud-> set_relation ('userid', 'users', 'name');
À la suite de l'exécution, nous verrons qu'à la place un nombre dans identifiant d'utilisateur nous montre le nom.

Ensuite, nous allons lister les champs, la province et les localités.

 $ crud-> set_relation ('ID de type de propriété', 'type de propriété', 'type de propriété'); $ crud-> set_relation ('province id', 'provinces', 'province'); $ crud-> set_relation ('locality id', 'localities', 'locality'); 
Après l'exécution, nous verrons le aller avec leur relation respective :

Dans le cas des images, nous devons utiliser

 $ crud-> set_field_upload (champ, 'imagepath');
Nous utiliserons donc le même répertoire Grocery crud pour enregistrer les images
 $ crud-> set_field_upload ('photo', 'assets / uploads / files');
Bien que nous puissions afficher les champs et les combos liés dans la liste, ils ne sont pas dépendants, nous voulons que lors de la sélection d'une province dans le combo de province, le combo de localités soit activé automatiquement et qu'il soit rempli avec les localités de cette province, nous voulons également cette relation est maintenue lorsque nous ajoutons une propriété ou lorsque nous la modifions.

Pour rendre les combos dépendants, nous utiliserons une fonction de rappel. UNE rappeler o callback est une alternative au polymorphisme, c'était un sujet que nous avons abordé dans un autre tutoriel pour savoir comment implémenter les classes :

Classes et polymorphisme avec PHP

Lorsqu'une fonction est affectée en tant que paramètre à une autre fonction, une fonction de niveau inférieur. UNE rappeler il peut agir lorsqu'un enregistrement est ajouté ou lorsqu'il est modifié. Cette méthode permet une grande réutilisation du code.

L'instruction d'un rappel peut être la suivante dans le contrôleur.

 $ crud-> callback_add_field ('callbackname', Array (paramètres));
Dans ce cas, le rappel sera idlocalidad et la fonction sera cbklocalidades
 $ crud-> callback_add_field ('idlocalidad', array ($ this, 'cbklocalidades')); $ crud-> callback_edit_field ('idlocality', array ($ this, 'cbklocalities')); 
Ensuite, nous créons la fonction cbklocations qui sera notre rappel invoqué lorsque nous ajoutons ou modifions un enregistrement.
 // Callback qui génère le combo idlocalidades function cbklocalidades () {// nous créons le combo $ combo = ''; $ fincombo = ''; // On prend la propriété id si elle a été envoyée en paramètre par url $ idinmuebleurl = $ this-> uri-> segment (4); // Nous vérifions l'opération que nous faisons si nous ajoutons ou éditons $ crud = new epicerie_CRUD (); $ état = $ crud-> getState (); // Si on édite et que l'id de la propriété n'est pas vide if (isset ($ idinmuebleurl) && $ state == "edit") {// on consulte la province et l'emplacement actuel de la propriété $ this-> db-> select ( 'idprovincia, idlocalidad') -> from ('properties') -> où ('idinmueble', $ idinmuebleurl); $ db = $ this-> db-> get (); $ ligne = $ db-> ligne (0); $ id de la province = $ ligne -> id de la province ; $ idlocality = $ row-> idlocality; // On charge le combo avec toutes les localités de la province $ this-> db-> select ('*') -> from ('localities') -> where ('province id', $ province id); $ db = $ this-> db-> get (); // Si nous trouvons l'identifiant de l'emplacement actuel, nous le mettons comme sélectionné // sinon nous continuons à charger les autres emplacements foreach ($ db-> result () as $ row): if ($ row-> idlocalidad == $ idlocalidad ) {$ combo . = 'idlocality.' "selected =" selected "> '. $ row-> locale.' ';} else {$ combo. =' idlocality. '">'. $ row-> locale. ' '; } endforeach; // On retourne le combo chargé return $ combo. } else {retourner $ combo. $ fincombo; }} 
Ensuite, nous devons créer la fonction de recherche d'emplacements, ce que nous indiquons comme fonction de requête dans le Callback :
 // Requête des localités fonction searchlocalities () {// Je prends l'identifiant de la province qui a été envoyé en paramètre par url lors de la sélection // d'une province dans le combo id province $ id province = $ this-> uri-> segment (3); // Je consulte les localités selon la province sélectionnée $ this-> db-> select ("*") -> from ('localities') -> where ('province id', $ province id); $ db = $ this-> db-> get (); // J'affecte la réponse SQL à un tableau $ array = array (); foreach ($ db-> result () as $ row): $ array [] = array ("value" => $ row-> idlocality, "property" => $ row-> locality); finforeach; echo json_encode (tableau $); sortir; } 
Ensuite, nous devrons créer la vue qui traite les combos et ajouter dynamiquement les instructions jquery.Pour cela, nous allons créer dans le dossier de la vue un fichier appelé combos_dépendants.php.
 
Pour finir, nous allons à la vue et ajoutons le code suivant qui relie la vue au fichier combos_dépendants.php
 load-> view ('dependent_combos', $ combo_setup); }?> var13 -> 

Ensuite, si nous exécutons, nous pouvons voir à la fois lorsque nous ajoutons une nouvelle propriété ou lorsque nous éditons comment les combos de province et de localités ont été liés et les localités, cela dépend de la province.

Si nous voulons faire plusieurs combos dépendants nous devrons faire un rappeler pour chaque paire de combos.

Supposons que nous ayons des pays, des provinces et des localités et que nous voulions rendre les pays dépendants avec la province et les provinces avec les villes, alors nous devons créer un rappel pour chaque dépendance par exemple :

 $ crud-> callback_add_field (identifiant de province, tableau ($ 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')); 
Pour le combo pays, un rappeler étant le premier dans la hiérarchie, il ne dépend pas d'un autre combo.

Avez-vous aimé et aidé ce tutoriel ?Vous pouvez récompenser l'auteur en appuyant sur ce bouton pour lui donner un point positif
wave wave wave wave wave