Le moyen le plus rapide que j'ai trouvé pour obtenir cette implémentation était de combiner the answer from Chelmertz avec this thread. Au lieu de définir un décorateur pour montrer le fichier précédemment téléchargé, je place le lien dans la description de l'élément et ensuite je le jette dans un script de vue.
La solution finale ressemble à ceci:
Zend Form fichier:
class Application_Form_LabDetails extends Zend_Form{
private $_uploadPath;
private $_artistID;
private $_singleFile;
public function __construct($options = array()) {
if(isset($options['uploadPath'])) {
$this->_uploadPath = $options['uploadPath'];
unset($options['uploadPath']);
}
if(isset($options['artistID'])) {
$this->_artistID = sprintf("%06s",(string)$options['artistID']);
unset($options['artistID']);
}
if(isset($options['singleFile'])) {
$this->_singleID = $options['singleFile'];
unset($options['singleFile']);
}
return parent::__construct($options);
}
public function init()
{
$this->setName('artistDetails');
...
$singleID = $this->createElement('file', '$singleFile');
$singleID->setLabel('Current Single')
->setDestination('data/uploads')
->addValidator('count',true, 1)
->addValidator('Size', true, 5242880)
->addValidator('Extension', true, 'mp3');
if($this->_cocFile){
$singleID->setDescription(
'<a href="/'.$this->_uploadPath.'/'.$this->_artistID
.$this->_singleFile.'" taget="_blank">'
.$this->_singleFile.'</a>')
->setDecorators(
array('File',
array('ViewScript',
array('viewScript' => 'artist/file.phtml', 'placement' => false)
)));
}
...
}}
Voir script pour gérer les détails du fichier et de l'élément de forme:
<!-- decorator through view script, placed in 'views/scripts/controller/file.phtml' -->
<!-- outputs form label markup -->
<dt id="<?php echo $this->element->getName(); ?>-label">
<label for="<?php echo $this->element->getName(); ?>"
class="<?php if ($this->element->isRequired()): ?>required<?php endif; ?>">
<?php echo $this->element->getLabel(); ?></label><br />
<span>Uploaded: <?php echo $this->element->getDescription(); ?></span>
</dt>
<!-- outputs form element markup -->
<dd id="<?php echo $this->element->getName(); ?>-element">
<?php echo $this->content; ?>
<?php if ($this->element->hasErrors()): ?>
<ul class="error">
<?php echo $this->formErrors($this->element->getMessages()); ?>
</ul>
<?php endif; ?>
</dd>
Enfin dans le contrôleur je:
//$id is taken from the URI
if ($id > 0) {
$artistDetails = new Application_Model_DbTable_ArtistDetails();
$artistData = $artistDetails->getArtistDetails($id);
$options = array(
'uploadPath' => $config->uploads->labs->path,
'artistID' => $artistData['a_id'],
'singleFile' => $artistData['a_singleFile'],
);
$form = new Application_Form_LabDetails($options);
...
}
Cela devrait vous donner quelque chose qui ressemble à:

Salut, nu avec moi comme je l'ai utilisé Zend pendant environ un mois.Dans mon contrôleur j'ai la ligne $ form-> options = array ('trackName' => 'trackFileName'); Je reçois cette erreur: "Message: Aucun élément valide spécifié pour le groupe d'affichage" Je crois que c'est parce que $ options n'est pas un élément de formulaire défini. Comment puis-je pousser ce tableau à la forme pour le décorateur? Merci – JoeChin
Salut, s'il vous plaît ne tenez pas compte de mon dernier commentaire, avec un peu plus de googling j'ai trouvé que je pouvais passer le tableau en utilisant: $ form = new Zend_Form (array()); – JoeChin
Oui, vous devriez essayer de déplacer la logique du formulaire hors de vos contrôleurs afin que le formulaire puisse facilement être réutilisé dans plusieurs actions (même si ce n'est pas souhaitable, c'est une très bonne pratique de séparation). Faites nous savoir comment cela marche. – chelmertz