Zend_Form文件字段分隔符

时间:2011-11-23 08:26:51

标签: php zend-form zend-decorators zend-framework

我在按照我想要的方式塑造表单布局时遇到了一些麻烦。这里的问题不是解析文件元素本身,问题来自函数:$file->setMultiFile(3)。我似乎无法在多个文件输入元素之间放置一个分隔符,导致它们放在一行后面。

这是我创建文件元素的方式:

$oElement = new Zend_Form_Element_File('file');
$oElement->setLabel('File')
    ->setMultiFile(3)
    ->setDestination('location on server');
$this->addElement($oElement);

然后我添加装饰器:

$this->getElement('file')->setDecorators(array(
    'File',
    'Errors',
     array(array('td' => 'HtmlTag'), array('tag' => 'td')),
     array('Label', array('tag' => 'td')),
     array(array('tr' => 'HtmlTag'), array('tag' => 'tr'))
));

目前的输出是:

<tr>
    <td id="file-label">
        <label class="optional" for="file">File</label>
    </td>
    <td>
        <input type="file" id="file-0" name="file[]">
        <input type="file" id="file-1" name="file[]">
        <input type="file" id="file-2" name="file[]">
    </td>
</tr>

我想要的是在输入元素之间有一个<br />,因此它们不会放在一行上。这可以通过装饰者吗?使用radio / mutliselect / multicheckbox有一个setSeparator函数可以执行此操作,但文件元素的情况似乎并非如此。

有人可以帮帮我吗? 提前谢谢,

伊利安

1 个答案:

答案 0 :(得分:2)

这可能有点作弊,但以下内容适合您:

$fd = $oElement->getDecorator('File');

$fd->setOption('placement', 'PREPEND')
   ->setOption('separator', '<br />');

您可以在将元素附加到表单并更改装饰器之后放置该代码。

Zend_Form_Decorator_File的render()方法在创建标记时使用分隔符,但它们无法设置它。放置和分隔符的设置被列入黑名单,但使用上述技巧,您仍可以设置它们。

在Zend_Form_Decorator_File中渲染():

$separator = $this->getSeparator();
$placement = $this->getPlacement();
//...

// in a loop, create the array of input elements
$markup[] = $view->formFile($name, $htmlAttribs);

//...
// join each file element by separator, which cannot be set with setSeparator()
$markup = implode($separator, $markup);

我必须将展示位置设置为PREPEND,否则在使用APPEND时会<br />*file input*<br />*file input*<br />*file input*

希望有所帮助。