Как использовать помощник вида формы в помощнике пользовательского представления в Zend Framework 2

Я создаю помощник пользовательского представления. и я хочу знать, как я могу использовать formElement "Zend\Form\View\Helper\FormElement" в моем собственном вспомогательном представлении. Вот мой код.

use Zend\Form\ElementInterface;
use Zend\Form\FieldsetInterface;
use Zend\Form\View\Helper\FormElement;
use Zend\Form\View\Helper\AbstractHelper;
use Zend\View\Renderer\PhpRenderer;

class JudgeCareerViewHelper extends AbstractHelper {
    private $output;
    public function __invoke($formCollection) {
    foreach ($formCollection as $elementOrFieldset) {
        if ($elementOrFieldset instanceof FieldsetInterface) {
            $obj = new FormElement();
            $this->output .= $obj($elementOrFieldset->get('startServiceDate'));
        } elseif ($elementOrFieldset instanceof ElementInterface) {
            //set element markup
            echo 'element';
        }
    };
    echo $this->output;

    die();
 }
}

Когда я echo, выходной сигнал от FormElement пуст. Поэтому я открыл библиотеку Zend "Zend\Form\View\Helper\FormElement", чтобы узнать, в чем проблема. Итак, я обнаружил, что ниже код возвращается пустым. Я не знаю, какова цель $renderer = $this->getView(); и как получить представление.

$renderer = $this->getView();
        if (!method_exists($renderer, 'plugin')) {
            // Bail early if renderer is not pluggable
            return '';
        }

Цель создания пользовательского помощника представления для создания моей собственной разметки (HTML) вместо zend buitin html.


person Aneeq Tariq    schedule 02.09.2014    source источник


Ответы (2)


Итак, я обнаружил, что код $renderer = $this->getView() возвращается пустым.

Вам нужно будет убедиться, что помощник представления не создается напрямую с помощью new, а вызывается через метод Zend\View\HelperPluginManager.

Я подозреваю, что проблема в том, что он неправильно зарегистрирован в диспетчере служб как класс invokable.

// Module.php
public function getViewHelperConfig()
{
    return array(
        'invokables' => array(
            'JudgeCareer'
                => 'FooModule\Form\View\Helper\JudgeCareerViewHelper',  
        ),
    );
 }

Это делается для того, чтобы Zend\View\Renderer\PhpRenderer внедрялся как просмотреть.

После того, как JudgeCareerViewHelper внедрил «представление», он сможет вызывать другие плагины представления и загружать их правильно, опять же через HelperPluginManager.

Линия:

$obj = new FormElement();

Тогда должно быть

$object = $this->getView()->plugin('form_element');
person AlexP    schedule 02.09.2014
comment
Спасибо, Вы решили мою проблему. Я потратил 2 дня, чтобы понять, в чем проблема! Откуда вы знаете, что я не должен напрямую создавать экземпляр $obj = new FormElement(); а не $object = $this-›getView()-›plugin('form_element'); ? - person Aneeq Tariq; 03.09.2014

Вы можете вызвать любой помощник представления из вашего пользовательского помощника представления, используя

$this->getView()->anyRegisteredViewHelper();

Таким образом, в вашем случае для вызова ZF2, встроенного в помощники рендеринга формы, вы должны использовать:

$this->getView()->formElement($element);

При этом $element является вашим объектом элемента формы (Select/Textarea/Checkbox и т.д.)

Конечно, вы также можете вызывать явные помощники для конкретных элементов:

$this->getView()->formTextarea($textareaElement);
person matwr    schedule 02.09.2014