Как получить доступ к тегам THEN и ELSE в TYPO3Fluid AbstractViewHelper? - PullRequest
0 голосов
/ 29 мая 2020

В TYPO3 есть новый AbstractViewHelper (TYPO3Fluid \ Fluid \ Core \ ViewHelper \ AbstractViewHelper), и я пытаюсь реализовать с его помощью очень простой InArrayViewHelper для моего проекта.

Проблема в том, что вы должны использовать render() если вы хотите получить доступ к субтегам then или else в соответствии с https://docs.typo3.org/m/typo3/book-extbasefluid/master/en-us/8-Fluid/8-developing-a-custom-viewhelper.html#renderstatic -методом

Итак, я делаю что-то вроде

<?php
namespace Vendor\Project\ViewHelpers;

use TYPO3Fluid\Fluid\Core\ViewHelper\Traits\CompileWithRenderStatic;
use TYPO3Fluid\Fluid\Core\ViewHelper\AbstractViewHelper;

class InArrayViewHelper extends AbstractViewHelper {

    //use CompileWithRenderStatic;

    public function initializeArguments() {
        $this->registerArgument('haystack', 'mixed', 'View helper haystack ', TRUE);
        $this->registerArgument('needle', 'string', 'View helper needle', TRUE);
    }

    public function render() {  
        $needle = $this->arguments['needle'];
        $haystack = $this->arguments['haystack'];
        if(!is_array($haystack)) { 
            return $this->renderElseChild();
        }
        if(in_array($needle, $haystack)) {
            return $this->renderThenChild();
        } else {
            return $this->renderElseChild();
        }  
    }

}

Ну, но они удалили там renderThenChild и renderElseChild. Как правильно это сделать. Могу ли я сделать это без использования \ TYPO3 \ CMS \ Fluid \ Core \ ViewHelper \ AbstractConditionViewHelper?

1 Ответ

1 голос
/ 31 мая 2020

Прежде всего: если вы хотите, чтобы ваш ViewHelper был условием ViewHelper, вы должны создавать подклассы TYPO3Fluid\Fluid\Core\ViewHelper\AbstractConditionViewHelper, а не TYPO3Fluid\Fluid\Core\ViewHelper\AbstractViewHelper. Первый содержит набор вспомогательных методов, например renderThenChild (который отображает либо узел f:then, либо возвращает аргумент then, в зависимости от того, что присутствует).

Второй: доступ к тегам (в отличие от закрытия, которое отображает либо тег, либо скомпилированное выполнение) может произойти только тогда, когда шаблон еще не скомпилирован, и может быть достигнуто путем переопределения public static function postParseEvent, который получает ViewHelperNode, который позволяет вам читать дочерние узлы с getChildNodes и / или добавить дополнительные дочерние узлы через addChildNode.

Реализации на основе TYPO3Fluid\Fluid\Core\ViewHelper\AbstractViewHelper и с использованием вручную зарегистрированных аргументов then и else также могут работать, но не будут поддерживать дочерние узлы, такие как f:then, без дублирования почти всех методов помощи из TYPO3Fluid\Fluid\Core\ViewHelper\AbstractConditionViewHelper.

Итак, ответ: да, вы можете сделать это без AbstractConditionViewHelper, но не должны.

...