Web*_*don 2 php zend-framework zend-form zend-framework2
通知:
$this->add(array(
'type' => 'Zend\Form\Element\Collection',
'name' => 'openHours',
'options' => array(
'label' => 'Hours',
'count' => 2,
'should_create_template' => true,
'template_placeholder' => '__placeholder__',
'target_element' => array(
'type' => 'Listings\Form\OpenHourFieldset',
),
),
));
Run Code Online (Sandbox Code Playgroud)
在 form.phtml
<?php $openHoursCollection = $form->get('openHours'); ?>
<?php foreach ($openHoursCollection as $collection){ ?>
<fieldset>
<?php echo $this->formSelect($collection->get('weekday')); ?>
</fieldset>
<?php } ?>
<?php echo $this->formCollection->renderTemplate($openHoursCollection); ?>
Run Code Online (Sandbox Code Playgroud)
当遍历 zend2 中的集合项以使其正常工作时,它还需要一个自定义模板。但是如何$this->formCollection->renderTemplate($collection)
渲染自定义 HTML 呢?我需要所有这些集合渲染都是自定义的
有谁知道 ?谢谢
小智 5
我不知道这是否是最好的方法,但我通过创建自己的视图助手来呈现和模板来在浏览器的 JavaSrcript 中动态添加项目,从而解决了这个问题。
创建视图助手扩展标准表单集合视图助手:
<?php
namespace App\View\Helper;
use Zend\Form\View\Helper\FormCollection;
use Zend\Form\ElementInterface;
use Zend\Form\Element\Collection as CollectionElement;
use Zend\Form\FieldsetInterface;
class ItemListFormCollection extends FormCollection
{
private $elementformat =
'<div class="form-group input-group input-group-sm">%s
<span class="input-group-btn">
<button class="btn btn-default delete" type="button">Delete</button>
</span>
</div>';
public function __invoke(ElementInterface $element = null, $wrap = true)
{
if(!$element){
return $this;
}
$this->setShouldWrap($wrap);
return $this->render($element);
}
public function render(ElementInterface $element)
{
$renderer = $this->getView();
if (!method_exists($renderer, 'plugin')) {
return '';
}
$markup = '';
$templateMarkup = '';
$escapeHtmlHelper = $this->getEscapeHtmlHelper();
$elementHelper = $this->getElementHelper();
$fieldsetHelper = $this->getFieldsetHelper();
if ($element instanceof CollectionElement && $element->shouldCreateTemplate()) {
$templateMarkup = $this->renderTemplate($element);
}
foreach ($element->getIterator() as $elementOrFieldset) {
if ($elementOrFieldset instanceof FieldsetInterface) {
$markup .= sprintf($this->elementformat,$fieldsetHelper($elementOrFieldset));
} elseif ($elementOrFieldset instanceof ElementInterface) {
$markup .= $elementHelper($elementOrFieldset);
}
}
if (!empty($templateMarkup)) {
$markup .= $templateMarkup;
}
return $markup;
}
public function renderTemplate(CollectionElement $collection)
{
$elementHelper = $this->getElementHelper();
$escapeHtmlAttribHelper = $this->getEscapeHtmlAttrHelper();
$templateMarkup = '';
$elementOrFieldset = $collection->getTemplateElement();
if ($elementOrFieldset instanceof FieldsetInterface) {
$templateMarkup .= $this->render($elementOrFieldset);
} elseif ($elementOrFieldset instanceof ElementInterface) {
$templateMarkup .= $elementHelper($elementOrFieldset);
}
$element = sprintf($this->elementformat, $templateMarkup);
return sprintf(
'<span data-template="%s"></span>',
$escapeHtmlAttribHelper($element)
);
}
}
Run Code Online (Sandbox Code Playgroud)
您可以将$elementformat变量修改为您自己的格式。
接下来你应该在 config/module.config.php 的视图助手服务管理器中注册这个助手:
...
'view_helpers' => array(
'invokables' => array(
'itemListFormCollection' => 'App\View\Helper\ItemListFormCollection'
)
),
...
Run Code Online (Sandbox Code Playgroud)
现在您可以在任何视图文件中将其用作原始 formCollection 助手:
<?php echo $this->itemListFormCollection($form->get('collection')); ?>
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1490 次 |
| 最近记录: |