FAQ

FAQ – La Foire Aux Questions

HTML_QuickForm_advmultiselect FAQ

Questions générales

Combien cela coute ?

Vous pouvez télécharger et utiliser ce paquet 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.

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, la version PHP et les paquets PEAR installés) et peut être le code source de votre implémentation.

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.

Qu'est-ce que HTML_QuickForm ?

HTML_QuickForm est un paquet 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

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.

Comment faire

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.

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() .

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

Les réponses suivantes ne sont appliquables que pour HTML_QuickForm_advmultiselect version 1.3.0 ou supérieure.

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.

<script type="text/javascript">
<?php
echo $ams1->getElementJs();    // keep one

//echo $ams2->getElementJs();  // remove others
?>
</script>

Une meilleure solution serait d'utiliser un lien vers une ressource externe et ainsi réduire 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>

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 :

<?php
require_once 'HTML/QuickForm.php';
require_once 
'HTML/QuickForm/advmultiselect.php';

$form = new HTML_QuickForm('ams130');
// ....
$ams =& $form->addElement('advmultiselect''cars'null$car_array);

$deftpl '
<table{class}>
<!-- BEGIN label_2 --><tr><th>{label_2}</th><!-- END label_2 -->
<!-- BEGIN label_3 --><th>&nbsp;</th><th>{label_3}</th></tr><!-- END label_3 -->
<tr>
  <td valign="top">{unselected}</td>
  <td align="center">{add}{remove}</td>
  <td valign="top">{selected}</td>
</tr>
</table>
'
;

$ams->setElementTemplate($deftpl);
//...
?>

Guide de dépannage

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" ...

<?php
require_once 'HTML/QuickForm.php';
require_once 
'HTML/QuickForm/advmultiselect.php';  // <-- N'OUBLIEZ PAS cette ligne
?>

Mon compteur dynamique n'est pas mis à jour quand je clique sur les cases à cocher 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 à cocher.

<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.

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 :

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

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 :

<?php
// Once you have a valid DataBase object named $db ...

$querySel 'SELECT userid FROM user WHERE gid = 1 AND affect = 1';
$affected_user =& $db->getCol($querySel);
?>

et obtenir le tableau suivant :

Array
(
    [0] => BG001
)

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().

<?php
require_once 'HTML/QuickForm.php';
require_once 
'HTML/QuickForm/advmultiselect.php';

$form = new HTML_QuickForm('amsDB');

// Once you have a valid QuickForm advmultiselect object named $ams in a QuickForm named $form ...

$ams =& $form->addElement('advmultiselect''user',
    array(
'Users:''Available''Affected'),       // labels
    
null,                                           // datas: "key-code" => "display-value"
    
array('style' => 'width:200px;')                // custom layout
);
$ams->load($db$queryAll'useridentity''userid'$affected_user);

// ...
?>

Vous pouvez utiliser la méthode load() pour définir les options, à partir de plusieurs sources de données.

<?php
// ...

// 1. a php array
$all_user = array('MJ001' => 'Martin Jansen',
                  
'BG001' => 'Greg Beaver',
                  
'CD001' => 'Daniel Convissor'
);
$affected_user = array('BG001');
$ams->load($all_user$affected_user);

// queries to get data
$queryAll 'SELECT userid, CONCAT(lastname, " ", firstname) AS useridentity '
          
'FROM user WHERE gid = 1';

$querySel 'SELECT userid FROM user WHERE gid = 1 AND affect = 1';
$affected_user =& $db->getCol($querySel);

// 2. a db result
$all_user =& $db->query($queryAll);
$ams->load($all_user'useridentity''userid'$affected_user);

// 3. a db query
$ams->load($db$queryAll'useridentity''userid'$affected_user);

// ...
?>

Cet exemple est disponible dans le paquet (voir examples/qfams_basic_2.php)