element->getLabel())) : ?> formLabel($th-6ren">
gpt4 book ai didi

zend-framework - 如何在 Zend_Form 文件元素上使用 ViewScripts?

转载 作者:行者123 更新时间:2023-12-03 12:44:02 26 4
gpt4 key购买 nike

我将这个 ViewScript 用于我的标准表单元素:

<div class="field" id="field_<?php echo $this->element->getId(); ?>">
<?php if (0 < strlen($this->element->getLabel())) : ?>
<?php echo $this->formLabel($this->element->getName(), $this->element->getLabel());?>
<?php endif; ?>
<span class="value"><?php echo $this->{$this->element->helper}(
$this->element->getName(),
$this->element->getValue(),
$this->element->getAttribs()
) ?></span>
<?php if (0 < $this->element->getMessages()->length) : ?>
<?php echo $this->formErrors($this->element->getMessages()); ?>
<?php endif; ?>
<?php if (0 < strlen($this->element->getDescription())) : ?>
<span class="hint"><?php echo $this->element->getDescription(); ?></span>
<?php endif; ?>
</div>

尝试单独使用该 ViewScript 会导致错误:

Exception caught by form: No file decorator found... unable to render file element



this FAQ揭示了我的部分问题,我更新了我的表单元素装饰器,如下所示:
'decorators' => array(
array('File'),
array('ViewScript', array('viewScript' => 'form/field.phtml'))
)

现在它渲染文件元素两次,一次在我的 View 脚本中,以及在我的 View 脚本之外的文件元素的额外元素:
<input type="hidden" name="MAX_FILE_SIZE" value="8388608" id="MAX_FILE_SIZE" />
<input type="hidden" name="UPLOAD_IDENTIFIER" value="4b5f7335a55ee" id="progress_key" />
<input type="file" name="upload_file" id="upload_file" />
<div class="field" id="field_upload_file">
<label for="upload_file">Upload File</label>
<span class="value"><input type="file" name="upload_file" id="upload_file" /></span>
</div>

关于如何使用 ViewScript 正确处理此问题的任何想法?

更新:基于 Shaun 的解决方案,这是我的最终代码:

表单元素:
$this->addElement('file', 'upload_file', array(
'disableLoadDefaultDecorators' => true,
'decorators' => array('File', array('ViewScript', array(
'viewScript' => '_form/file.phtml',
'placement' => false,
))),
'label' => 'Upload',
'required' => false,
'filters' => array(),
'validators' => array(array('Count', false, 1),),
));

查看脚本:
<?php
$class .= 'field ' . strtolower(end(explode('_',$this->element->getType())));
if ($this->element->isRequired()) {
$class .= ' required';
}
if ($this->element->hasErrors()) {
$class .= ' errors';
}
?>
<div class="<?php echo $class; ?>" id="field_<?php echo $this->element->getId(); ?>">
<?php if (0 < strlen($this->element->getLabel())): ?>
<?php echo $this->formLabel($this->element->getFullyQualifiedName(), $this->element->getLabel());?>
<?php endif; ?>
<span class="value"><?php echo $this->content; ?></span>
<?php if ($this->element->hasErrors()): ?>
<?php echo $this->formErrors($this->element->getMessages()); ?>
<?php endif; ?>
<?php if (0 < strlen($this->element->getDescription())): ?>
<p class="hint"><?php echo $this->element->getDescription(); ?></p>
<?php endif; ?>
</div>

最佳答案

答案是相对简单的。您需要做的就是首先指定 File 装饰器,为文件输入创建一个特定的 View 脚本,并在 viewScript 装饰器参数中为放置指定 false,这将有效地将 File 装饰器的输出注入(inject)到 viewScript 装饰器中,例如

$element->setDecorators(array('File', array('ViewScript', array('viewScript' => 'decorators/file.phtml', 'placement' => false))));

然后在新的文件元素 View 脚本中,您只需在脚本中回显 $this->content 您希望放置文件输入标记的位置。这是最近项目的一个例子,所以如果它看起来有点奇怪,请忽略标记,希望它能说明这一点。
<label for="<?php echo $this->element->getName(); ?>" class="element <?php if ($this->element->hasErrors()): ?> error<?php endif; ?>" id="label_<?php echo $this->element->getName(); ?>"> 
<span><?php echo $this->element->getLabel(); ?></span>

<?php echo $this->content; ?>

<?php if ($this->element->hasErrors()): ?>

<span class="error">
<?php echo $this->formErrors($this->element->getMessages()); ?>
</span>

<?php endif; ?>

</label>

渲染后,您将看到该元素的 html
<label for="photo" class="element" id="label_photo"> 
<span>Photo</span>

<input type="hidden" name="MAX_FILE_SIZE" value="6291456" id="MAX_FILE_SIZE">
<input type="file" name="photo" id="photo">

</label>

关于zend-framework - 如何在 Zend_Form 文件元素上使用 ViewScripts?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2143462/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com