TYPO3:如何将userFunc TypoScript条件迁移到Symfony表达语言?

问题描述 投票:0回答:1

我如何才能将此TypoScript条件迁移为与TYPO3 9.5中的条件完全兼容的Symfony表达语言?

[userFunc = TYPO3\CMS\Core\Utility\ExtensionManagementUtility::isLoaded('fluid_styled_content')]

typo3 typoscript typo3-9.x
1个回答
0
投票

您现在必须提供自己的功能。

这里有一个教程: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( ... )

© www.soinside.com 2019 - 2024. All rights reserved.