Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 29-10-2010 14:20:00

Merlok
Nouveau membre
Date d'inscription: 19-10-2010
Messages: 2

[ZF 1.10][Zend_Dojo_Form]filteringSelect dépendant

Bonjour à tous !

Je débute avec le zend framework, et j'ai rencontré quelques difficulté (pour ne pas dire bcp roll) à trouver une solutions à ce problème car je n'est trouvé que quelques exemples de solutions que je n'est pas su adapté.
Donc après en avoir trouvé une je la post pour ceux qui serait dans le même cas que moi, quand aux autres je suis ouvert à vos critiques ou vos solutions sur la questions car je ne sais pas si ma façon de faire est très propre.
je me suis quand même beaucoup inspiré des différents exemples que j'ai pu trouver.
Mon exemple vous l'aurer compris porte sur la dépendance entre 2 filteringSelect et plus précisément entre Pays et Ville; à l'affichage du formulaire mes listes déroulantes contiennent toutes les possibilités, et quand je sélectionne un pays la liste des villes se tri en fonctions.

Donc tous d'abord dans le dossier external/dojo de zend framework copiez les 4 dossier "dijit" "dojo" "dojox" "util" et placer les dans public/js.

Au moment d'instancié la vue (je le fait dans mon index.php) il faut :

Code:

Zend_Dojo::enableView($view);

puis dans le layout entre les balises <head></head>:

Code:

<?php 
if ($this->dojo()->isEnabled())
{
    $this->dojo()->setLocalPath('./public/js/dojo/dojo.js')
                       ->addStyleSheetModule('dijit.themes.tundra')
                   -> setDjConfigOption('parseOnLoad', true);
     echo $this->dojo();
   }
?>

Toujours dans le layout :

Code:

<body class="tundra">

Ma base de données s'appelle "test", elle contient les 2 tables suivantes :
_ "Country" composé de 2 champs "countryId"(la clé primaire) et "name"(le nom des pays)
_"City" composé de 3 champs "cityId"(la clé primaire) "name"(le nom des villes) et "countryId"(la clé étrangère pointant sur la clé primaire de ma table "Country") .
Voci les classes les représentant dans le dossier model :

Code:

<?php
//Country.php
class Country extends Zend_Db_Table_Abstract
{
    protected $_schema = 'test';
    protected $_name = 'Country';
    protected $_primary = 'countryId';
}

Code:

<?php
//City.php
class City extends Zend_Db_Table_Abstract
{
    protected $_schema = 'test';
    protected $_name = 'City';
    protected $_primary = 'cityId';
    
    public function setCity($options)
    {
        $i = 0;
        $j = 0;
        $rez;
        $dataCity = new City();
        $select = $dataCity->select();
        $result = $dataCity->fetchAll($select)->toArray();
        while($i < count($result))
        {
            if ($result[$i]['countryId'] == $options)
            {
                $rez[$j] = $result[$i];
                $j++;
            }
            $i++;
        }
        return ($rez);
    }
}

Mon formulaire est constitué de cette façon ("MyForm.php") :

Code:

<?php
class forms_MyForm extends Zend_Dojo_Form
{
    public function init()
    {
         $countryId = new Zend_Dojo_Form_Element_FilteringSelect('countryId');
         $countryId->setLabel('Select a Country :')
                   ->setAutoComplete(true)
                   ->setStoreId('CountryStore')
                   ->setStoreType('dojo.data.ItemFileReadStore')
                   ->setStoreParams(array('url'=>'/MonAppli/public/MonController/countrylist'))
                   ->setAttrib("searchAttr", "name")
                   ->setAttrib('onchange',"loadCity('/* la BaseUrl */')")
                   ->setRequired(true)
                   ->setValue('countryId');
            
         $cityId = new Zend_Dojo_Form_Element_FilteringSelect('cityId');
         $cityId->setLabel('Select a city :')
                ->setAutoComplete(true)
           ->setStoreId('cityStore')
               ->setStoreType('dojo.data.ItemFileReadStore')
               ->setStoreParams(array('url'=>'/MonAppli/public/MonController/citylist'))
               ->setAttrib("searchAttr", "name")
               ->setRequired(true)
               ->setValue('cityId');
            
         $submit = $this->createElement('submit', 'submit');
         $this->addElements(array($countryId, $cityId, $submit));
    }
}

Dans le controller "MonController" il faut :

Code:

<?php
class MonController extends Zend_Controller_Action
{
    public function indexAction()
    {
        $this->view->formTitle = "Formulaire de selection Pays/Ville";
        $form = new forms_MyForm();
        if ($this->_request->isPost())
        {
            if ($form->isValid($_POST))
            {
                //action sur les données validé
            } 
            else
            {
               $form->populate($_POST);
               $this->view->form = $form;
            }
        } 
           $this->view->form = $form;
}

    public function countrylistAction()
    {
        $dataCountry = new Country();
        $select = $dataCountry->select();
        $result = $dataCountry->fetchAll($select);
        $data = new Zend_Dojo_Data('countryId', $result);
        $this->_helper->autoCompleteDojo($data);
    }
    
    public function citylistAction()
    {
        $country = $this->_request->getParam('country');
        $dataCity = new City();
        if ($country === null)
        {
            $select = $dataCity->select();
               $result = $dataCity->fetchAll($select);
            $data = new Zend_Dojo_Data('cityId', $result);
            $this->_helper->autoCompleteDojo($data);
        }
        else
        {
            $rez = City::setCity($country);
            $data = new Zend_Dojo_Data('cityId', $rez);
            $this->_helper->autoCompleteDojo($data);
        }
    }
}

Dans mon dossier public/js j'ai mon script select.js contenant la fonction "loadCity" appelé à lévénement onChange de mon filteringSelect contenant les pays.

Code:

function loadCity(baseurl)
{
    var country = dijit.byId('countryId').getValue();
    var dataStore = new dojo.data.ItemFileReadStore({url: baseurl + '/MonController/citylist/country/' + country});
    dijit.byId('cityId').store = dataStore;
}

Et enfin dans ma vue j'ai :

Code:

<?php echo $this->formTitle ;?>
<?php echo $this->form; ?>
<script type="text/javascript" src="public/js/select.js"></script>

Voila j'espere ne rien avoir oublié smile
Je suis ouvert a toute proposition d'optimisation ou propositions plus Zend.
tchao

Hors ligne

 

Pied de page des forums

Propulsé par PunBB
© Copyright 2002–2005 Rickard Andersson
Traduction par punbb.fr

Graphisme réalisé par l'agence Rodolphe Eveilleau
Développement par Kitpages