сообщить:
$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',
),
),
));
в 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); ?>
При переборе элементов коллекции в zend2 для правильной работы ему также потребуется собственный шаблон. но как получить $this->formCollection->renderTemplate($collection)
визуализировать пользовательский HTML?
Мне нужно, чтобы весь этот рендеринг коллекции был на заказ
Кто-нибудь знает?
Спасибо
Я не знаю, является ли это лучшим подходом, но я решил эту проблему, создав свой собственный помощник вида для рендеринга и шаблон для динамического добавления элементов в 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)
);
}
}
Вы можете изменить $elementformat
переменная в ваш собственный формат.
Далее Вы должны зарегистрировать этого помощника в диспетчере служб помощника представления в config / module.config.php:
...
'view_helpers' => array(
'invokables' => array(
'itemListFormCollection' => 'App\View\Helper\ItemListFormCollection'
)
),
...
И теперь вы можете использовать его как оригинальный помощник formCollection в любом файле представления:
<?php echo $this->itemListFormCollection($form->get('collection')); ?>
Других решений пока нет …