useStdWrap与tx_news中的overrideFlexformSettingsIfEmpty冲突

时间:2016-10-10 15:59:57

标签: typo3 typoscript tx-news

在tx_news中,所有插件设置也可以通过TypoScript设置,方法是将其名称添加到overrideFlexformSettingsIfEmpty。顾名思义,如果任何插件化身的相应Flexform字段留空,则仅使用这些基于TS的设置。这就是我想要的和我需要的。它允许在每个插件元素中覆盖的基本TS配置。

现在问题在于:

由于我的TS默认值需要更复杂的计算,我还会为某些tx_news设置字段激活useStdWrap。但我发现总是会使用一个活跃的stdWrap - 无论是否有Flexform设置。

我需要的是使用TS stdWrap计算默认值的可能性,但是如果定义了Flexform设置,它应该总是覆盖TS设置(无论它们的计算有多复杂以及它是否包含stdWrap操作)。

以下是一个例子:

plugin.tx_news.settings {
    overrideFlexformSettingsIfEmpty := addToList(categories)
    useStdWrap := addToList(categories)

    categories.data = GP:cat
    categories.ifEmpty = 1
}

我希望这个TS可以从查询字符串参数(cat)设置任何新闻插件的类别,然后回退到类别1,但如果插件本身没有设置类别,则

stdWrap操作(.data和.ifEmpty)始终启动,无法再使用Flexform设置。

有没有办法解决这个问题?

2 个答案:

答案 0 :(得分:1)

没有办法为每个人解决这个问题,因为如果它会被改变,会有其他缺点。

一种解决方案是使用钩子$GLOBALS['TYPO3_CONF_VARS']['EXT']['news']['Controller/NewsController.php']['overrideSettings'],您可以在其中操作具有所需内容的PHP设置。

答案 1 :(得分:1)

我接受了Georgs的回答,但选择了另一种方法来解决这个问题:

我创建了一个PHP类,它读取并返回任何给定tx_news插件化身的类别设置,并允许将它们合并回useStdWrap过程。

要使用此方法,最好创建一个基本的自定义扩展,并将PHP类文件放入其Classes文件夹中。这是类文件的代码,存储为/your_extension/Classes/TsSetupHelper.php:

<?php
namespace YourVendor\YourExtension;

class TsSetupHelper {

    /**
     * Reference to the parent (calling) cObject set from TypoScript
     */
    public $cObj;


    /**
     * Return the categories chosen in a tx_news plugin content element. 
     * Can be used in TS Setup to stdWrap the categories without losing the settings defined within a plugin incarnation.
     *
     * @param  string          Empty string (no content to process)
     * @param  array           TypoScript configuration
     * @return string          return categorie value list from plugin in page, e.g.: '1,3,4'
     */
    public function getNewsPluginCategory($content, $conf) {

        $newsPluginFlexformArr = \TYPO3\CMS\Core\Utility\GeneralUtility::xml2array( $this->cObj->data['pi_flexform'] );
        $newsPluginCategories = $newsPluginFlexformArr['data']['sDEF']['lDEF']['settings.categories']['vDEF'];

        return $newsPluginCategories;
    }
}

有了这个类,您可以在TS安装程序中读取tx_news插件中选择的类别,使用stdWrap处理它们并将它们作为更新的类别值推送回插件。

以下是相应TS设置代码的示例。

plugin.tx_news.settings {
    overrideFlexformSettingsIfEmpty := addToList(categories,categoryConjunction)
    useStdWrap := addToList(categories)
    categoryConjunction = or

    # pre fill categories with value from plugin in page
    categories.cObject = USER
    categories.cObject {
        userFunc = YourVendor\YourExtension\TsSetupHelper->getNewsPluginCategory
    }
    # only if no categories are chosen within plugin,
    # use TS to define categories:
    categories.ifEmpty {
        # get cat from parameter in query
        data = GP:cat
        # ignore cat parameter if page layout 5 is chosen in page properties
        override = 1,2,3,4,5,6,7,8,9,10
        override.if.value.data = page:layout
        override.if.equals = 5
        # default categories to 3 if cat param is not set
        ifEmpty = 3
    }
}

我们在这里做了很多花哨的事情。这只是一个例子。重要的是,如果插件中没有设置任何类别,则插件中的类别设置优先,并且仅使用块categories.ifEmpty{...}中的所有TS设置。

撰写本文时的版本:TYPO3 7.6.11,tx_news 5.2.0