Zend表单文件,如何向用户表明以前上传过文件?

Joe*_*hin 3 zend-framework zend-form zend-file

我有一个zend表单,允许用户填写对象的属性.例如,音乐艺术家.窗体有关于艺术家,像姓名,电话号码,地址,并没有什么基本信息,但它也有一个文件上传域.如果用户上传文件,其存储在数据库(本质上是一个行)对象的这种情况下,如果用户曾经想要编辑这种特定情况下,形式重新填充与对象的信息.但是,表单不会重新填充文件上载信息,因为它不会重新上载它.

如何向用户发出已经上传文件的信号,指出它是哪个文件,甚至可能链接到该文件?类似于填充表单元素的东西是首选.理想情况下,我希望能够为用户提供上传以前上传的文件的功能,因此文件上传元素应该保留.任何的想法?非常感谢阅读.

干杯,Joe Chin

Joe*_*hin 6

我发现实现这一目标的最快方法是将Chelmertz的答案此线程结合起来.

我没有定义装饰器来显示先前上传的文件,而是将链接放在元素的描述中,然后将其转储到视图脚本中.

最终解决方案如下所示:

Zend表格文件:

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)
            )));
    }

    ...
}}
Run Code Online (Sandbox Code Playgroud)

查看脚本以处理文件详细信息和表单元素:

<!-- 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>
Run Code Online (Sandbox Code Playgroud)

最后在控制器中我有:

//$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);

    ...

}
Run Code Online (Sandbox Code Playgroud)

这应该给你一些看起来像:

替代文字