devskio / content-element-registry
内容元素注册表 - Typo3内容元素注册的辅助工具
Requires
- typo3/cms-core: >=12.0.0 <12.9.9
Replaces
- devsk/content_element_registry: 12.1.2
- typo3-ter/content-element-registry: 12.1.2
This package is auto-updated.
Last update: 2024-09-23 15:07:05 UTC
README
Typo3扩展简化了在Typo3方式中创建新内容元素(CE)的过程
安装
通过composer composer req devskio/content-element-registry
安装扩展,并在扩展模块中激活它
配置
激活扩展后,您必须定义您的内容元素配置类。有两种方法可以完成此操作
-
在扩展配置中定义路径(即 extConf)。可以包含逗号分隔的目录路径列表 示例:
EXT:your_ext_1/Classes/ContentElements/,EXT:your_ext_2/Classes/ContentElements/
-
在您的扩展的
Services.yaml
中注册监听器,如下所示
Vendor\Extension\EventListeners\ContentElementRegistryListener: tags: - name: event.listener identifier: 'contentElementRegistryListener' event: Devsk\ContentElementRegistry\Events\ContentElementRegistryClassEvent
方法 Vendor\Extension\EventListeners\ContentElementRegistryListener
可能如下所示
<?php declare(strict_types=1); namespace Vendor\Extension\EventListeners; class ContentElementRegistryListener { /** * @param RegisterContentElementRegistryClassEvent $event */ public function __invoke(RegisterContentElementRegistryClassEvent $event): void { $contentElementRegistry = $event->getContentElementRegistry(); $contentElementsClassMap = \Composer\Autoload\ClassMapGenerator::createMap( \TYPO3\CMS\Core\Core\Environment::getPublicPath() . '/typo3conf/ext/your_extension/Classes/ContentElement/' ); foreach ($contentElementsClassMap as $elementClass => $elementClassPath) { $contentElementRegistry->registerContentElement( \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance($elementClass) ); } } }
创建新内容元素
要创建新内容元素,您必须在 配置部分 中定义的文件夹内创建一个新的 类,该类扩展 Devsk\ContentElementRegistry\ContentElement\AbstractContentElementRegistryItem
<?php namespace \YourVendor\YourExtension\ContentElement; use Devsk\ContentElementRegistry\ContentElement\AbstractContentElementRegistryItem; class YourNewContentElement extends AbstractContentElementRegistryItem { }
如您所见,内容元素没有标题也没有描述。这些将从您扩展内部的 locallang 文件中自动获取并翻译:EXT:your_extension/Resources/Private/Language/locallang_db.xlf
。您现在可以定义您的CE标题和描述如下
<trans-unit id="tt_content.yourextension_yournewcontentelement.title"> <source>Your new content element</source> </trans-unit> <trans-unit id="tt_content.yourextension_yournewcontentelement.description"> <source>Your new content element description</source> </trans-unit> <trans-unit id="tt_content.yourextension_yournewcontentelement.palette.default"> <source>Default palette</source> </trans-unit>
添加CE字段
要添加新字段,您必须在 \YourVendor\YourExtension\ContentElement\YourNewContentElement
中定义它
<?php namespace \YourVendor\YourExtension\ContentElement; use Devsk\ContentElementRegistry\ContentElement\AbstractContentElementRegistryItem; class YourNewContentElement extends AbstractContentElementRegistryItem { /** * YourNewContentElement constructor. * @throws \Exception */ public function __construct() { parent::__construct(); $this->addPalette( 'default', 'header, --linebreak--, bodytext' ); } }
通过这种方式,我们定义了名为 default
的新CE 调色板,包含两个字段 header
和 bodytext
。
代码描述
- 调色板名称必须对每个CE是唯一的。调色板的标签可以在
locallang_db.xlf
中定义,使用以下键:tt_content.yourextension_yournewcontentelement.palette.default
- 字段定义的语法必须遵循 TCA调色板showitem语法
- 使用的字段必须在 tt_content TCA 中正确配置
- 您可以添加任意多的调色板;)
如果您需要覆盖字段配置,可以这样做:(在以下示例中,我们已为 bodytext
字段启用了富文本编辑器)
<?php /** * @return array */ public function getColumnsOverrides() { return [ 'bodytext' => [ 'config' => [ 'enableRichtext' => true, ], ], ]; }
CE模板
内容元素的模板路径必须在typoscript中按以下方式配置
lib.contentElement {
layoutRootPaths {
10 = EXT:your_extension/Resources/Private/Layouts
}
partialRootPaths {
10 = EXT:your_extension/Resources/Private/Partials
}
templateRootPaths {
10 = EXT:your_extension/Resources/Private/Templates/ContentElements
}
}
模板名称与CE类名称匹配。例如,如果注册了具有类名称YourNewContentElement
的CE,则此模板必须存在于EXT:your_extension/Resources/Private/Templates/ContentElements/YourNewContentElement.html
。模板内容可以如下所示
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xmlns:f="http://typo3.org/ns/TYPO3/Fluid/ViewHelpers" data-namespace-typo3-fluid="true"> <f:layout name="ContentElements/{contentElement.layout}" /> <f:section name="Main"> ... </f:section> <f:section name="Preview"> ... </f:section> </html>
是否使用<f:layout />
和<f:section />
完全取决于您。您还可以添加用于BE预览的节<f:section name="Preview">
。
CE图标
如果您不想使用默认图标,您可以更改它
- 在文件夹
EXT:your_extension/Resources/Public/Icons/ContentElement/yourextension_yournewcontentelement.svg
中添加一个图标
CE域模型
模型名称与CE类名称匹配。例如,如果注册了具有类名称YourNewContentElement
的CE,则此模型可以存在于EXT:your_extension/Classes/Domain/Model/YourNewContentElement.php
。模型内容可以如下所示
<?php declare(strict_types=1); namespace \YourVendor\YourExtension\Domain\Model\ContentElement; use Devsk\ContentElementRegistry\Domain\Model\ContentElement; /** * Class YourNewContentElement * @package YourVendor\YourExtension\Domain\Model\ContentElement */ class YourNewContentElement extends ContentElement { }
在类中,您可以写入一些函数、获取器、设置器等
。其中一些是从Devsk\ContentElementRegistry\Domain\Model\ContentElement
继承的(请查看;)。
模板中的模型
模型在元素的模板中可通过变量名称{contentElement}
访问。要找出模板中模型中加载了哪些数据,请使用:<f:debug>{contentElement}</f:debug>
。
创建新字段并进行设置
创建新字段
- 在表
ext_table.sql
中创建一个字段,例如new_field
。 - 在TCA
EXT:your_extension/Configuration/TCA/Overrides/tt_content.php
中创建新的列和配置Typo3列配置
<?php defined('TYPO3') or die(); $ttContentNewColumns = [ 'new_field' => [ 'label' => 'New field', 'config' => [ 'type' => 'input', 'eval' => 'trim', ], ], ]; \TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addTCAcolumns('tt_content', $ttContentNewColumns);
设置新字段
- 在类
\YourVendor\YourExtension\ContentElement\YourNewContentElement
中添加创建的字段new_field
<?php namespace \YourVendor\YourExtension\ContentElement; use YourVendor\ContentElementRegistry\ContentElement\AbstractContentElementRegistryItem; class YourNewContentElement extends AbstractContentElementRegistryItem { /** * YourNewContentElement constructor. * @throws \Exception */ public function __construct() { parent::__construct(); $this->addPalette( 'default', 'new_field' ); } }
- 在CE模型
EXT:your_extension/Classes/Domain/Model/YourNewContentElement.php
中添加创建字段的属性$newField
。您必须遵循语法,例如,在ext_table.php中写入的new_field
,您必须在模型中写入newField
。
具有IRRE的内容元素
映射
在ext_typoscript_setup.typoscript
中映射关系表到CE模型
YourVendor\YourExtension\Domain\Model\ContentElement\YourNewContentElement\YourNewRelation {
mapping {
tableName = tx_contentelementregistry_domain_model_relation
recordType = yourextension_yournewcontentelement_yournewrelation
}
}
注册关系图标
您可以使用Typo3图标API注册关系图标
关系TCA
在TCA EXT:your_extension/Configuration/TCA/Overrides/tx_contentelementregistry_domain_model_relation.php
中创建
$tempTca = [ 'ctrl' => [ 'typeicon_classes' => [ 'yourextension_yournewcontentelement_yournewrelation' => 'yourextension_yournewcontentelement_yournewrelation', ], ], 'types' => [ 'yourextension_yournewcontentelement_yournewrelation' => [ 'showitem' => '--palette--;;mediaPalette,', ], ], 'palettes' => [ 'mediaPalette' => [ 'showitem' => 'title, media', ], ], 'columns' => [ 'title' => [ 'label' => 'Title', 'config' => [ 'type' => 'text', ], ], ], ]; $GLOBALS['TCA']['tx_contentelementregistry_domain_model_relation'] = array_replace_recursive($GLOBALS['TCA']['tx_contentelementregistry_domain_model_relation'], $tempTca);
将关系添加到CE
将关系名称添加到调色板
<?php namespace \YourVendor\YourExtension\ContentElement; use YourVendor\ContentElementRegistry\ContentElement\AbstractContentElementRegistryItem; class YourNewContentElement extends AbstractContentElementRegistryItem { public function __construct() { parent::__construct(); $this->addPalette( 'default', 'tx_contentelementregistry_relations' ); } }
关系模型
- 在CE模型中创建属性和获取器
<?php namespace \YourVendor\YourExtension\Domain\Model\ContentElement; use Devsk\ContentElementRegistry\Domain\Model\ContentElement; /** * Class YourNewContentElement * @package YourVendor\YourExtension\Domain\Model\ContentElement */ class YourNewContentElement extends ContentElement { /** * @var \TYPO3\CMS\Extbase\Persistence\ObjectStorage<\YourVendor\YourExtension\Domain\Model\ContentElement\YourNewContentElement\YourNewRelation> */ protected $relations = null; /** * @return ObjectStorage|null */ public function getRelations(): ? ObjectStorage { return $this->relations; } }
- 在
\YourVendor\YourExtension\Domain\Model\ContentElement\YourNewContentElement
中创建一个新文件YourNewRelation.php
。在这里,您可以编写TCA中字段的获取器和属性
<?php namespace \YourVendor\YourExtension\Domain\Model\ContentElement\YourNewContentElement; use Devsk\ContentElementRegistry\Domain\Model\Relation; /** * Class YourNewRelation * @package YourVendor\YourExtension\Domain\Model\ContentElement\YourNewContentElement */ class YourNewRelation extends Relation { /** * @var string */ protected $type = ''; /** * @return string */ public function getType(): string { return $this->type; } }
CE字段映射
在CE类中,您可以在需要将其用于模型时映射字段,例如,在模型中调用tx_contentelementregistry_relations
时,在映射'tx_contentelementregistry_relations' => 'relations'
后,在模型中调用tx_contentelementregistry_relations
时,将调用relations
。
namespace \YourVendor\YourExtension\Domain\Model\ContentElement; use Devsk\ContentElementRegistry\Domain\Model\ContentElement; /** * Class YourNewContentElement * @package YourVendor\YourExtension\Domain\Model\ContentElement */ class YourNewContentElement extends ContentElement { /** * @var array */ protected $columnsMapping = [ 'tx_contentelementregistry_relations' => 'relations', ]; }
##变更日志
v12.1.0
- 主要:从
Digitalwerk\ContentElementRegistry\...
迁移到Devsk\ContentElementRegistry\...
的命名空间
v1.0.0
- 已停止支持typo3 8和typo3 9
- 仅支持typo3 v10.4
- 实验性无头支持