【问题标题】:Zend_Form file field separatorZend_Form 文件字段分隔符
【发布时间】:2012-01-04 13:29:17
【问题描述】:

我在按我希望的方式调整表单布局时遇到了一些问题。这里的问题不是修饰文件元素本身,问题在于函数:$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>

我想要的是在输入元素之间有一个&lt;br /&gt;,这样它们就不会放在一行上。这可以通过装饰器实现吗?使用 radio/mutliselect/multicheckbox 有一个 setSeparator 函数可以执行此操作,但文件元素似乎不是这种情况。

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

伊莲

【问题讨论】:

  • 用 jQuery 附加它作为快速修复?
  • 试图避免使用视图脚本,但我想如果没有其他问题出现,它会做。谢谢。
  • 利用视图助手的力量! ;)

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


【解决方案1】:

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

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

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

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

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

在 Zend_Form_Decorator_File render() 中:

$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 时会出现 &lt;br /&gt;*file input*&lt;br /&gt;*file input*&lt;br /&gt;*file input*

希望对您有所帮助。

【讨论】:

  • 感谢您的回复。它工作得很好,除了一件事,最大文件大小。当使用$fileElement-&gt;addValidator('Size', false, 102400); 时,它会在字段顶部添加一个隐藏输入。通常这不是问题,但是使用分隔符会在隐藏字段之后添加&lt;br /&gt;,从而导致文件字段放置错误。有没有办法解决这个问题?
  • 刚刚查看了Zend_Form_Decorator_File 类,发现它是在渲染函数中设置的。不要以为我可以更改添加隐藏字段的方式。我想我得找个 ViewHelper 了。
  • 如果你添加像input[type="hidden"] { margin: 0; padding: 0 }这样的css,它可能有助于修复展示位置。
  • 元素是否可见并不重要,重要的是隐藏元素是否存在。因为它在那里,所以它与其他元素分开,这意味着它们之间有一个&lt;br /&gt;。由于隐藏元素没有显示,它只在第一个文件字段上方显示&lt;br /&gt;。因此它不合适。
  • 对不起,我之前误解了。我检查了 Zend 文件,没有办法阻止 &lt;br /&gt; 出现在隐藏的表单元素之后。如果您设置最大尺寸,则会添加一个使用分隔符的隐藏表单元素;如果加载了 APC 或上传进度扩展并且向任一插件注册了进度回调,情况也是如此。我看到的唯一解决方法是不要在文件元素上设置最大大小,而是使用formHidden 帮助程序自己手动将其添加到表单中,或者在上传时不设置文件大小限制并自己验证。希望对您有所帮助。
猜你喜欢
  • 2013-10-16
  • 2015-08-02
  • 2015-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-14
相关资源
最近更新 更多