Как создать собственный шаблон для коллекции в Zend2

сообщить:

$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?
Мне нужно, чтобы весь этот рендеринг коллекции был на заказ

Кто-нибудь знает?
Спасибо

1

Решение

Я не знаю, является ли это лучшим подходом, но я решил эту проблему, создав свой собственный помощник вида для рендеринга и шаблон для динамического добавления элементов в 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')); ?>
3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]