Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 17-06-2010 17:36:05

rclsilver
Nouveau membre
Date d'inscription: 17-06-2010
Messages: 6

[ZF][Dojo] headScript() return NULL et non fonctionnement des form elt

Bonjour,
Je mets actuellement en place un nouveau projet avec la nouvelle version de ZF.
L'année dernière, j'avais déjà fait un projet avec une ancienne version de ZF (je ne saurais plus dire laquelle, mais la dernière version stable disponible en Juin 2009).

Afin de vérifier le bon fonctionnement de mon projet de base, j'ai voulu créer un formulaire simple avec des composants "Dojo" (TextBoxValidation et Button avec icône).

* J'ai donc copié le dossier external/dojo dans le dossier public/js de mon application afin de distribuer la librairie dojo.

* Dans mon bootstrap, j'ai initialisé ma vue comme ceci :

Code:

    protected function _initView()
    {
        $config = Zend_Registry::get('config');
        $view = new Zend_View();

        Zend_Dojo::enableView($view);
        
        $application['name'] = $config->appli->name;
        $application['version'] = $config->appli->version;
        
        $view->application = $application;
        $view->setScriptPath(APPLICATION_PATH . DIRECTORY_SEPARATOR . 'modules');
        
        $view->dojo()->setLocalPath('/js/dojo/dojo.js')
                 ->addStyleSheetModule('dijit.themes.tundra')
                 ->setDjConfigOption('usePlainJson', true)
                 ->enable();
        
        $viewRenderer = Zend_Controller_Action_HelperBroker::getStaticHelper('ViewRenderer');
        $viewRenderer->setView($view);

        return $view;
    }

