Zend Framework : exemple d'auto-complétion avec Zend_Dojo

Dans: Programmation|Tutoriel|Zend Framework|web2.0

15 déc 2008

Zend Framework AutoComplete example with Zend_Dojo_Form_Element_FilteringSelect

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

  • Zend_Controller_Action
  • Zend_Layout
  • Zend_Form

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.

FilteringSelect diffère du Widget Dojo Combobox en ce que, la valeur de l’élément du formulaire doit être fournie dans la liste. Aussi, vous pouvez afficher le nom d’utilisateur sur l’écran et définir le ‘User ID’ comme élément de valeur.

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-&gt;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()-&gt;addStylesheetModule('dijit.themes.tundra');
    ?&gt;
<div id="content">
        	    layout()-&gt;content ?&gt;</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

L’archive des sources de ce tutoriel (tar.gz)

7 réponse to Zend Framework : exemple d'auto-complétion avec Zend_Dojo

Avatar

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

Avatar

Fred Blanc

août 28th, 2009 at 1 h 25 min

Merci pour ce retour Eric.

Cordialement,
Fred Blanc

Avatar

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

Avatar

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

Avatar

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

Avatar

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

Avatar

crazyball

mai 22nd, 2010 at 23 h 56 min

Bonjour, merci pour ce super tuto, par contre est il possible de faire une auto-completion de type « %LIKE% » c’est a dire que ce qu’on tape peut etre autant dans le contenu qu’a son début ?

Commentez ce billet

Nota : Tous les commentaires sont modérés à posteriori.

A propos

Un blog technologique, sur le développement, sur le Zend Framework, sur PHP et aussi une petite touche d'entreprenariat.

ElePHPants

    Elefant train like meOn guardEuroscope
  • LucSens: "Lost in Japan" and "Lost in China" offer support for Japanese and Chinese - you just take a photo w [...]
  • Ludovic: Un grand merci pour ce super tutoriel qui m'a permis d'intégrer sans difficultés Doctrine à Zend [...]
  • crazyball: Bonjour, merci pour ce super tuto, par contre est il possible de faire une auto-completion de type " [...]
  • Elio DUFOUR: Hello, j'ai trouvé votre site sympa via Google et je tenais à vous le dire. [...]
  • Prestanux: Bonjour, Les plateformes de mise en relation commerciales sont nombreuses sur la toiles et il est [...]

En ce moment...

Posting tweet...

Partenaires