当前位置:  开发笔记 > 编程语言 > 正文

TYPO3版本 7.6.2 - 条件ViewHelpers仅评估一次

如何解决《TYPO3版本7.6.2-条件ViewHelpers仅评估一次》经验,为你挑选了1个好方法。

问题:我写了一个条件VH(扩展AbstractConditionViewHelper)并且它通常工作,无论如何我意识到在非缓存版本中它只被评估一次.最初,我认为这是我的错误,但检查常见 ,问题是相同的:S

通常,当我第一次访问我的页面时,评估条件并给出有效结果,但是当我刷新页面时,不再调用VH(通过在VH内设置断点来检查),并且VH始终被视为假.只有视图代码的任何更改都会导致VH被评估一次,并且下一次刷新将不再调用VH.

typo3conf/EXT /工具箱/班/ ViewHelpers/IsFieldRequiredViewHelper.php:

renderThenChild()
            : $this->renderElseChild();
    }
}

用法:

{namespace toolbox=Vendor\Toolbox\ViewHelpers}


    TRUE
    FALSE

对于我的第一次打击,TRUE但后来才有FALSE.

有什么建议?自7.x-以来,我是否错过了ViewHelpers API中的一些重要更改?

当然,如果扩展被缓存,它将不可见,因为第一个命中将保存在具有适当VH返回的缓存中.



1> helmbert..:

AbstractConditionViewHelper实现了TYPO3\CMS\Fluid\Core\ViewHelper\Facets\CompilableInterface接口.这意味着它实现了一个compile实际返回PHP代码的方法,该代码将存储在已编译的Fluid视图中.

在源代码中看看这个方法:

 public function compile($argumentsVariableName, $renderChildrenClosureVariableName, &$initializationPhpCode, \TYPO3\CMS\Fluid\Core\Parser\SyntaxTree\AbstractNode $syntaxTreeNode, \TYPO3\CMS\Fluid\Core\Compiler\TemplateCompiler $templateCompiler)
 {
     foreach ($syntaxTreeNode->getChildNodes() as $childNode) {
         if ($childNode instanceof ViewHelperNode
             && $childNode->getViewHelperClassName() === ThenViewHelper::class) {
             $childNodesAsClosure = $templateCompiler->wrapChildNodesInClosure($childNode);
             $initializationPhpCode .= sprintf('%s[\'__thenClosure\'] = %s;', $argumentsVariableName, $childNodesAsClosure) . LF;
         }
         if ($childNode instanceof ViewHelperNode
             && $childNode->getViewHelperClassName() === ElseViewHelper::class) {
             $childNodesAsClosure = $templateCompiler->wrapChildNodesInClosure($childNode);
             $initializationPhpCode .= sprintf('%s[\'__elseClosure\'] = %s;', $argumentsVariableName, $childNodesAsClosure) . LF;
         }
     }

     return sprintf('%s::renderStatic(%s, %s, $renderingContext)',
         get_class($this), $argumentsVariableName, $renderChildrenClosureVariableName);
 }

编译完成后,render()将不再调用该方法(它将在第一次调用时,当模板尚未编译时).相反,renderStatic()将调用该方法.

解决方案:您也可以

    还覆盖了该renderStatic()方法并在那里实现了ViewHelper逻辑(再次)

    没有实现该render()方法,只是覆盖静态evaluateCondition($arguments)方法.实际上,这个方法被设计为被覆盖 - 两者的默认实现render()renderStatic()调用此方法:

    此方法确定条件是TRUE还是FALSE.可以在扩展视图中调整它以调整功能.

    static protected function evaluateCondition($arguments = null)
    {
        $requiredArray = \TYPO3\CMS\Core\Utility\GeneralUtility::trimExplode(',', $arguments['requiredFields'], true);
        return (in_array($arguments['fieldName'], $requiredArray));
    }
    

推荐阅读
拾味湖
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有