Zend Form File, Как указать пользователю, что файл был ранее загружен? - PullRequest
3 голосов
/ 11 сентября 2010

У меня есть Zend-форма, которая позволяет пользователю заполнять атрибуты объекта. Например, музыкальный художник. Форма содержит основную информацию об исполнителе, такие как имя, номер телефона, адрес и т. Д., Но также имеет поле для загрузки файла. Если пользователь загружает файл, он сохраняется с этим экземпляром объекта в базе данных (по существу, строкой), если пользователь когда-либо захочет редактировать этот конкретный экземпляр, форма заполняется информацией об объектах. Однако форма не заполняет информацию о загрузке файла, потому что она не собирается перезагружать ее.

Как я могу сообщить пользователю, что файл уже загружен, указать, какой это был файл, и, возможно, даже ссылку на него? что-то похожее на заполнение элементов формы является предпочтительным. В идеале я хотел бы предложить пользователю возможность загружать поверх ранее загруженного файла, поэтому элемент загрузки файла должен остаться. Любая идея? Большое спасибо за чтение.

Ура, Джо Чин

Ответы [ 2 ]

6 голосов
/ 13 сентября 2010

Самый быстрый способ, который я нашел, чтобы реализовать это, было объединить ответ от 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)
            )));
    }

    ...
}}

Просмотр сценария для обработки сведений о файле и элемента формы:

<!-- 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>

Наконец, в контроллере у меня есть:

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

    ...

}

Это должно дать вам что-то похожее:

alt text

2 голосов
/ 12 сентября 2010

Как я могу сообщить пользователю, что файл уже загружен, указать, какой это был файл и, возможно, даже ссылку на него?

Я бы распечатал ранее загруженный файл.

Для этого вы можете использовать декоратор форм.Это эскиз, который необходимо изменить и реорганизовать с учетом безопасности, но он распечатывает тег изображения. (Если вы хотите отобразить список файлов, в конце есть подсказка.)

// has to override a File-decorator in my case
class ArtistDecorator extends Zend_Form_Decorator_File {
    private $_artistId;
    public function __construct($options = array()) {
        if(isset($options['artistId'])) {
            $this->_artistId = $options['artistId'];
            unset($options['artistId']);
        }
        return parent::__construct($options);
    }

    public function render($content) {
        return '<img src="/images/'.$this->_artistId.'.jpg" />'.$content;
    }
}

class Application_Form_Login extends Zend_Form{
    private $_artistId;

    public function __construct($options = array()) {
        if(isset($options['artistId'])) {
            $this->_artistId = $options['artistId'];
            unset($options['artistId']);
        }
        return parent::__construct($options);
    }

    public function init() {
        $this
            ->setAction('/')
            ->setMethod('post');
        $el = new Zend_Form_Element_File('image');
        if($this->_artistId) {
            $el->setDecorators(array(new ArtistDecorator(array('artistId' => 3))));
        }       
        $this->addElement($el);
    }
}

Вы не должны заполнять файл-элемент , поскольку вы не хотите, чтобы он загружал один и тот же файл снова и снова и снова.

Если файл (ы) в формате mp3 или около того: следуйте той же процедуре, но используйте вывод наподобие:

<ul>
  <li><a href="/music/song_1.mp3">Song 1</a></li>
  <li><a href="/music/song_2.mp3">Song 2</a></li>
</ul>

Вставьте «песни» в конструктор формы.

...