我如何才能将此TypoScript条件迁移为与TYPO3 9.5中的条件完全兼容的Symfony表达语言?
[userFunc = TYPO3\CMS\Core\Utility\ExtensionManagementUtility::isLoaded('fluid_styled_content')]
您现在必须提供自己的功能。
这里有一个教程:https://usetypo3.com/symfony-expression-language-in-typo3.html
但是基本上,您将拥有内容如下的文件yourext/Configuration/ExpressionLanguage.php
:
<?php
return [
'typoscript' => [
\Vendor\Yourext\ExpressionLanguage\ConditionProvider::class
]
];
这将为打字稿上下文注册条件提供者。
要添加简单函数,您需要将函数提供程序类设置为该类的expressionLanguageProviders
。
可能看起来像这样:
<?php
namespace Vendor\Yourext\ExpressionLanguage;
use TYPO3\CMS\Core\ExpressionLanguage\AbstractProvider;
class ConditionProvider extends AbstractProvider
{
public function __construct()
{
$this->expressionLanguageProviders = [
UtilitiesConditionFunctionsProvider::class,
SomeOtherConditionFunctionsProvider::class,
AThirdConditionFunctionsProvider::class,
];
}
}
(甚至可以直接在属性上设置它,而不是使用构造函数,但这就是我所做的。)>
那些功能提供者需要实现\Symfony\Component\ExpressionLanguage\ExpressionFunctionProviderInterface
接口,它基本上只是getFunctions
方法,需要返回\Symfony\Component\ExpressionLanguage\ExpressionFunction
实例的数组。
我的UtilitiesConditionFunctionsProvider看起来像这样:
<?php namespace Vendor\Yourext\ExpressionLanguage; use Symfony\Component\ExpressionLanguage\ExpressionFunction; use Symfony\Component\ExpressionLanguage\ExpressionFunctionProviderInterface; use TYPO3\CMS\Core\Utility\ExtensionManagementUtility; class UtilitiesConditionFunctionsProvider implements ExpressionFunctionProviderInterface { /** * @return ExpressionFunction[] An array of Function instances */ public function getFunctions() { return [ $this->getIntersectsFunction(), $this->getExtensionLoadedFunction(), ]; } /** * @return ExpressionFunction */ protected function getIntersectsFunction() { return new ExpressionFunction('intersects', function () { // Not implemented, we only use the evaluator }, function ($arguments, $left, $right) { return count(array_intersect($left, $right)) > 0; }); } protected function getExtensionLoadedFunction() { return new ExpressionFunction('loaded', function () { // Not implemented, we only use the evaluator }, function ($arguments, $extKey) { return ExtensionManagementUtility::isLoaded($extKey); }); } }
因此,现在可以在我的条件下使用
intersects( ... )
和loaded( ... )
。