Typo3 打字错误。7.6.2-仅评估一次条件ViewHelper

Typo3 打字错误。7.6.2-仅评估一次条件ViewHelper,typo3,fluid,view-helpers,typo3-7.6.x,Typo3,Fluid,View Helpers,Typo3 7.6.x,问题:我编写了一个条件VH(扩展AbstractConditionViewHelper),它正常工作,但我意识到在非缓存版本中,它只被计算一次。起初我认为这是我的错误,但检查了common,问题是相同的:s 通常,当我第一次访问我的页面时,会评估条件并给出有效结果,但当我刷新页面时,不再调用VH(通过在VH内设置断点进行检查),并且VH始终被视为FALSE。只有视图代码中的任何更改才会导致VH被评估一次,并且下次刷新(es)将不再调用VH typo3conf/ext/toolbox/Classe

问题:我编写了一个条件VH(扩展
AbstractConditionViewHelper
),它正常工作,但我意识到在非缓存版本中,它只被计算一次。起初我认为这是我的错误,但检查了common
,问题是相同的:s

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

typo3conf/ext/toolbox/Classes/ViewHelpers/IsFieldRequiredViewHelper.php:


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

请查看以下内容中的此方法:

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

解决方案:您可以

  • 还要重写
    renderStatic()
    方法,并在那里(再次)实现ViewHelper逻辑
  • 不实现
    render()
    方法
    ,只覆盖静态
    evaluateCondition($arguments)
    方法。此方法实际上被设计为被覆盖--
    render()
    renderStatic()
    的默认实现都调用此方法:

    此方法决定条件是真还是假。在扩展ViewHelper以调整功能时,可以覆盖它


  • 最快的解决方案是覆盖类render和evaluateCondition,如下所示:

    public function initializeArguments()
       {
            parent::initializeArguments();
            $this->registerArgument('yourArgument','array','',true);
       }
    
    public function render() 
        {
            return self::evaluateCondition($this->arguments) ? $this->renderThenChild() : $this->renderElseChild();
        }
    
    /**
     * @return bool
     */
    protected static function evaluateCondition($arguments = null) 
        {
             //do your stuff
             return true;
        }
    

    伟大的感谢您的详细解释,只是好奇它到底是在哪个API中引入的?似乎是罪魁祸首。它是在Type3 7.3.0中引入的(根据git标签--contains 1beb07f03e0dd9316f8bb96d8ef2a75803cda69d)
    static protected function evaluateCondition($arguments = null)
    {
        $requiredArray = \TYPO3\CMS\Core\Utility\GeneralUtility::trimExplode(',', $arguments['requiredFields'], true);
        return (in_array($arguments['fieldName'], $requiredArray));
    }
    
    public function initializeArguments()
       {
            parent::initializeArguments();
            $this->registerArgument('yourArgument','array','',true);
       }
    
    public function render() 
        {
            return self::evaluateCondition($this->arguments) ? $this->renderThenChild() : $this->renderElseChild();
        }
    
    /**
     * @return bool
     */
    protected static function evaluateCondition($arguments = null) 
        {
             //do your stuff
             return true;
        }