TYPO3:如何将 userFunc TypoScript 条件迁移到 Symfony 表达式语言?
TYPO3: how to migrate userFunc TypoScript condition to Symfony Expression Language?
如何迁移此 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
]
];
这为拼写错误上下文注册了一个条件提供程序。
要添加简单函数,您需要将函数提供程序 classes 设置为 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
方法,需要 return 一个 \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( ... )
。
如何迁移此 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
]
];
这为拼写错误上下文注册了一个条件提供程序。
要添加简单函数,您需要将函数提供程序 classes 设置为 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
方法,需要 return 一个 \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( ... )
。