Techno, Développement, Entreprendre et au-delà !
Dans: Programmation| Tutoriel| Zend Framework| web2.0
15 déc 2008
Cet article est une traduction du billet de Sudheer Satyanarayana que vous retrouverez en VO sur Techchorus.
Zend Framework offre beaucoup de possibilités pour l’interface utilisateur avec les classes de Zend_Dojo. Dans cet article, nous allons voir ensemble comment construire un élément de formulaire avec la fonctionnalité d’auto-complétion.
Il est préférable que vous soyez familier avec
Serait ce agréable si je vous disais que vous n’avez besoin d’aucune connaissance en JavaScript ? Zend_Dojo permet en effet aux développeurs PHP de construire des formulaires dynamiques et attrayant sans écrire une seule ligne de code JavaScript.
Cet exemple a été testé avec la version 1.7.0 du Zend Framework.
Dans cet exemple, nous allons construire un élément texte où le visiteur pourra soit sélectionner l’utilisateur dans la liste déroulante ou saisir le nom d’utilisateur. Lorsque le nom d’utilisateur est saisi au clavier, l’élément de formulaire génère une liste déroulante en filtrant les données à partir des données saisies. Jettez un oeil à l’exemple Dijit FilteringSelect pour comprendre le type d’élément de formulaire que nous allons construire.
Nous allons utiliser l’helper d’action autoCompleteDojo pour envoyer les données JSON.
Commençons à coder.
Etape 1: Définir l’environnement Dojo dans notre fichier de Bootstrap.
// Create new view object if not already instantiated //$view = new Zend_View(); Zend_Dojo::enableView($view); $view->dojo() ->addStyleSheetModule('dijit.themes.tundra') ->setDjConfigOption('usePlainJson', true) ->disable(); |
Dans cet exemple, nous utilisons par défaut le CDN défini dans Zend_Dojo. Vous n’avez pas besoin d’ajouter les fichiers JavaScript sur votre serveur. Nous appliquons la feuille de style ‘tundra’.
Etape 2: Créer le controlleur. Créez le fichier DemoController.php dans votre répertoire controller et ajouter le code ci-dessous :
class DemoController extends Zend_Controller_Action { public function indexAction() { } public function userlistAction() { } public function getForm() { } } |
Comme vous pouvez le voir, il s’agit juste du squelette de notre controlleur. Nous y ajouterons le code dans un moment.
Nous construisons notre formulaire dans la fonction getForm(). Dans une application réelle vous pouvez créer le formulaire dans une classe et un fichier différent. Dans indexAction nous affichons le formulaire et traitons les données fournies par l’utilisateur. In userlistAction nous générons les données au format JSON qui est requis par l’élément filteringSelect.
Etape 3: Créer le formulaire et ses éléments. Placez le code suivant dans la
fonction getForm().
$form = new Zend_Form; $userId = new Zend_Dojo_Form_Element_FilteringSelect('userId'); $userId->setLabel('Select a user') ->setAutoComplete(true) ->setStoreId('userStore') ->setStoreType('dojo.data.ItemFileReadStore') ->setStoreParams(array('url'=>'/demo/userlist')) ->setAttrib("searchAttr", "username") ->setRequired(true); $submit = $form->createElement('submit', 'submit'); $form->addElements(array($userId, $submit)); return $form; |
$userId est l’élément de formulaire contenant le widget Dojo filteringSelect. Nous donnons le nom userStore à nos données. Nous précisons que les données seront fournies à partir de l’url /demo/userlist. Enfin, nous attribuons ‘username’ à ’searchAttr’.
Etape 4: Préparer la base de données
CREATE TABLE `user` ( `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY , `username` VARCHAR( 100 ) NOT NULL , ) ENGINE = InnoDB INSERT INTO `zf`.`user` ( `id` , `username` ) VALUES ( NULL , 'jamey' ), ( NULL , 'hryan' ), ( NULL , 'jennyross' ), ( NULL , 'natebrg' ), ( NULL , 'deric' ); |
Créez des données exemples et insérez les dans la base de données.
Etape 5: Récupérer les données de la base de données, les convertir au format JSON et les envoyer.
J’utilise la base de données MySQL « ZF » dans cet exemple. Insérez le code ci-dessous pour userlistAction(). Je me connecte à la base de données directement depuis l’action dans cet exemple. En pratique, vous pourriez vous connecter à la base de données depuis un point central tel que le bootstrap ou depuis un front controller plugin.
$db = new Zend_Db_Adapter_Pdo_Mysql(array( 'host' => '127.0.0.1', 'username' => 'zf', 'password' => 'password', 'dbname' => 'zf' )); $result = $db->fetchAll("SELECT * FROM user"); $data = new Zend_Dojo_Data('id', $result); $this->_helper->autoCompleteDojo($data); |
Cela prend seulement trois lignes pour récupérer les données et lees envoyer au format que demande Dojo. Nous passons deux paramètres id and $result au constructeur de Zend_Dojo_Data. ‘id’ est l’identifiant unique de la table de notre base de données. Le helper d’action autoCompleteDojo est simple d’emploi. Il désactive le layout et le view renderer. Il met en place les données d’entête appropriées et envoi les données en utilisant l’objet Zend_Dojo_Data.
Faites pointer votre navigateur sur demo/userlist, vous devriez recevoir les données dans un fichier. Dojo se sert de ce fichier via dojo.data.ItemFileReadStore.
Etape 6: Configurer indexAction(). Ajouter le code ci-dessous à la fonction indexAction().
$form = $this->getForm(); if ($this->_request->isPost()) { if ($form->isValid($_POST)) { /* * Process data */ $userId = $this->_getParam('userId'); //$userId contains the userId input by the user } else { $form->populate($_POST); $this->view->form = $form; } } else { $this->view->form = $form; } |
Etape 7: Définir la vue et le layout
Dans le script de vue index.phtml, insérez le code suivant :
<h1>Demo</h1> echo $this->form; |
Dans le fichier de layout, afficher le contenu Dojo et configurez la classe de la balise body à ‘tundra‘. Lorsque vous utilisez echo $this->dojo(), les liens vers les fichiers JavaScript Dojo sont affichés. Cela imprime également le code JavaScript que le Zend Framework génère pour vous.
dojo()->addStylesheetModule('dijit.themes.tundra');
?>
<div id="content">
layout()->content ?></div> |
A première vue, il apparait que l’on a écrit beaucoup de code pour obtenir ce résultat. Lorsque vous aurez compris l’ensemble du processus, vous verrez qu’il est vraiment très simple de construire des éléments de formulaire avec la fonctionnalité d’auto-complétion.
J’ai joint les fichiers à ce post pour que vous puissiez vous y référer.
Vous pouvez également jetter un oeil à :
Ajouter un sélecteur de date sympa dans vos formulaires sans écrire une seule ligne de JavaScript
Un blog technologique, sur le développement, sur le Zend Framework, sur PHP et aussi une petite touche d'entreprenariat.
6 réponse to Zend Framework : exemple d'auto-complétion avec Zend_Dojo
Eric
août 6th, 2009 at 10 h 59 min
merci pour ce super tuto.
j’obtiens cependant des erreurs avec le Zend Framework 1.9.0 que j’ai réussi à corriger en procédant de la sorte :
1- dans userlistAction() remplacer
$this->_helper->autoCompleteDojo($data);
par
echo $data->toJson();
exit;
2- dans getForm() remplacer
url => ‘/demo/userlist’
par
url => ‘userlist’
cdlt
Fred Blanc
août 28th, 2009 at 1 h 25 min
Merci pour ce retour Eric.
Cordialement,
Fred Blanc
Webdesigner
octobre 27th, 2009 at 21 h 27 min
Thanks Eric!!!
I have searched that damn mistake ( url => ‘/demo/userlist’) for hours
Thank you very much!!!
PaulaMicaelle
novembre 9th, 2009 at 16 h 45 min
Salut et merci pour le tuto mais j’ai souci.
je sais pas à quel endroit placer ces différents bout de code dans les différents fichiers.
voici les codes:
Demo
echo $this->form;
dojo()->addStylesheetModule(‘dijit.themes.tundra’);
?>
layout()->content ?>
Hamza
novembre 13th, 2009 at 13 h 32 min
Slt PaulaMicaelle
c tres facile ! tu place
echo $this->form; dans ton fichier index.phtml
et
dojo()->addStylesheetModule(’dijit.themes.tundra’);
?>
layout()->content ; ?>
dans le layout
jesper avoir aidé .
Hamza
novembre 13th, 2009 at 13 h 34 min
Bon ici la moitier du code est disparu surmen a coz des filtre mai vous devez connaitre kan mem le reste ^^