PEAR logo

HTML_QuickForm_advmultiselect : La Référence



Chapitre 2. FAQ - Foire Aux Questions

2.1. Questions générales
2.1.1. Combien cela coute ?
2.1.2. Est-ce que vous offrez un support technique ?
2.1.3. J'ai trouvé un bogue, que dois je faire ?
2.1.4. Qu'est-ce que HTML_QuickForm ?
2.1.5. Qu'est-ce que PEAR ?
2.2. Comment faire
2.2.1. Puis je utiliser HTML_QuickForm_advmultiselect si mon navigateur ne supporte pas javascript ou si celui-ci est désactivé ?
2.2.2. Comment effectuer la validation d'un élément HTML_QuickForm_advmultiselect ?
2.2.3. Comment optimiser l'usage du code javascript dans les pages html ?
2.3. Guide de dépannage
2.3.1. Mon élément Quickform advmultiselect n'apparait pas à l'écran de mon navigateur.
2.3.2. Mon compteur dynamique n'est pas mis à jour quand je clique sur les cases à coché des éléments sélectionnable ?
2.3.3. La liste de sélection a une option (ligne) à blanc que l'on peut déplacer.

2.1. Questions générales

2.1.1. Combien cela coute ?
2.1.2. Est-ce que vous offrez un support technique ?
2.1.3. J'ai trouvé un bogue, que dois je faire ?
2.1.4. Qu'est-ce que HTML_QuickForm ?
2.1.5. Qu'est-ce que PEAR ?
2.1.1.

Combien cela coute ?

Vous pouvez télécharger et utiliser ce paquetage gratuitement. Mais surtout ne supprimer pas les termes de la license et les noms de ceux qui ont contribués à son existance. Vous pouvez lire les termes (en anglais) de la license

2.1.2.

Est-ce que vous offrez un support technique ?

OUI, mais seulement si la réponse n'est pas déjà dans ce guide et si vous êtes prêt à partager certaines informations comme : votre configuration (plateforme Win *nix mac, PHP version, paquetages PEAR installés) et peut être le code source de votre implémentation .

2.1.3.

J'ai trouvé un bogue, que dois je faire ?

Vous pouvez créer un rapport avec l'outils de suivi des erreurs sur le site de PEAR.

2.1.4.

Qu'est-ce que HTML_QuickForm ?

HTML_QuickForm est un paquetage de PEAR qui fournit des méthodes pour créer, valider et traiter des formulaires HTML.

Le but du tutoriel de Keith Edmunds est de donner, aux nouveaux utilisateurs de QuickForm, un aperçu des caractéristiques et des modèles d'utilisation à suivre. Il décrit un petit échantillon des fonctions disponibles.

N'oubliez pas de lire aussi le manuel de PEAR, relatif au sujet HTML_QuickForm.

2.1.5.

Qu'est-ce que PEAR ?

PEAR (abbréviation de PHP Extension and Application Repository) est un cadre de développement et de distribution structuré de code source libre pour les utilisateurs de PHP.

N'oubliez pas de lire aussi le manuel de PEAR et sa Foire Aux Questions.

2.2. Comment faire

2.2.1. Puis je utiliser HTML_QuickForm_advmultiselect si mon navigateur ne supporte pas javascript ou si celui-ci est désactivé ?
2.2.2. Comment effectuer la validation d'un élément HTML_QuickForm_advmultiselect ?
2.2.3. Comment optimiser l'usage du code javascript dans les pages html ?
2.2.1.

Puis je utiliser HTML_QuickForm_advmultiselect si mon navigateur ne supporte pas javascript ou si celui-ci est désactivé ?

La représentation sous forme de deux listes ne fonctionnera pas, mais vous pouvez afficher le modèle avec une seule liste constituée de case à cocher. Pour cela, vous devez retirer le marquage {unselected} dans le template de l'élément advmultiselect.

2.2.2.

Comment effectuer la validation d'un élément HTML_QuickForm_advmultiselect ?

Vous devez utiliser la méthode HTML_QuickForm addGroupRule() plutôt que la méthode HTML_QuickForm addRule() . Voir l'exemple sur utilisation avec un moteur de gabarit.

2.2.3.

Comment optimiser l'usage du code javascript dans les pages html ?

