Droplist

47 views
Skip to first unread message

mamoud...@gmail.com

unread,
Oct 28, 2015, 4:59:26 AM10/28/15
to ZnetDK
Bonjour Michel

je vois qu'il y a déjà une question sur les droplist mais c'est en Espagnol (que je ne comprends). J'aimerai remplir une droplist à partir des données d'une table. J'ai les deux tables suivantes :
CREATE TABLE IF NOT EXISTS `gesecole`.`tbl_niveaux` (
  `id` INT NOT NULL AUTO_INCREMENT,
  `LIBELLE_NIVEAU` VARCHAR(50) NULL,
  `DESCRIPTION` VARCHAR(255) NULL,
  `STATUT` VARCHAR(15) NULL,
  PRIMARY KEY (`id`))
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8;


CREATE TABLE IF NOT EXISTS `gesecole`.`tbl_classe` (
  `id` INT NOT NULL AUTO_INCREMENT,
  `ID_NIVEAU` INT NULL,
  `LIBELLE_CLASSE` VARCHAR(150) NULL,
  `STATUT` VARCHAR(15) NULL DEFAULT 'ACTIF',
  PRIMARY KEY (`id`),
  INDEX `FK_NIVEAU_idx` (`ID_NIVEAU` ASC),
  CONSTRAINT `FK_NIVEAU`
    FOREIGN KEY (`ID_NIVEAU`)
    REFERENCES `gesecole`.`tbl_niveaux` (`id`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8;

L'identifiant de la table niveaux est une clé étrangère dans la table des classes. Dans le formulaire de saisie/modification des classes, j'aimerai ajouter une liste déroulante qui sera remplie avec les libellés des niveaux. Ensuite à l'enregistrement, l'id du niveau correspondant sera inserée dans la table des classes

Pascal Martinez

unread,
Oct 28, 2015, 6:33:07 PM10/28/15
to ZnetDK
Bonjour,

Pour charger le contenu d'une dropdown à partir de la table tbl_niveaux, vous devez :

1. créer la classe DAO d'accès à la tbl_niveaux et retournant les valeurs des colonnes id et libelle_niveau,
 
2. créer une action de contrôleur interrogeant le DAO pour construire la réponse au format JSON contenant l'identifiant (clé du tableau 'value') et le libellé (clé du tableau 'label') des niveaux à charger dans la dropdown.

static protected function action_niveaux() {
        $response = new \Response();
        $niveauxDAO = new \app\model\Niveaux();
           $niveaux = array();
        try {
            while ($row = $niveauxDAO->getResult()) {
                $niveaux[] = array(
                   'label' => $row['libelle_niveau'],
                   'value' => $row['id']);
            }
                     $response->rows = $niveaux;
            $response->success = TRUE;
        } catch (PDOException $e) {
            $response = new \Response();
            $response->setCriticalMessage("Selection des niveaux impossible!", $e, TRUE);
        }
        return $response;
}

3. dans le formulaire d'enregistrement des données de la table tbl_classe, préciser pour la dropdown
 le contrôleur et l'action à appeler pour charger les niveaux (attribut data-zdk-action). L'attribut HTML name doit prendre la valeur "id_niveau".
 
        <label>Niveau</label>
       
<select class="zdk-dropdown" name="id_niveau"
               
data-zdk-action="moncontroleur:niveaux"
               
data-zdk-noselection="Choisir un niveau...">
       
</select>

 
A l'appel de l'action de contrôleur en charge d'enregistrer les infos du formulaire (par exemple l'action enregistrer), au clic du bouton "Enregistrer" (de type "submit"), l'identifiant du niveau sélectionné dans la dropdown est automatiquement transmis dans la variable POST nommée id_niveau.
Il n'y a rien de spécial à faire si ce n'est que de transmettre sa valeur à l'appel de la fonction store() du DAO de la table tbl_classe, au même titre que pour les autres valeurs saisies dans formulaire.

En espérant vous avoir débloqué.

Pascal MARTINEZ
  
 

mamoud...@gmail.com

unread,
Oct 29, 2015, 8:58:40 PM10/29/15
to ZnetDK
Bonjour Michel

merci beaucoup. C'est top.

Dans la liste des classes il m'affiche le libelle de la classe et l'id du niveau. Si je veux afficher plutôt le libellé du niveau, comment je fais ?

Pascal Martinez

unread,
Oct 31, 2015, 4:40:21 AM10/31/15
to ZnetDK
Bonjour,

Pour afficher le libellé du niveau dans le datatable d'affichage des classes, le DAO de la table tbl_classe peut être étendu pour également retourner le libellé du niveau.
Par exemple :

namespace app\model;
class ClassesDAO extends \DAO {
   
protected function initDaoProperties() {
       $this
->table = "tbl_classe";
       $this
->query = "select tbl_classe.*, tbl_niveaux.libelle_niveau "
       $this
->query .= "from tbl_classe ";
       $this
->query .= "left join tbl_niveaux on tbl_classe.id_niveau = tbl_niveaux.id";
   
}
}


Ajouter ensuite dans le datatable la description de la colonne (attribut data-zdk-columns) correspondant au libellé de niveau, en prenant soin d'attribuer la valeur libelle_niveau à la propriété "field".

Par exemple :

                                              ...},
{"field":"libelle_niveau", "headerText": "Niveau"},
{"field":...


Ca devrait fonctionner...

Pascal MARTINEZ

mamoud...@gmail.com

unread,
Nov 3, 2015, 11:35:09 AM11/3/15
to ZnetDK
Bonjour

j'ai essayé, mais en cliquant sur le menu Classes pour afficher la liste des classes j'ai l'erreur 
Recherche

Impossible de trouver La classe (erreur '23000')

Pascal Martinez

unread,
Nov 3, 2015, 4:47:20 PM11/3/15
to ZnetDK
Bonjour,

Consultez le détail de l'erreur enregistré dans le fichier ../znetdk/engine/log/errors.log pour diagnostiquer l'erreur.

Certainement une erreur de syntaxe dans la requête SQL déclarée dans le DAO...
Vous pouvez également exécuter la requête SQL déclarée dans le DAO, directement dans PHPMyAdmin pour vérifier qu'elle est en effet correcte.

Cordialement,

Pascal MARTINEZ

mamoud...@gmail.com

unread,
Nov 4, 2015, 3:51:06 AM11/4/15
to ZnetDK
Bonjour Pascal

et vraiment, merci pour ta disponibilité. J'ai pu identifier l'erreur dans les logs et je l'ai corrigée. Cependant, dans la table d'affichage, le niveau n'est pas visible.

MON DAO :
<?php

namespace app\model;

class ClassesDAO extends \DAO {

    protected function initDaoProperties() {
        $this->table = "tbl_classe";
        $this->query = "select tbl_classe.*, tbl_niveaux.libelle_niveau from tbl_classe left join tbl_niveaux on tbl_classe.id_niveau = tbl_niveaux.id";
        $this->filterClause = " WHERE LOWER(tbl_classe.id) LIKE LOWER(?)"
                . " OR LOWER(ID_NIVEAU) LIKE LOWER(?)"
                . " OR LOWER(LIBELLE_CLASSE) LIKE LOWER(?)";
    }

    public function setNameAsFilter($name) {
        $this->filterClause = " WHERE LOWER(LIBELLE_CLASSE) LIKE LOWER(?)";
        $this->setFilterCriteria($name);
    }

}

MA DATATABLE DANS LA VUE
<!-- Datatable -->
<div id="classes-table" class="zdk-datatable zdk-synchronize" title="classes" data-zdk-action="classesctrl:data"
     data-zdk-paginator="10" data-zdk-columns='[
     {"field":"LIBELLE_CLASSE", "headerText": "Classe", "sortable":true},
     {"field":"LIBELLE_NIVEAU", "headerText": "Niveau", "sortable":true}]'>
</div>

Pascal Martinez

unread,
Nov 5, 2015, 3:43:06 PM11/5/15
to ZnetDK
Bonsoir,

Réécrivez en minuscule les valeurs de l'attribut "field" dans la description des colonnes du datatable :

<!-- Datatable -->
<div id="classes-table" class="zdk-datatable zdk-synchronize" title="classes" data-zdk-action="classesctrl:data"
    data-zdk-paginator="10" data-zdk-columns='[
    {"field":"libelle_classe", "headerText": "Classe", "sortable":true},
    {"field":"libelle_niveau", "headerText": "Niveau", "sortable":true}]'>
</div>

 Ca devrait aller beaucoup mieux...

Pascal MARTINEZ

mamoud...@gmail.com

unread,
Nov 6, 2015, 2:53:39 PM11/6/15
to ZnetDK
super. merci beaucoup
Reply all
Reply to author
Forward
0 new messages