Comment puis-je utiliser ViewScripts sur Zend_Form les Éléments du Fichier?
Je suis en utilisant ce ViewScript pour mon formulaire standard des éléments:
<div class="field" id="field_<?php echo $this->element->getId(); ?>">
<?php if (0 < strlen($this->element->getLabel())) : ?>
<?php echo $this->formLabel($this->element->getName(), $this->element->getLabel());?>
<?php endif; ?>
<span class="value"><?php echo $this->{$this->element->helper}(
$this->element->getName(),
$this->element->getValue(),
$this->element->getAttribs()
) ?></span>
<?php if (0 < $this->element->getMessages()->length) : ?>
<?php echo $this->formErrors($this->element->getMessages()); ?>
<?php endif; ?>
<?php if (0 < strlen($this->element->getDescription())) : ?>
<span class="hint"><?php echo $this->element->getDescription(); ?></span>
<?php endif; ?>
</div>
Essayer de l'utiliser ViewScript seul conduit à une erreur:
Exception interceptée par le formulaire: Aucun fichier
décorateur trouvé dans l'impossibilité de rendre...
fichier élément
Regardant cette FAQ a révélé une partie de mon problème, et j'ai mis à jour mon élément de formulaire décorateurs comme ceci:
'decorators' => array(
array('File'),
array('ViewScript', array('viewScript' => 'form/field.phtml'))
)
Maintenant, c'est le rendu de l'élément du fichier deux fois, une fois dans mon script de vue, et des éléments supplémentaires avec le fichier de l'élément à l'extérieur de mon script de vue:
<input type="hidden" name="MAX_FILE_SIZE" value="8388608" id="MAX_FILE_SIZE" />
<input type="hidden" name="UPLOAD_IDENTIFIER" value="4b5f7335a55ee" id="progress_key" />
<input type="file" name="upload_file" id="upload_file" />
<div class="field" id="field_upload_file">
<label for="upload_file">Upload File</label>
<span class="value"><input type="file" name="upload_file" id="upload_file" /></span>
</div>
Des idées sur la façon de gérer cela correctement avec un ViewScript?
Mise à JOUR: Basé sur Shaun de la solution, voici mon code final:
Élément De Formulaire:
$this->addElement('file', 'upload_file', array(
'disableLoadDefaultDecorators' => true,
'decorators' => array('File', array('ViewScript', array(
'viewScript' => '_form/file.phtml',
'placement' => false,
))),
'label' => 'Upload',
'required' => false,
'filters' => array(),
'validators' => array(array('Count', false, 1),),
));
Script De Vue:
<?php
$class .= 'field ' . strtolower(end(explode('_',$this->element->getType())));
if ($this->element->isRequired()) {
$class .= ' required';
}
if ($this->element->hasErrors()) {
$class .= ' errors';
}
?>
<div class="<?php echo $class; ?>" id="field_<?php echo $this->element->getId(); ?>">
<?php if (0 < strlen($this->element->getLabel())): ?>
<?php echo $this->formLabel($this->element->getFullyQualifiedName(), $this->element->getLabel());?>
<?php endif; ?>
<span class="value"><?php echo $this->content; ?></span>
<?php if ($this->element->hasErrors()): ?>
<?php echo $this->formErrors($this->element->getMessages()); ?>
<?php endif; ?>
<?php if (0 < strlen($this->element->getDescription())): ?>
<p class="hint"><?php echo $this->element->getDescription(); ?></p>
<?php endif; ?>
</div>
Vous devez vous connecter pour publier un commentaire.
La réponse est relativement simple, comme il arrive. Tout ce que vous devez faire est de spécifier le Fichier de décorateur d'abord, créer un script de vue pour le fichier d'entrée et spécifiez false pour le placement dans l'viewScript décorateur d'arguments, cela aura pour effet d'injecter de la sortie du Fichier de décorateur dans le viewScript décorateur p. ex.
Puis dans le nouveau fichier de vue de l'élément script que vous simplement echo $this->contenu dans le script où vous souhaitez que le fichier d'entrée de balisage pour être placé. Voici un exemple à partir d'un projet récent, donc ignorer le balisage si cela semble un peu bizarre, j'espère qu'il va illustrer ce point.
Lors du rendu que vous verrez ce html pour l'élément
Ce n'est pas une simple ou une solution idéale car elle exige une extension de Fichier décorateur... mais c'est plutôt frustrant qu'ils ne font pas l'effort de séparer l'élément masqué logique de génération du fichier d'entrée logique de génération. Je ne suis pas sûr si le fichier à l'aide des poignées de l'émission d'un élément d'un tableau (qui semble être la raison pour laquelle ils ont fait cela de cette façon.)
Extension de Fichier Décorateur:
(le commentaire sur la partie est quelles sont les causes de l'apport supplémentaire d'être généré.)
Formulaire de configuration de contrôleur de l'action:
Dans l'action de la vue:
Dans l'élément script:
la Sortie devrait être:
Un problème avec cette solution est que les éléments cachés ne sont pas rendus dans le viewscript; ce pourrait être un problème si vous êtes à l'aide de la div comme un sélecteur dans un script côté client...
Ce que j'ai réalisé, c'est que, une coutume décorateur classe de gérer la plupart des champs, à l'exception des champs de Fichier.
Assurez-vous que votre classe implémente l'interface comme suit:
Cela a fonctionné pour moi.
Cela m'a aidé à résoudre mon problème. J'ai modifié le code pour envelopper le fichier de l'élément à l'intérieur d'un tableau. Pour le faire fonctionner, il suffit de retirer l'étiquette de la viewdecorator et ajouter l'élément du fichier comme suit:
J'ai trouvé une façon de contourner ce qui évite la ViewScript tout à fait.
Tout d'abord, la définition de l'élément:
Deuxième, après la classe de formulaire a été instancié, je imitent le comportement de mes ViewScript:
Je suppose que je devrais regarder dans la classe de base des décorateurs. Peut-être il y a plus de flexibilité là?
La meilleure chose à faire est de ne pas ajouter de balisage à tous pour la sortie dans le Fichier de personnalisation Décorateur:
maintenant, vous pouvez faire ce que vous voulez dans votre viewscript pour cet élément de fichier (sortie le champ de saisie fichier et tous les champs cachés dont vous avez besoin sur votre propre).
Juste au cas où vous avez suivi @Shaun réponse et vous obtenez toujours l'erreur: assurez-vous que vous avez désactivé par défaut décorateurs pour l'élément en question (jeter un regard à la ligne 2):