【问题标题】:Simplify creation of content elements / TCA in TYPO3简化 TYPO3 中内容元素/TCA 的创建
【发布时间】:2021-01-22 07:43:18
【问题描述】:

我正在寻找一种方法来简化 TYPO3 中内容元素的创建。

我在关注官方文档:https://docs.typo3.org/m/typo3/reference-coreapi/master/en-us/ApiOverview/ContentElements/AddingYourOwnContentElements.html

现在,在step 2,我们拥有这种令人生畏的美丽:

// Configure the default backend fields for the content element
$GLOBALS['TCA']['tt_content']['types']['yourextensionkey_newcontentelement'] = [
    '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,
        --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,
    ',
    'columnsOverrides' => [
        'bodytext' => [
            'config' => [
                'enableRichtext' => true,
                'richtextConfiguration' => 'default',
            ],
        ],
    ],
];

在我看来,好像所有需要替换的是“yourextensionkey_newcontentelement”,其余部分来自核心。除非你知道自己在做什么并且想要以不同的方式来做这件事。

我的问题:

  • 这究竟是做什么的? (我知道,它为编辑 CE 的形式设置了一些 TCA。)
  • 如果这对于标准情况是相同的,我们能否从核心获取整个数组,例如通过为此提供功能?这是一个好方法吗?
  • 您还有其他简化此操作的想法吗?
  • 是否有可用的方法来编写此人类可读的文件并将其转换或使用自动扩展(例如通过 PhpStorm 插件)?

我知道有一项计划致力于改善 CE 的长期处理方式。我现在正在寻找的是我们可以在短期内做些什么来简化 CE 的创建。我也知道有像“mask”或“dce”这样的扩展,但我们不会在官方文档中宣传它们,我们宣传这个:Create Custom Content Elements


免责声明:我不是在 TYPO3 中创建内容元素的专家。大多数时候,我编写带有插件或其他功能的扩展。这可能是一个愚蠢的问题/建议。请告诉我。

【问题讨论】:

  • 您在第二步中看到的是来自 TYPO3 的默认选项卡和调色板。您不需要使用它们。您只能添加自己的字段。您可能会发现这很有帮助。 stackoverflow.com/questions/62213373/… 。我花了很多时间来创建简单和复杂的自定义内容元素

标签: typo3


【解决方案1】:

我了解您的重复代码和复制/粘贴工作的“问题”,尽管它提供了很大的灵活性。

对于您的问题:

这究竟是做什么的? (我知道,它为编辑 CE 的形式设置了一些 TCA。)

TYPO3 内容元素组织在所谓的调色板中。一个调色板可以包含多个属性。

例如调色板“标题”有:

  • 标题
  • header_layout
  • header_position
  • 日期
  • header_link

因此,如果您想包含所有默认标题字段,只需包含标题调色板即可包含所有包含字段。

您可以在 frontend/Configuration/TCA/tt_content.php 中看到大部分默认调色板(请参阅带有键 'palettes' 的数组)。

在列覆盖中,您可以轻松覆盖已在核心中定义的特定值/属性/设置。在您的示例中,它覆盖了“bodytext”字段的 RTE 设置。

字符串本身看起来有点神秘。占位符及其作用:

  • --div--;标签的标签 --> 使用给定标签开始一个新标签
  • --palette--;;hidden --> 加载没有特定标签的新调色板
  • --palette--;您的标签;隐藏 --> 加载带有特定标签的新调色板

如果这对于标准情况是相同的,我们是否可以从核心获取整个数组,例如通过为此提供功能?这是一个好方法吗?

不幸的是,这不是一个数组,而是一个字符串。所以你不能合并,除非你想分割字符串并再次组合它们。在该字符串的某处,您需要包含自己的字段/调色板。此外,并非每个新内容元素都需要所有字段。所以在我看来,为每个新的内容元素完全实现它会更好地阅读。

例子:

$GLOBALS['TCA']['tt_content']['types']['alert'] = array(
    'showitem' => '
        --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:general,
            --palette--;;general,
            --palette--;LLL:EXT:your_ext/Resources/Private/Language/backend.locallang.xlf:tt_content.alert.palettes.general.title;alert,
        --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:notes,
            rowDescription,
        --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:extended,
    ',
    'columnsOverrides' => [
        'bodytext' => [
            'config' => [
                'enableRichtext' => true
            ]
        ],
    ]
);

在这个例子中,我直接在核心调色板“general”之后加载了一个自定义调色板。这也可以通过辅助方法来完成。我不喜欢它:-)

function merge($yourDefinition): string
{
    return '
    --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:general,
            --palette--;;general,
            '.$yourDefinition.'
        --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:notes,
            rowDescription,
        --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:extended
        ';
}

您还有其他简化此操作的想法吗?

如前所述,使用辅助方法或其他字符串组合。在我看来,这会导致灵活性降低,可读性也会变差。

我不喜欢代码重复,但在这种情况下,我用它自己的、未组合/未合并的字符串来定义每个新的内容元素...

【讨论】:

    猜你喜欢
    • 2017-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-26
    • 2021-02-26
    • 1970-01-01
    相关资源
    最近更新 更多