[TYPO3中有一个新的AbstractViewHelper(TYPO3Fluid \ Fluid \ Core \ ViewHelper \ AbstractViewHelper),我尝试使用它为我的项目实现一个非常简单的InArrayViewHelper。
问题是,如果您想根据render()
访问then
或else
子标签,则应使用[C0
所以我做类似的事情
https://docs.typo3.org/m/typo3/book-extbasefluid/master/en-us/8-Fluid/8-developing-a-custom-viewhelper.html#renderstatic-method
嗯,但是他们删除了其中的<?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
。正确的方法是这样做。我可以不使用\ TYPO3 \ CMS \ Fluid \ Core \ ViewHelper \ AbstractConditionViewHelper来做到吗?
首先:如果希望ViewHelper成为ViewHelper的条件,则应该将renderElseChild
而不是TYPO3Fluid\Fluid\Core\ViewHelper\AbstractConditionViewHelper
子类化。前者包含一系列辅助方法,例如TYPO3Fluid\Fluid\Core\ViewHelper\AbstractViewHelper
(呈现renderThenChild
节点或返回f:then
自变量,以存在者为准)。
第二:访问tags(与呈现标记或编译后的执行的闭包相反)只能在模板尚未编译时发生,并且可以通过覆盖接收到的then
来实现public static function postParseEvent
允许您使用ViewHelperNode
读取子节点和/或通过getChildNodes
添加其他子节点。
基于addChildNode
并使用手动注册的TYPO3Fluid\Fluid\Core\ViewHelper\AbstractViewHelper
和then
参数的实现也可以工作,但是如果不复制else
中的几乎所有辅助方法,则将不支持像f:then
这样的子节点。>
所以答案是:是的,您可以在没有TYPO3Fluid\Fluid\Core\ViewHelper\AbstractConditionViewHelper
的情况下做到这一点-但您不应该这样做。