Typo3 打字错误。7.6.2-仅评估一次条件ViewHelper
问题:我编写了一个条件VH(扩展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
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;
}