Personnaliser les listes déroulantes
Modifier les labels à la volée
Dans les plugins databasejoin ou dropdown l'onglet Advanced permet d'accéder aux valeurs (value
) et aux textes (text
) de la liste affichée, cela en utilisant la variable $opt
(pour option).
Ainsi on peut corriger certaines des options affichées sans toucher aux valeurs réelles de la base de données. Pratique quand la base qui fournit la liste utilise des caractères un peu spéciaux, qu'on ne peut pas traiter correctement (en cas de multi-sites par exemple).
if ($opt->text == "Company's Medical Staff"): $opt->text = "Company's Medical Staff" ; elseif ($opt->text == "Maître d'Hôtel/Head Waiter"): $opt->text = "Maître d'Hôtel/Head Waiter" ; endif;
Trier les valeurs d'une liste déroulante selon l'utilisateur connecté
Le plugin databasejoin est bien pratique. Et bien il peut l'être encore plus ! Par exemple dans l'option Data - Where, vous pouvez restreindre les enregistrements proposés à ceux créés par un unique utilisateur (celui connecté) :
WHERE user_submit = {$my->id}
Imaginez alors que vous souhaitiez aider l'utilisateur dans sa saisie, en pré-remplissant le formulaire avec l'éventuel unique enregistrement saisi par cet utilisateur.
En effet si celui-ci n'a qu'une seule entrée dans sa liste, autant la lui proposer par défaut :
$db = FabrikWorker::getDbo(false, 1) ; $db->setQuery('SELECT id FROM scientific_societies WHERE user_submit = {$my->id}') ; $rows = $db->loadObjectList() ; if (intval(count($rows)) == 1 ) { foreach ($rows as $key => $value) { return $value->id; } }
Voir aussi la rubrique Divers pour pré-remplir des champs, dont des listes déroulantes, en fonction de là d'où l'on vient (le formulaire précédent).
Trier les valeurs d'une liste déroulante selon plusieurs tests
Un autre exemple plus complexe où nous effectuons différents tests avant de choisir quel liste déroulante afficher :
Avec le plugin dropdown cette fois, pour plus de liberté. Nous affichons des profils humains (une table customer). Pour chaque fiche nous souhaitons rendre disponibles à la saisie certains métiers SI l'enregistrement questionné appartient à une catégorie de métiers (information stockée dans la table customer, champ degree) ET SI l'enregistrement est lié à un organisme distinct (information stockée dans une autre table customer_organisme, champ id_organisme).
Les métiers devant peupler la liste déroulante sont eux-mêmes dans une 3ème table specialities, avec un champ permettant de distinguer 3 listes de métiers (role).
Nous commençons par faire deux tests basés sur le résultat d'une requête avec jointure (afin de ramener les information des 2 tables ici impliquées dans les profils). Ensuite nous créons les 3 listes déroulantes distinctes. Enfin, nous affichons la liste voulue en fonction des résultats des tests.
Attention suivez bien ! Dans l'onglet Advanced/Eval populate du plugin dropdown :
// Déclaration de l'id de l'enregistrement à tester $my_id = '{customer___id_customer}'; // Test 1 de l'existence de l'enregistrement dans les id à distinguer $db_test_organisme_vcs_md_do = FabrikWorker::getDbo(false, 5) ; $db_test_organisme_vcs_md_do->setQuery('SELECT customer.id_customer FROM customer INNER JOIN customer_organisme ON customer.id_customer = customer_organisme.id_customer AND id_organisme = 6 WHERE customer.degree IN ("MD", "DO") AND customer.id_customer = ' . $db_test_organisme_vcs_md_do->quote($my_id) ) ; $rows_test_organisme_vcs_md_do = $db_test_organisme_vcs_md_do->loadObjectList() ; // Test 2 de l'existence de l'enregistrement dans les id à distinguer $db_test_organisme_vcs_nonmd = FabrikWorker::getDbo(false, 5) ; $db_test_organisme_vcs_nonmd->setQuery('SELECT customer.id_customer FROM customer INNER JOIN customer_organisme ON customer.id_customer = customer_organisme.id_customer AND id_organisme = 6 WHERE customer.degree LIKE "Non-MD" AND customer.id_customer = ' . $db_test_organisme_vcs_nonmd->quote($my_id) ) ; $rows_test_organisme_vcs_nonmd = $db_test_organisme_vcs_nonmd->loadObjectList() ; // Test 3 de l'existence de l'enregistrement dans les id à distinguer $db_test_organisme_vcs_vide = FabrikWorker::getDbo(false, 5) ; $db_test_organisme_vcs_vide->setQuery('SELECT customer.id_customer FROM customer INNER JOIN customer_organisme ON customer.id_customer = customer_organisme.id_customer AND id_organisme = 6 WHERE customer.degree LIKE "" AND customer.id_customer = ' . $db_test_organisme_vcs_nonmd->quote($my_id) ) ; $rows_test_organisme_vcs_vide = $db_test_organisme_vcs_vide->loadObjectList() ; // Création de la liste déroulante en cas de tests 1, 2 et 3 négatifs $db_emc = FabrikWorker::getDbo(false, 5) ; $db_emc->setQuery('SELECT distinct speciality FROM specialities WHERE role = 1') ; $rows_emc = $db_emc->loadObjectList() ; // Création d'une autre liste déroulante restreinte si le test 1 est positif $db_vcs1 = FabrikWorker::getDbo(false, 5) ; $db_vcs1->setQuery('SELECT id_specialities, speciality FROM specialities WHERE role = 2') ; $rows_vcs1 = $db_vcs1->loadObjectList() ; // Création d'une autre liste déroulante restreinte si le test 2 est positif $db_vcs2 = FabrikWorker::getDbo(false, 5) ; $db_vcs2->setQuery('SELECT id_specialities, speciality FROM specialities WHERE role = 3') ; $rows_vcs2 = $db_vcs2->loadObjectList() ; // Création d'une autre liste déroulante restreinte si le test 3 est positif $db_vcs3 = FabrikWorker::getDbo(false, 5) ; $db_vcs3->setQuery('SELECT id_specialities, speciality FROM specialities WHERE role IN (2,3,4)') ; $rows_vcs3 = $db_vcs3->loadObjectList() ; // Affichage de la liste déroulante restreinte en cas de test 1 positif if (!empty($rows_test_organisme_vcs_md_do)) { foreach ($rows_vcs1 as $row) { $options_vcs1[] = JHTML::_('select.option', $row->speciality, $row->speciality) ; } return $options_vcs1 ; } // Affichage de la liste déroulante restreinte en cas de test 2 positif if (!empty($rows_test_organisme_vcs_nonmd)) { foreach ($rows_vcs2 as $row) { $options_vcs2[] = JHTML::_('select.option', $row->speciality, $row->speciality) ; } return $options_vcs2 ; } // Affichage de la liste déroulante restreinte en cas de test 3 positif if (!empty($rows_test_organisme_vcs_vide)) { foreach ($rows_vcs3 as $row) { $options_vcs3[] = JHTML::_('select.option', $row->speciality, $row->speciality) ; } return $options_vcs3 ; } // Affichage de la liste déroulante en cas de test négatif else { foreach ($rows_emc as $row) { $options_emc[] = JHTML::_('select.option', $row->speciality, $row->speciality) ; } return $options_emc ; }