你如何访问 TYPO3Fluid AbstractViewHelper 中的 THEN 和 ELSE 标签?

How do you access THEN and ELSE tag in TYPO3Fluid AbstractViewHelper?

TYPO3 中有一个新的 AbstractViewHelper (TYPO3Fluid\Fluid\Core\ViewHelper\AbstractViewHelper),我尝试用它在我的项目中实现一个非常简单的 InArrayViewHelper。

问题是如果您想根据 https://docs.typo3.org/m/typo3/book-extbasefluid/master/en-us/8-Fluid/8-developing-a-custom-viewhelper.html#renderstatic-method

访问 thenelse 子标签,您应该使用 render()

所以我做了类似的事情

<?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();
        }  
    }

}

嗯,但是他们删除了那里的 renderThenChildrenderElseChild。这样做的正确方法是什么。我可以不使用 \TYPO3\CMS\Fluid\Core\ViewHelper\AbstractConditionViewHelper 吗?

首先:如果您希望 ViewHelper 成为条件 ViewHelper,您应该子类化 TYPO3Fluid\Fluid\Core\ViewHelper\AbstractConditionViewHelper,而不是 TYPO3Fluid\Fluid\Core\ViewHelper\AbstractViewHelper。前者包含一系列辅助方法,例如renderThenChild(呈现 f:then 节点或 returns then 参数,以存在者为准。

其次:访问标签(与呈现标签或编译执行的闭包相反)只能在模板尚未编译时发生,并且可以通过覆盖接收 ViewHelperNodepublic static function postParseEvent 来实现,它允许您使用 getChildNodes and/or 读取子节点 通过 addChildNode.[=25 添加额外的子节点=]

基于 TYPO3Fluid\Fluid\Core\ViewHelper\AbstractViewHelper 并使用手动注册的 thenelse 参数的实现也可以工作,但不支持像 f:then 这样的子节点而不复制几乎所有的来自TYPO3Fluid\Fluid\Core\ViewHelper\AbstractConditionViewHelper.

的辅助方法

所以答案是:是的,你可以不用 AbstractConditionViewHelper - 但你不应该。