猿问

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

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


问题是,如果您想根据https://docs.typo3.org/m/typo3/book-extbasefluid/master/en-us/8-Fluid/8-developing-a-render()访问then或子标签,您应该使用custom-viewhelper.html#renderstatic-methodelse


所以我做了类似的事情


<?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 吗?


温温酱
浏览 109回答 1
1回答

桃花长相依

首先:如果你想让你的 ViewHelper 成为一个条件 ViewHelper 你应该子类化TYPO3Fluid\Fluid\Core\ViewHelper\AbstractConditionViewHelper,而不是TYPO3Fluid\Fluid\Core\ViewHelper\AbstractViewHelper。前者包含辅助方法的集合,例如renderThenChild(呈现节点f:then或返回then参数,以存在者为准)。第二:访问标签(与呈现标签或编译执行的闭包相反)只能在模板尚未编译时发生,并且可以通过覆盖public static function postParseEventwhich receives whichViewHelperNode允许您读取子节点来实现通过.withgetChildNodes和/或添加额外的子节点addChildNode。基于TYPO3Fluid\Fluid\Core\ViewHelper\AbstractViewHelper和使用手动注册then和else参数的实现也可以工作,但不支持子节点,例如f:then不复制几乎所有来自TYPO3Fluid\Fluid\Core\ViewHelper\AbstractConditionViewHelper.所以答案是:是的,你可以不用AbstractConditionViewHelper- 但你不应该这样做。
随时随地看视频慕课网APP
我要回答