Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 05-04-2011 10:49:08

gmifsud
Membre
Date d'inscription: 29-04-2010
Messages: 75

[CONTOURNÉ] Zend_Form : Zend_File et décorator ?

Bonjour à tous,


J'utilise la dernière version du ZendFramework 1.11.4.
Lorsque je crée un formulaire avec un élément file cela semble fonctionner (le ou les fichiers (en cas de multiFile)  sont bien copiés sur la destination et le reste du formulaire renvoie bien les valeurs voulues.

MAIS, lorsque j'utilise un décorateur personnel, il n'y a pas de message d'erreur mais le fichier n'est pas copié et la page reste sur l'affichage du formulaire (alors qu'elle est redirigée en cas de succès).

Appel du décorateur dans le formulaire :

Code:

[lang=php]
// Spécification d'un décorateur personnel
    $this->setDecorators( array(
            'FormErrors',
            array("ViewScript",
                array("viewScript" => "formdecorator.phtml"))
            ));

Le décorateur :

Code:

[lang=php]<form action="<?php echo $this->escape($this->element->getAction()) ?>"
      method="<?php echo $this->escape($this->element->getMethod()) ?>"
      id="<?php echo $this->escape($this->element->getAttrib("id")); ?>">
<fieldset>
  <legend><?php echo $this->escape($this->element->getAttrib("legende")); ?></legend>
  <table width="100%" cellspacing="3" cellpadding="0" border="0" class="noborder">
    <tbody>
    <tr><td class="left" width="33%" align="right">&nbsp;</td>
    <td class="right" width="67%">&nbsp;</td></tr>
      <?php $i=0;

      foreach($this->element as $element):
        // On affiche le label et le nom des éléments qui en possèdent
        if ($element->getName() != "Valider"
         && $element->getName() != "Annuler") { ?>
        <tr>
            <td class="left" align="right">
            <?php    echo $this->formLabel($element->getName(), $element->getLabel()); ?>
            </td>
            <?php
         } else { // Sinon on affiche une cellule vide ?>
            <td class="left" align="right">    </td>
        <?php }  ?>
              <td class="right">
            <?php
            // On affiche les données de chaque l'élément.
            // S'il s'agit d'éléments "spéciaux", on fait juste un render().
              if ($element->getName() == "Valider"
               || $element->getName() == "Annuler"
                 || $element->getName() == "imagevideo") {
                   
                   // Si c'est l'élément Valider ou Annuler, on le récupère pour plus tard.
                  if ($element->getName() == "Valider")
                  {    $spec[$i++] = $element; }
                  elseif ($element->getName() == "Annuler")
                  {    $spec[$i++] = $element;    }
                  elseif ($element->getName() == "imagevideo")
                  {    echo $element->renderFile();    }
                  else {    echo $element->render();
                  }
                  
               } else {    // Pour tous les autres éléments, on affiche tout ce qui suit.
                $descrip = $element->getDescription();
                  echo "<span title = '$descrip'>".$this->{$element->helper}(
                             $element->getName(),
                             $element->getValue(),
                             $element->getAttribs(),
                             (method_exists($element,'getMultiOptions')) ? $element->getMultiOptions() : ''
                );
                // On affiche les erreurs éventuelles.
                //echo $this->formErrors($element->getMessages());
                echo "</span>";
            }
            // On affiche les erreurs éventuelles.
            //    echo $this->formErrors($element->getMessages());
            ?>
        </td></tr>
      <?php endforeach;    ?>
          <tr>
            <td class="left" align="right">&nbsp;</td>
            <td class="right">&nbsp;</td>
        </tr>
        <tr>
            <td class="left" align="right">&nbsp;</td>
            <td class="right">
            <?php
            // On affiche les boutons submit dans le <td> de droite
            for ($c = 0 ; $c < $i ; $c++)
            {
                $elem = $spec[$c];
                echo $this->{$elem->helper}(
                             (method_exists($elem,'getName')) ? $elem->getName() : '',
                             (method_exists($elem,'getValue')) ? $elem->getName() : '',    // l'attribut d'un submit est son nom !
                             (method_exists($elem,'getAttribs')) ? $elem->getAttribs() : '',
                             (method_exists($elem,'getMultiOptions')) ? $elem->getMultiOptions() : ''
                             );
                echo "&nbsp;&nbsp;";
            }     ?>
        </td></tr>
    </tbody>
  </table>