[Attention] Attention
Les réponses suivantes ne sont appliquables que pour HTML_QuickForm_advmultiselect version 1.3.0 or supérieur.

Si vous avez plus d'un élément advmultiselect dans vos pages html, alors utiliser une seule référence du code javascript et supprimer les autres.

  1. <script type="text/javascript">
  2. <?php
  3. echo $ams1->getElementJs();    // keep one
  4.  
  5. //echo $ams2->getElementJs();  // remove others
  6. ?>
  7. </script>

Une meilleure solution serait d'utiliser un lien vers une ressource externe et ainsi reduire le code javascript embarqué. Ajoutez la ligne de code suivante entre les balises <head> de vos pages html.

      
<script type="text/javascript" src="qfamsHandler.js"></script>
      
     
[Note] Note
Adaptez si besoin le chemin d'accès à la ressource javascript qfamsHandler.js fichier qui peut être trouvé dans le répertoire PEAR/data/HTML_QuickForm_advmultiselect.

Enfin supprimez le marqueur {javascript} si vous utilisez le gabarit par défaut. Celui-ci sera remplacé par la définition $deftpl suivante :

  1. <?php
  2. require_once 'HTML/QuickForm.php';
  3. require_once 'HTML/QuickForm/advmultiselect.php';
  4. $form = new HTML_QuickForm('ams130');
  5. // ....
  6. $ams =& $form->addElement('advmultiselect', 'cars', null, $car_array);
  7. $deftpl = '
  8. <table{class}>
  9. <!-- BEGIN label_2 --><tr><th>{label_2}</th><!-- END label_2 -->
  10. <!-- BEGIN label_3 --><th>&nbsp;</th><th>{label_3}</th></tr><!-- END label_3 -->
  11. <tr>
  12. <td valign="top">{unselected}</td>
  13. <td align="center">{add}{remove}</td>
  14. <td valign="top">{selected}</td>
  15. </tr>
  16. </table>
  17. ';
  18. $ams->setElementTemplate($deftpl);
  19. //...
  20. ?>

2.3. Guide de dépannage

2.3.1. Mon élément Quickform advmultiselect n'apparait pas à l'écran de mon navigateur.
2.3.2. Mon compteur dynamique n'est pas mis à jour quand je clique sur les cases à coché des éléments sélectionnable ?
2.3.3. La liste de sélection a une option (ligne) à blanc que l'on peut déplacer.
2.3.1.

Mon élément Quickform advmultiselect n'apparait pas à l'écran de mon navigateur.

Vous avez tout simplement oublié d'ajouter la ressource du paquet lui-même. Cette opération est nécessaire pour tout élément Quickform étendu qui n'est pas un élément interne, tel que "radio", "checkbox", "text", "button", etc ...

  1. <?php
  2. require_once 'HTML/QuickForm.php';
  3. require_once 'HTML/QuickForm/advmultiselect.php'// <-- N'OUBLIEZ PAS cette ligne
  4. ?>
2.3.2.

Mon compteur dynamique n'est pas mis à jour quand je clique sur les cases à coché des éléments sélectionnable ?

Avec HTML_QuickForm_advmultiselect version 1.3.0 ou supérieur vous aurez besoin d'un morceau de code javascript pour faire l'initialisation des gestionnaires d'évènement de chacune des cases à coché

      
<script type="text/javascript" src="qfamsHandler.js"></script>
<script type="text/javascript">
window.qfamsName = new Array();
window.qfamsName[0] = 'cars';
window.qfamsName[1] = 'fruit';
window.addEventListener('load', qfamsInit, false);
</script>
      
     

window.qfamsName est un tableau qui identifie chaque élément advmultiselect utilisé dans votre page html.

2.3.3.

La liste de sélection a une option (ligne) à blanc que l'on peut déplacer.

Ce problème arrive quand la liste de sélection est chargée avec un mauvais tableau de donnée (voir méthode HTML_QuickForm::setDefaults() ).

Souvenez-vous que la liste des options disponibles contient toutes les données (sélectionnées ou non). Cette liste est un tableau associatif "key-code" => "display-value". Alors que la liste de sélection est une liste comportant seulement les valeurs de "key-code".

Supposons que nous ayons à retrouver des utilisateurs dans une base de donnée (avec PEAR::DB), avec une simple table conservant les informations. La requête SQL suivante crée une table dans la database par défaut en utilisant le RDBMS, MySQL:

