Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 21-07-2008 23:05:40

ishtanzar
Nouveau membre
Date d'inscription: 21-07-2008
Messages: 1

[Zend_Form][1.5.2] Zend_Form & decorator ViewScript

Bonsoir tout le monde,

Cela fait quelques temps que je bataille avec le ZF pour utiliser un decorator scriptView avec mon Zend_Form.

J'ai un contrôlleur assez simple :

application/controllers/IndexController.php

Code:

<?php 
class IndexController extends Zend_Controller_Action 
{ 
    public function indexAction() 
    {
        $form = new Zend_Form();
        $form->setName("myForm");
        $form->setDecorators(array(array("ViewScript", array("viewScript" => "index/demo-form.phtml"))));
        $form->addElement("text", "myField", array(
            "label" => "nom :", 
            "decorators" => array("ViewHelper", "Errors", "Label")));
        $this->view->myForm = $form;
    } 
}

Une vue tout aussi simple :

application/views/scripts/index/index.phtml

Code:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    <title>Untitled page</title>
</head>
<body>
    <p>Hello World from Zend Framework !</p>
    <?= $this->myForm ?>
</body>
</html>

et pour finir le ViewScript que devrait utiliser le Zend_Form lors du render :

application/views/scripts/index/myForm.phtml

Code:

<h4>Please register with us!</h4>
<form action="<?= $this->escape($this->getAction()) ?>"
      method="<?= $this->escape($this->getMethod()) ?>">

<fieldset>
    <legend>Demographics</legend>
    <p>
        Please provide us the following information so we can know more about
        you.
    </p>

    <?= $this->myField ?>
</fieldset>
</form>

Et le résultat final assez décevant en soit :

Code:

<h4>Please register with us!</h4>
<form action="</body>
</html><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    <title>Untitled page</title>
</head>
<body>
    <p>Hello World from Zend Framework !</p>

Je connais pas encore bien le ZF, je dois sûrement louper un truc tout bête mais j'ai beau écumer le net je vois pas ce que j'ai de faux. D'ailleurs si quelqu'un se sent l'âme de faire un bon tuto sur le Zend_Form avec un decorator scriptView, je pense qu'il y aura des heureux parce que j'en ai pas trouvé de bien transcendant...

Merci de votre aide.

Bonne nuit

Hors ligne

 

#2 22-07-2008 09:35:17

nORKy
Membre
Date d'inscription: 06-03-2008
Messages: 1098

Re: [Zend_Form][1.5.2] Zend_Form & decorator ViewScript

Y'a pas un array de trop la :

Code:

 $form->setDecorators(array(array("ViewScript", array("viewScript" => "index/demo-form.phtml"))));

J'ai jamais utilisé viewscript mais j'ai l'intention de l'utiliser aujourd'hui
Donc si personne ne t'a répondu, j'aurais pt etre une réponse au plus tard cet après-midi


----
Gruiiik !

Hors ligne

 

#3 22-07-2008 10:31:50

nORKy
Membre
Date d'inscription: 06-03-2008
Messages: 1098

Re: [Zend_Form][1.5.2] Zend_Form & decorator ViewScript

Je viens d'utiliser viewscript avec succès.
Mais, je ne l'ai pas utilisé avec form mais avec un élément (je n'ai pas envi de faire un décorateur juste pour 2 éléments différents des autres).

Mon but est de rendre 2 éléments sans le input et sans le label, mais intégrer au formulaire comme si çà en était.
(tu comprendras en voyant le code).

Voici mon formulaire :

Code:

class My_Form_User_Account_Index extends My_Form_Agora
{
  public function init()
  {
    $this->setAction('/user/account/index');

    $this->addElement('text', 'login', array(
      'decorators' => $this->_standardElementDecorator,
      'label' => 'Identifiant:',
    ));


    $this->addElement('text', 'email', array(
      'decorators' => $this->_standardElementDecorator,
      'label' => 'Adresse E-mail:',
    ));


    $this->addElement('text', 'regdate', array(
      'decorators' => $this->_untaggedElementDecorator,
      'label' => 'Inscrit le:',
    ));

    $this->addElement('text', 'ip', array(
      'decorators' => $this->_untaggedElementDecorator,
      'label' => 'Dernière IP Connue:',
    ));

    $this->addElement('text', 'connectdate', array(
      'decorators' => $this->_untaggedElementDecorator,
      'label' => 'Date de dernière connexion:',
    ));

    $this->addDisplayGroup(
      array('login', 'email', 'regdate', 'ip', 'connectdate'),
      'useraccountdata',
      array(
        'disableLoadDefaultDecorators' => true,
        'decorators' => $this->_standardGroupDecorator,
        'legend' => 'Vue d\'ensemble'
    ));

    $this->addElement('submit', 'submit', array(
      'decorators' => $this->_buttonElementDecorator,
      'label' => 'Mettre à jour le compte'
    ));
  }
}

Mon formulaire étend une autre class qui contient notamment :

Code:

protected $_untaggedElementDecorator = array(
    array('ViewScript', array('viewScript' => 'element.phtml')),
  );

Donc, certains élements seront rendu à l'aide de la vue element.phtml

Je suis en structure modulaire, mon script est placé ici :
modules/user/views/script/element.html

Il n'est pas dans un répertoire du controller, car on ne sait jamais, je pourrais pt etre en avoir besoin dans un autre controller du module. C'est plus 'global'.
Sinon, tu peux mettre
'viewScript' => 'account/element.phtml'
et la tu le placeras ici :
modules/user/views/script/account/element.html

le code de element.html :

Code:

<div class="ctrlHolder">
  <p class="label"><?= $this->element->getLabel();?></p>
  <?= $this->element->getValue();?>
</div>

Il est très simple pour la bonne raison que de mon cas, c'est une information ;et donc je n'ai pas besoin de générer les erreurs, les descriptions, etc...

Le rendu final : (j'ai coupé autour)

Code:

<div class="ctrlHolder">
  <label for="email" class="optional">Adresse E-mail:</label>
  <input type="text" name="email" id="email" value="toto@titi.comr" />
</div>

<div class="ctrlHolder">
  <p class="label">Inscrit le:</p>
  12 mars 2008
</div>

<div class="ctrlHolder">
  <p class="label">Dernière IP Connue:</p>
</div>

<div class="ctrlHolder">
  <p class="label">Date de dernière connexion:</p>
 </div>
</fieldset>
<div class="buttonHolder">
  <input type="submit" name="submit" id="submit" value="Mettre à jour le compte" />
</div>
</form>

Pour info, dans ma mise en form, j'ai déclarer en css
label,
.label {
...
}

ce qui fait que je peux rendre mes <label> et <p class="label"> de la même manière

J'espère t'avoir aidé.


----
Gruiiik !

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