Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Pages: 1
Salut à tous
Je cherche un exemple complet de màj de la liste d'un élément Select d'une Zend_Form à partir d'une base de données au moment où l'utilisateur clique dessus.
Je cherche également à mettre à jour une liste d'un élément Select en fonction de l'élément choisi dans une autre liste. Exemple la liste des villes est chargée en fonction du pays choisi.
Merci
Dernière modification par ziedb (03-02-2009 17:46:11)
Hors ligne
Hors ligne
Euh tout ça, ça se fait en Javascript.
Hors ligne
Oui mais je pense pas que ça soit adapté pour gérer la validation avec Zend_Form
Hors ligne
J'ai tellement souffert moi-même pour avoir un truc de ce genre qui marche bien que je ne peux qu'aider quelqu'un face aux mêmes difficultés.
J'y suis parvenu à 99% grâce à ce forum, mais certaines informations sont réparties dans plusieurs contributions.
On part du principe d'une appli de type Zend Framework de base qui tourne déjà et on va ajouter un dialogue avec de l'autocompletion.
J'utilise Dojo, d'autres pourront peut-être de donner une solution avec Jquery et encore d'autres feront autrement que moi avec Dojo.
Dans cet exemple j'utilise une ComboBox pour l'autocomplétion ce qui permet à l'utilisateur de saisir une valeur différente de ce qui lui est proposé.
Voilà une solution possible :
Dans initializer.php :
public function initView() { $view = new Zend_View(); Zend_Dojo::enableView($view); $view->dojo()->addStylesheetModule('dijit.themes.tundra'); $view->dojo()->enable(true); $view->dojo()->setDjConfigOption('usePlainJson', true); $doctypeHelper = new Zend_View_Helper_Doctype(); $doctypeHelper->doctype('XHTML1_TRANSITIONAL'); $view->setEncoding("UTF-8"); Zend_Controller_Action_HelperBroker::getStaticHelper('viewRenderer')->setView($view); Zend_Layout::startMvc(); }
Dans indexController (pour afficher le formulaire):
public function indexAction() { // formulaire $formulaire = new formulaire(); if ($this->getRequest()->isPost()) { if (!$fsportif->isValid($_POST)) { // Des erreurs de premier niveau ont été detectées } else { $values = $formulaire->getValues(); // Traitement de la sasie } } // Passage du formulaire à la vue $this->view->formulaire = $formulaire; }
Dans la vue index.phtml:
<?php /** * Default home page view * * @author * @version */ $this->headTitle('New Zend Framework Project'); $this->placeholder('title')->set('Welcome'); php echo $this->formulaire;
Le layout :
<?php /** * Default Layout * * @author * @version */ echo '<?xml version="1.0" encoding="UTF-8" ?>'; echo $this->doctype() ?> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <?php echo $this->headTitle(); if ($this->dojo()->isEnabled()){ $this->dojo()->setLocalPath('/monappli/public/scripts/dojo/dojo/dojo.js') ->addStyleSheetModule('dijit.themes.tundra'); echo $this->dojo(); } echo $this->headScript(); echo $this->headStyle(); ?> </head> <body class="tundra"> <h1><?php echo $this->placeholder('title') ?></h1> <?php echo $this->layout()->content ?> <br /> <br /> </body> </html>
Le formulaire :
<?php require_once ('Zend/Dojo/Form.php'); class formulaire extends Zend_Dojo_Form { protected $_standardElementDecorator = array( 'ViewHelper', array('Description', array('class' => 'formHint')), array('Label', array('requiredPrefix' => '<em>* </em>', 'escape' => false, 'class'=>'zonelabel')), array('Errors', array('placement' => 'append')), array('HtmlTag', array('tag' => 'p', 'class' => 'ctrlHolder')) ); /** * *@param array|Zend_Config|null $options *@return void */ public function __construct ($options = null, $tabsports,$tabdept,$communaute) { parent::__construct($options = null); $this->setAction('') ->setMethod('post') ->setEnctype(Zend_Form::ENCTYPE_MULTIPART); $listedevaleurs = new Zend_Dojo_Form_Element_ComboBox('valeur_id'); $listedevaleurs->setDecorators(array('DijitElement',array('Label', array('escape'=>false)), array('HtmlTag', array('tag'=>'p')))) ->setLabel('Votre choix') ->setAutoComplete(true) ->setStoreId('valeurStore') ->setStoreType('dojo.data.ItemFileReadStore') ->setStoreParams(array('url'=>'/monappli/public/default/index/listevaleurs')) ->setAttrib("searchAttr", "valeur_nom"); // Boutons $bouton_submit = new Zend_Form_Element_Submit('submit'); $bouton_submit->setLabel('Enregistrer') ->removeDecorator('DtDdWrapper'); $sportifs_submit->setAttrib('class','boutonform'); // Reset $bouton_reset = new Zend_Form_Element_Reset('reset'); $bouton_reset->setLabel('Effacer') ->removeDecorator('DtDdWrapper') ->addDecorators(array( array('ViewHelper'), array('Errors'), array('HtmlTag', array('tag' => 'span')), )); $this->addElement($listedevaleurs) ->addElement($sportifs_submit) ->addElement($sportifs_reset); } } ?>
La méthode qui sera donc appelée dans l'utilisateur clique ou tape quelque chose dans la zone est géré par /monappli/public/default/index/listevaleurs'
Donc cette méthode dans ton controller :
public function listevaleursAction() { $tablevaleurs = new Tablevaleurs(); $result = $Tablevaleurs->tablevaleurs_listechoix(); $data = new Zend_Dojo_Data('valeur_id', $result); $this->_helper->autoCompleteDojo($data); }
Il ne manque plus que l'accès à la la table de la base de données. Donc la méthode tablevaleurs_listechoix est écrite dans un fichier models (Tablevaleurs.php).
Dans le cas présent je prends toute la table :
public function tablevaleurs_listechoix() { $result = $this->fetchAll(); return $result; }
Je crois ne rien avoir oublié.
Dernière modification par Jean-Marc Rigade (04-02-2009 16:15:15)
Hors ligne
Un grand merci
Je reviens vers toi s'il y qqs chose qui n'est pas claire.
Hors ligne
Pages: 1