CREATE TABLE user (
   userid VARCHAR(5) NOT NULL,
   gid INT NOT NULL,
   affect INT NOT NULL,
   lastname VARCHAR(50)NOT NULL,
   firstname VARCHAR(50) NOT NULL,
   PRIMARY KEY (userid)
);
     

dont le contenu est :

INSERT INTO user VALUES ('MJ001', 1, 0, 'Martin', 'Jansen');
INSERT INTO user VALUES ('BG001', 1, 1, 'Greg', 'Beaver');
INSERT INTO user VALUES ('CD001', 1, 0, 'Daniel', 'Convissor');
INSERT INTO user VALUES ('LL001', 2, 1, 'Laurent', 'Laville');
     

la colonne gid identifie un groupe d'utilisateur, alors que la colonne userid identifie une personne unique.

Nous allons initialiser la liste des options en attente (à gauche si gabarit par défaut) par une requête comme celle ci :

  1. <?php
  2. $queryAll = 'SELECT userid, CONCAT(lastname, " ", firstname) AS useridentity '
  3. . 'FROM user WHERE gid = 1';
  4. ?>

et obtenir le tableau suivant :

Array
(
    [MJ001] => Jansen Martin
    [BG001] => Beaver Greg
    [CD001] => Convissor Daniel
)
     

Nous allons initialiser la liste des sélections (à droite si gabarit par défaut) par une requête comme celle ci :

  1. <?php
  2. // Une fois que vous avez une instance valide de DataBase dans $db ...
  3. $querySel = 'SELECT userid FROM user WHERE gid = 1 AND affect = 1';
  4. $affected_user =& $db->getCol($querySel);
  5. ?>

et obtenir le tableau suivant :

Array
(
    [0] => BG001
)
     
[Attention] Attention
Souvenez-vous que seul un tableau de "key-code" est nécessaire, d'autres données provoqueraient une ligne blanche dans la liste de sélection.

Le reste à mettre en place est assez simple, il suffit de créer un élement QFAMS, et de charger les options (en attente et déjà sélectionnées) avec la méthode load() de l'élément QF/select.

  1. <?php
  2. require_once 'HTML/QuickForm.php';
  3. require_once 'HTML/QuickForm/advmultiselect.php';
  4. $form = new HTML_QuickForm('amsDB');
  5. // Une fois que vous avez une instance valide de QuickForm advmultiselect dans $ams
  6. // au sein d'un formulaire $form ...
  7. $ams =& $form->addElement('advmultiselect', 'user',
  8. array('Users:', 'Available', 'Affected'), // labels
  9. null, // datas: "key-code" => "display-value"
  10. array('style' => 'width:200px;') // custom layout
  11. );
  12. $ams->load($db, $queryAll, 'useridentity', 'userid', $affected_user);
  13. // ...
  14. ?>
[Astuce] Astuce
Vous pouvez utiliser la méthode load() pour définir les options, à partir de plusieurs sources de données.
  1. <?php
  2. // ...
  3. // 1. un tableau php
  4. $all_user = array('MJ001' => 'Martin Jansen',
  5. 'BG001' => 'Greg Beaver',
  6. 'CD001' => 'Daniel Convissor'
  7. );
  8. $affected_user = array('BG001');
  9. $ams->load($all_user, $affected_user);
  10. // requete pour obtenir les donnees
  11. $queryAll = 'SELECT userid, CONCAT(lastname, " ", firstname) AS useridentity '
  12. . 'FROM user WHERE gid = 1';
  13. $querySel = 'SELECT userid FROM user WHERE gid = 1 AND affect = 1';
  14. $affected_user =& $db->getCol($querySel);
  15. // 2. un resultat de requete
  16. $all_user =& $db->query($queryAll);
  17. $ams->load($all_user, 'useridentity', 'userid', $affected_user);
  18. // 3. le code d'une requete
  19. $ams->load($db, $queryAll, 'useridentity', 'userid', $affected_user);
  20. // ...
  21. ?>
[Note] Note
Cet exemple est disponible dans le paquet (voir examples/qfams_basic_2.php)
HTML_QuickForm_advmultiselect : La Référence v 1.4.0 : 9 Juin 2007