你如何访问 TYPO3Fluid AbstractViewHelper 中的 THEN 和 ELSE 标签?
How do you access THEN and ELSE tag in TYPO3Fluid AbstractViewHelper?
TYPO3 中有一个新的 AbstractViewHelper (TYPO3Fluid\Fluid\Core\ViewHelper\AbstractViewHelper),我尝试用它在我的项目中实现一个非常简单的 InArrayViewHelper。
访问 then
或 else
子标签,您应该使用 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();
}
}
}
嗯,但是他们删除了那里的 renderThenChild
和 renderElseChild
。这样做的正确方法是什么。我可以不使用 \TYPO3\CMS\Fluid\Core\ViewHelper\AbstractConditionViewHelper 吗?
首先:如果您希望 ViewHelper 成为条件 ViewHelper,您应该子类化 TYPO3Fluid\Fluid\Core\ViewHelper\AbstractConditionViewHelper
,而不是 TYPO3Fluid\Fluid\Core\ViewHelper\AbstractViewHelper
。前者包含一系列辅助方法,例如renderThenChild
(呈现 f:then
节点或 returns then
参数,以存在者为准。
其次:访问标签(与呈现标签或编译执行的闭包相反)只能在模板尚未编译时发生,并且可以通过覆盖接收 ViewHelperNode
的 public static function postParseEvent
来实现,它允许您使用 getChildNodes
and/or 读取子节点 通过 addChildNode
.[=25 添加额外的子节点=]
基于 TYPO3Fluid\Fluid\Core\ViewHelper\AbstractViewHelper
并使用手动注册的 then
和 else
参数的实现也可以工作,但不支持像 f:then
这样的子节点而不复制几乎所有的来自TYPO3Fluid\Fluid\Core\ViewHelper\AbstractConditionViewHelper
.
的辅助方法
所以答案是:是的,你可以不用 AbstractConditionViewHelper
- 但你不应该。
TYPO3 中有一个新的 AbstractViewHelper (TYPO3Fluid\Fluid\Core\ViewHelper\AbstractViewHelper),我尝试用它在我的项目中实现一个非常简单的 InArrayViewHelper。
访问then
或 else
子标签,您应该使用 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();
}
}
}
嗯,但是他们删除了那里的 renderThenChild
和 renderElseChild
。这样做的正确方法是什么。我可以不使用 \TYPO3\CMS\Fluid\Core\ViewHelper\AbstractConditionViewHelper 吗?
首先:如果您希望 ViewHelper 成为条件 ViewHelper,您应该子类化 TYPO3Fluid\Fluid\Core\ViewHelper\AbstractConditionViewHelper
,而不是 TYPO3Fluid\Fluid\Core\ViewHelper\AbstractViewHelper
。前者包含一系列辅助方法,例如renderThenChild
(呈现 f:then
节点或 returns then
参数,以存在者为准。
其次:访问标签(与呈现标签或编译执行的闭包相反)只能在模板尚未编译时发生,并且可以通过覆盖接收 ViewHelperNode
的 public static function postParseEvent
来实现,它允许您使用 getChildNodes
and/or 读取子节点 通过 addChildNode
.[=25 添加额外的子节点=]
基于 TYPO3Fluid\Fluid\Core\ViewHelper\AbstractViewHelper
并使用手动注册的 then
和 else
参数的实现也可以工作,但不支持像 f:then
这样的子节点而不复制几乎所有的来自TYPO3Fluid\Fluid\Core\ViewHelper\AbstractConditionViewHelper
.
所以答案是:是的,你可以不用 AbstractConditionViewHelper
- 但你不应该。