</fieldset>
</form>

Il reprend une structure tirée de divers tuto pour afficher mes formulaires comme je le désire même si je n'aime pas utiliser les table pour la présentation en général.

Si vous avez plus simple, je prends aussi, en particulier pour afficher les boutons de validation ou d'annulation, mais la n'est pas la question du jour.

Même si j'enlève le test sur "imagevideo", qui est mon élément File, et que je le laisse un ->render() au lieu du ->renderFile() utilisé dans le code, l'erreur est toujours la même.

J'ai bien conscience que les éléments file sont spéciaux puisqu'un getValue() provoque l'écriture du fichier sur le disque et qu'il faut récupérer le nom de fichier de façon détournée, mais je bloque.

J'espère que vous pourrez m'aider, car entre laisser le formulaire affiché par défaut (vraiment très moche et peu pratique) et ne pas pouvoir proposer de choix de fichier d'upload, ce n'est vraiment pas idéal. sad

Dernière modification par gmifsud (12-05-2011 11:47:59)

Hors ligne

 

#2 05-04-2011 14:58:51

gmifsud
Membre
Date d'inscription: 29-04-2010
Messages: 75

Re: [CONTOURNÉ] Zend_Form : Zend_File et décorator ?

Des précisions :

En m'inspirant d'un autre message sur ce forum datant de 2009, j'ai écrit ça dans le formulaire :

Code:

[lang=php]
$decoratorsFile =array (
        'File',
        'Errors',
        array('Description', array('tag' => 'p', 'class' => 'description')),
        array('HtmlTag', array('tag' => 'td')),
        array('Label', array('tag' => 'th')),
        array(array('tr' => 'HtmlTag'), array('tag' => 'tr')));
        
$vignette = new Zend_Form_Element_File('vignette ');
$vignette->setLabel('Vignette :')
            // Chemin de destination
            ->setDestination($thumbpath)
            // limite à 128K y compris du côté client
            ->addValidator('Size', false, 131072)
            ->setMaxFileSize(131072)
            // JPEG, PNG, GIFs
            ->addValidator('Extension', false, 'jpg,png,gif');
    //    $vignette->setDecorators(array('File', array('ViewScript', array('viewScript' => 'videos/file.phtml', 'placement' => false))));
$vignette->setDecorators($decoratorsFile);

Mais que je rajoute un décorateur ou pas à l'élément n'y change rien.
Je n'ai aucun message d'erreur, et lorsque j'affiche le contenu de $values = ($form->getValues()), je vois que :
- lorsque je n'ajoute pas de décorateur principal, $values contient un champ 'vignette ' qui est le nom du fichier uploadé.
- lorsque j'ajoute le décorateur principal au formulaire, alors ce champ 'vignette ' est NULL. sad


EDIT : en fait, ce sont toutes les valeurs renvoyées par getValues() qui sont vides ou à NULL !
Alors que sans décorateur, elles ont bien les valeurs du formulaire !

Dernière modification par gmifsud (05-04-2011 15:17:30)

Hors ligne

 

#3 12-05-2011 11:47:22

gmifsud
Membre
Date d'inscription: 29-04-2010
Messages: 75

Re: [CONTOURNÉ] Zend_Form : Zend_File et décorator ?

Je ne suis pas parvenu à résoudre le problème.
Cependant, je l'ai contourné en créant deux formulaires, et en mettant le Zend_File dans le second formulaire (sans décorateur).

L'inconvénient c'est que je ne peux donc pas sauver les données et uploader en même temps. sad
Ce n'est pas bien grave, mais c'est un peu dommage.

Dernière modification par gmifsud (12-05-2011 11:48:21)

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