当前位置: 首页 > 知识库问答 >
问题:

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

姬昀
2023-03-14

在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

所以我做了一些类似的事情

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

}

但是他们删除了那里的renderthechildrendereschild。正确的方法是什么。我可以不使用\TYPO3\CMS\Fluid\Core\ViewHelper\AbstractConditionViewHelper就完成它吗?

共有1个答案

蓬新
2023-03-14

首先:如果你希望你的ViewHelper是一个条件ViewHelper,你应该子类化TYPO3Fluid\Fluid\Core\ViewHelper\Abstract条件ViewHelper,而不是TYPO3Fluid\Fluid\Core\ViewHelper\AbstractViewHelper。前者包含一系列辅助方法,例如renderThenchild(它呈现f: so节点或返回so参数,以存在者为准)。

第二:对标签的访问(与呈现标签或编译执行的闭包相反)只能在模板尚未编译时发生,并且可以通过覆盖接收ViewHelperNode它允许您使用getChildNodes读取子节点和/或通过addChildNode添加其他子节点。

基于TYPO3Fluid\Fluid\Core\ViewHelper\AbstractViewHelper并使用手动注册的else参数的实现也可以工作,但是如果不复制TYPO3Fluid\Fluid\Core\ViewHelper\AbstractConditionViewHelper中的几乎所有辅助方法,将不支持子节点,如f:then

因此答案是:是的,您可以在不使用AbstractConditionViewHelper的情况下完成,但您不应该这样做。

 类似资料:
  • 问题内容: MySQL / MSSQL可以在查询中使用整齐的内联if函数,以检测空值,如下所示。 我现在遇到的问题是该代码在Oracle数据库上运行不安全,因为它似乎不支持此内联if语法。 在Oracle中是否有等效功能? 问题答案: 使用标准的COALESCE函数: 或使用Oracle自己的NVL函数执行相同的操作。

  • if-then语句后面可以跟一个可选的else语句,该语句在布尔表达式为false时执行。 语法 (Syntax) if-then-else语句的语法是 - if condition then S1 else S2; 其中, S1和S2是不同的陈述。 Please note that the statement S1 is not followed by a semicolon 。 在if-th

  • If语句后面可以跟一个可选的Else语句,该语句在布尔表达式为false时执行。 语法 (Syntax) VB.Net中If ... Then ... Else语句的语法如下 - If(boolean_expression)Then 'statement(s) will execute if the Boolean expression is true Else 'statement(

  • 除非后面的语句后面跟一个可选的else语句,该语句在布尔表达式为true时执行。 使用unless-then ... else语句,我们可以在一行中编写除非... else语句。 语法 (Syntax) 以下是CoffeeScript中的unless-then else语句的语法。 unless expression <b>then</b> Statements (for false) else

  • if-then语句后跟一个可选的else语句,该语句在布尔表达式为false时执行。 使用if-then ... else语句,我们可以在一行中编写if ... else语句。 语法 (Syntax) 以下是CoffeeScript中if-then...else语句的语法。 if expression <b>then</b> Statements (for true condition) else

  • if… then语句后面可以跟一个可选的else statement,该else statement,在逻辑表达式为false时执行。 语法 (Syntax)> if… then… else语句的基本语法是 - if (logical expression) then statement(s) else other_statement(s) end if 但是,如果给