如何通过TCA覆盖,用FlexForm扩展TYPO3的常用内容元素?

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

我想用一个字段来扩展 TYPO3 的一些内容元素以输入自定义 CSS 类。因此我认为 pi_flexform 字段是合适的地方,因为它提供了稍后添加更多值的灵活性。 (不,我不想为所有 CSS 类创建布局选项)

在 TCA 覆盖中 - 例如“texpic” - 我添加了以下结构:

$GLOBALS['TCA']['tt_content']['types']['textpic'] = array_replace_recursive(
  $GLOBALS['TCA']['tt_content']['types']['textpic'], [
    'columns' => [
      'pi_flexform' => [
        'l10n_display' => 'hideDiff',
        'label' => 'LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:pi_flexform',
        'config' => [
          'type' => 'flex',
          'ds_pointerField' => 'list_type,CType',
          'ds' => [
            'default' => '
              <T3DataStructure>
                <ROOT>
                  <type>array</type>
                  <el>
                    <customClass>
                      <TCEforms type="array">
                        <label>My custom CSS classes</label>
                        <config type="array">
                          <type>input</type>
                          <eval>trim</eval>
                        </config>
                      </TCEforms>
                    </customClass>
                  </el>
                </ROOT>
              </T3DataStructure>
            '
          ],
          'search' => [
            'andWhere' => '{#CType}=\'list\''
          ]
        ]
      ]
    ],
    'showitem' => '
      --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:general,
      --palette--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:palette.general;general,
      --palette--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:palette.header;header_minimal,
      pi_flexform,
      [...]
  ']
);

pi_flexform 字段显示在后端,但上面的 XML 配置未评估。它显示

Plugin Options [pi_flexform] The Title:
,这是文件
typo3\sysext\frontend\Configuration\TCA\tt_content.php
中的演示示例值。所以看来我的代码没有完全被覆盖,只有“showitem”部分有效。这里可能有什么问题?

编辑1: 在我发布问题后,我发现我的错误:列的定义需要直接进入 tt_content 部分:

$GLOBALS['TCA']['tt_content']['columns']['pi_flexform'] = [...]

不幸的是,这意味着它将对所有 tt_content 元素产生影响,除非其他插件会再次覆盖它。所以问题仍然是:是否有一种简单的方法来扩展默认内容元素,而无需编写自己的扩展或添加数据库字段?

typo3 flexform
2个回答
0
投票

找到了一个简单的解决方案!只需将 FlexForm XML 直接添加到

addPiFlexFormValue()
并将内容元素指定为第三个参数:

\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addPiFlexFormValue(
    '*',
    '<T3DataStructure>
  <ROOT>
  <type>array</type>
    <el>
      <customClass>
        <TCEforms type="array">
          <label>My custom CSS classes</label>
          <config type="array">
            <type>input</type>
            <eval>trim</eval>
          </config>
        </TCEforms>
      </customClass>
    </el>
  </ROOT>
</T3DataStructure>',
    'textpic'
);

它是如此连线:浪费了数小时的尝试,突然在发布问题后,解决方案就自己出现了。


0
投票

我知道我迟到了这个话题。我想我找到了一个更好的解决方案(使用 Typo3 12LTS 测试) - 尝试更改标准“文本”CType 元素:

1.) 在您的扩展 Configuration/TCA/Overrides/tt_content.php 中,您需要添加 PiFlexFormValue,如下所示:

\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addPiFlexFormValue('*','FILE:EXT:YOUR_PLUGIN_NAME_HERE/Configuration/FlexForms/text.xml','text');

--> 您现在可以使用要添加的 Flexform 创建 text.xml

2.)现在您只需将 pi_flexform 添加到“showitem”配置(相同的 tt_content.php)

$GLOBALS['TCA']['tt_content']['types']['text']['showitem'] = '
                --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:general,
                    --palette--;;general,
                    --palette--;;headers,
                    bodytext;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:bodytext_formlabel,
                    pi_flexform; ;,
                --div--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:tabs.appearance,
                    --palette--;;frames,
                    --palette--;;appearanceLinks,
                --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:language,
                    --palette--;;language,
                --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:access,
                    --palette--;;hidden,
                    --palette--;;access,
                --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:categories,
                    categories,
                --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:notes,
                    rowDescription,
                --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:extended';

最后你可以在typoscript中配置文本元素来处理flexform

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