Zend Form File, Как указать пользователю, что файл был ранее загружен?
У меня есть Zend-форма, которая позволяет пользователю заполнять атрибуты объекта. Например, музыкальный художник. Форма содержит основную информацию об исполнителе, такие как имя, номер телефона, адрес и т. Д., Но также имеет поле для загрузки файла. Если пользователь загружает файл, он сохраняется с этим экземпляром объекта в базе данных (по существу, строкой), если пользователь когда-либо хочет редактировать этот конкретный экземпляр, форма заполняется информацией об объектах. Однако форма не заполняет информацию о загрузке файла, потому что она не собирается перезагружать ее.
Как я могу сообщить пользователю, что файл уже был загружен, указать, какой это был файл и, возможно, даже ссылку на него? что-то похожее на заполнение элементов формы является предпочтительным. В идеале я хотел бы предложить пользователю возможность загружать поверх ранее загруженного файла, поэтому элемент загрузки файла должен остаться. Любая идея? Большое спасибо за чтение.
Ура, Джо Чин
2 ответа
Самый быстрый способ, который я нашел, чтобы реализовать это, состоял в том, чтобы объединить ответ от 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);
...
}
Это должно дать вам что-то похожее на:
Как я могу сообщить пользователю, что файл уже был загружен, указать, какой это был файл и, возможно, даже ссылку на него?
Я бы распечатал ранее загруженный файл.
Для этого вы можете использовать декоратор форм. Это эскиз, который необходимо изменить и изменить с точки зрения безопасности, но он распечатывает тег изображения. (Если вы предпочитаете отображать список файлов, в конце есть подсказка.)
// 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>
Введите "песни" в конструктор формы.