* Dans mon script de vue index/index.phtml, j'ai ajouté le code nécessaire afin d'inclure la librairie Dojo (dans la balise head :

Code:

if ($this->dojo()->isEnabled())
{
    echo ($this->dojo());
}

echo ($this->headScript());

* Voici le code de ma classe Phidias_Form_Country :

Code:

class Phidias_Form_Country extends Zend_Dojo_Form
{
    public function init()
    {
        $this->setMethod('post');

        $code = new Zend_Dojo_Form_Element_ValidationTextBox('code');
        $code->setLabel('Code');
        $code->setRequired(true);
        $code->setPromptMessage('Code du pays (ex: FR)');
        $code->setInvalidMessage('Le code du pays est obligatoire');
        $code->setRegExp('[A-Za-z]{2}');
        $code->setAttrib('style', 'width: 600px');

        $label = new Zend_Dojo_Form_Element_ValidationTextBox('label');
        $label->setLabel('Libellé');
        $label->setRequired(true);
        $label->setPromptMessage('Libellé du pays');
        $label->setInvalidMessage('Le libellé du pays est obligatoire');
        $label->setRegExp('.{2,}');
        $label->setAttrib('style', 'width: 600px');

        $submit = new Zend_Dojo_Form_Element_Button('submit');
        $submit->setLabel('Valider');
        $submit->setAttrib('type', 'submit');
        $submit->setAttrib('iconClass', 'dijitEditorIcon dijitEditorIconSave');

        $this->addElements
        (
            array
            (
                $code,
                $label,
                $submit
            )
        );
    }
}

* Dans mon IndexController, puis dans indexAction(), j'instancie le formulaire puis le stocke dans la variable "form" de ma vue :

Code:

    public function indexAction()
    {        
        $form = new Phidias_Form_Country();
        
        if ($this->_request->isPost())
        {
            $formData = $this->_request->getPost();
            
            if ($form->isValid($formData))
            {
                print_r($formData);
            }
            else
            {
                $form->populate($formData);
            }
        }
        
        $this->view->form = $form;
    }

* J'affiche dans mon script de vue cette variable :

Code:

<body class="tundra">
<?php
    echo($this->form);
?>
</body>

Le problème c'est que les éléments ne sont pas traités comme des éléments Dojo. La validation Ajax ne fonctionne pas. J'ai copié ma classe Phidias_Form_Country dans mon projet de l'année dernière, ainsi que mon IndexController (renommé en TestController) et ma vue. Dans l'ancien projet, ça fonctionne !

En comparant le HTML des deux pages générées, je vois que dans mon ancien projet, le code suivant est ajouté :

Code:

<script type="text/javascript">
//<![CDATA[
dojo.require("dijit.form.ValidationTextBox");
    dojo.require("dijit.form.Button");
    dojo.require("dijit.form.Form");
    dojo.require("dojo.parser");
dojo.addOnLoad(function() {
    dojo.forEach(zendDijits, function(info) {
        var n = dojo.byId(info.id);
        if (null != n) {
            dojo.attr(n, dojo.mixin({ id: info.id }, info.params));
        }
    });
    dojo.parser.parse();
});
var zendDijits = [{"id":"code","params":{"promptMessage":"Code du pays (ex: FR)","invalidMessage":"Le code du pays est obligatoire","regExp":"[A-Za-z]{2}","required":"true","dojoType":"dijit.form.ValidationTextBox"}},{"id":"label","params":{"promptMessage":"Libell\u00e9 du pays","invalidMessage":"Le libell\u00e9 du pays est obligatoire","regExp":".{2,}","required":"true","dojoType":"dijit.form.ValidationTextBox"}},{"id":"submit","params":{"dojoType":"dijit.form.Button"}},{"id":null,"params":{"dojoType":"dijit.form.Form"}}];
//]]>
</script>

Lorsque j'insère ce code manuellement dans mon script de vue, là, tout fonctionne ! De mémoire, je sais que c'était l'affichage de la méthode de vue headScript() qui affichait ce code.

Ma question est simple : est-ce que le fonctionnement entre les anciennes versions de ZF et la nouvelle est différent concernant Dojo ? J'ai regardé beaucoup beaucoup de documentation concernant Dojo et ZF sans trouver de solution !

Je suis disponible pour toute information complémentaire !

Merci d'avance !

Dernière modification par rclsilver (17-06-2010 18:28:02)

Hors ligne

 

#2 17-06-2010 22:58:03

rclsilver
Nouveau membre
Date d'inscription: 17-06-2010
Messages: 6

Re: [ZF][Dojo] headScript() return NULL et non fonctionnement des form elt

J'ai identifié un point, quand je passe par un système de Layouts, que je mets mes appels de dojo et headscript() dans un layout.phtml et uniquement mon formulaire dans mon script de vue, ça fonctionne.

Quelqu'un aurait-il une idée d'un tel comportement ? Mon architecture cible est d'avoir Smarty en moteur de template.. smile

Hors ligne

 

#3 18-06-2010 14:07:54

jean
Membre
Date d'inscription: 25-08-2008
Messages: 107

Re: [ZF][Dojo] headScript() return NULL et non fonctionnement des form elt

J'ai aussi rencontré le même cas.

J'ai résolu cela en faisant des tests avec Zend Application (avec et sans Layout).

Reste que je n'ai jamais réussi à faire fonctionner Zend_Dojo *sans* layout. J'ai peut être loupé qq chose...

Mon interprétation : le layout est rendu en deux temps

1) la vue est rendue
2) le layout est rendu

Comme le layout est rendu *après* la vue, cela permet aux instructions 
if ($this->dojo()->isEnabled())
situées dans le <head> du Layout de détermier si Dojo a été lancé dans le rendu de la vue.

Dans ce cas, les JS, CSS, etc. de Dojo sont chargés...

Voilà mon interprétation.

Les autres, vous confirmez ?

jean

Hors ligne

 

#4 18-06-2010 14:11:09

rclsilver
Nouveau membre
Date d'inscription: 17-06-2010
Messages: 6

Re: [ZF][Dojo] headScript() return NULL et non fonctionnement des form elt

J'imagine que tu dois avoir raison sur ta théorie, ça parait même logique.

Je suis quand même étonné qu'il n'y est pas de documentation (à ma connaissance) qui explique comment utiliser Dojo de façon transparente sans utilisation de layouts.

Hors ligne

 

#5 18-06-2010 14:13:32

jean
Membre
Date d'inscription: 25-08-2008
Messages: 107

Re: [ZF][Dojo] headScript() return NULL et non fonctionnement des form elt

Tout à fait d'accord, je n'ai jamais vu la doc faire référence à l'obligation d'avoir des layouts pour Zend Dojo.

Mais bon, nous avons peut être loupé qq chose !!!

Jean

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