.. include:: ../Includes.txt .. _adding-your-own-content-elements: ================================ Adding your own content elements ================================ .. note:: This part is written for developers! A content element can be based on already available fields in the `tt_content` table and/or extra fields you can add to the `tt_content` table. This is done the same way as you do for your own extensions by :ref:`extending TCA `. Depending on the data in the `tt_content` table, you can send the data immediately to the :ref:`cobj-fluidtemplate` or use a :ref:`data processor ` in front to do some data manipulation. The content elements in the extension "fluid_styled_content" are using both as well. A data processor is sometimes used to convert a string (like the `bodytext` field in content element "table") to an array or fetch a related record (e.g. a FAL file), so Fluid does not have to deal with this manipulation or transformation. .. _AddingCE-use-an-extension: Use an extension ================ We recommend to create your own extension for adding content elements. The following example uses the extension key `your_extension_key`. If you have plans to publish your extension, do not forget to check for the availability of your desired key and register it at the `"extension keys" page `_ (prior login at `typo3.org `_ is required). Since this part is written for developers, it will not explain in full detail how an extension works. .. _AddingCE-PageTSconfig: .. _RegisterCE: .. _AddingCE-TCA-Overrides-tt_content: 1. Register the content element =============================== First add your new content element to the "New Content Element Wizard" and define its `CType` in PageTSconfig. The example content element is called `yourextensionkey_newcontentelement`: .. code-block:: typoscript mod.wizards.newContentElement.wizardItems.common { elements { yourextensionkey_newcontentelement { iconIdentifier = your-icon-identifier title = LLL:EXT:your_extension_key/Resources/Private/Language/Tca.xlf:yourextensionkey_newcontentelement.wizard.title description = LLL:EXT:your_extension_key/Resources/Private/Language/Tca.xlf:yourextensionkey_newcontentelement.wizard.description tt_content_defValues { CType = yourextensionkey_newcontentelement } } } show := addToList(yourextensionkey_newcontentelement) } You need to :ref:`register the icon identifier ` with the icon API in your :file:`ext_localconf.php`. Then you need to add the content element to the "Type" dropdown, where you can select the type of content element in the file :file:`Configuration/TCA/Overrides/tt_content.php`: .. code-block:: php // Adds the content element to the "Type" dropdown \TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addPlugin( [ 'LLL:EXT:your_extension_key/Resources/Private/Language/Tca.xlf:yourextensionkey_newcontentelement', 'yourextensionkey_newcontentelement', 'EXT:your_extension_key/Resources/Public/Icons/ContentElements/yourextensionkey_newcontentelement.gif', ], 'CType', 'your_extension_key' ); .. _ConfigureCE-Fields: 2. Configure fields =================== Then you need to configure the backend fields for your new content element in the file :file:`Configuration/TCA/Overrides/tt_content.php`: .. code-block:: php // 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', ], ], ], ]; .. _ConfigureCE-Frontend: 3. Configure the frontend template ================================== Since TypoScript configuration is needed as well,add an entry in the static template list found in `sys_templates` for static TypoScript in :file:`Configuration/TCA/Overrides/sys_template.php`: .. code-block:: php // Add an entry in the static template list found in sys_templates for static TS \TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addStaticFile( 'your_extension_key', 'Configuration/TypoScript', 'Your description' ); As defined in :file:`Configuration/TCA/Overrides/sys_template.php`, the file :file:`setup.typoscript` is in the directory :file:`Configuration/TypoScript/` of your own extension. To ensure your custom content element templates can be found you need to extend the global :typoscript:`templateRootPaths` with a path within your extension: .. code-block:: typoscript lib.contentElement { templateRootPaths { 200 = EXT:your_extension_key/Resources/Private/Templates/ } } You can use an arbitrary index (`200` here), just make sure it is unique. If you use partials and layouts, you need to do the same for :ref:`t3tsref:cobj-fluidtemplate-properties-partialrootpaths` and :ref:`t3tsref:cobj-fluidtemplate-properties-layoutrootpaths`. Now you can register the rendering of your custom content element using a Fluid template: .. code-block:: typoscript tt_content { yourextensionkey_newcontentelement =< lib.contentElement yourextensionkey_newcontentelement { templateName = NewContentElement } } In this example a :ref:`cobj-fluidtemplate` content object is created using a reference from :typoscript:`lib.contentElement` with a template identified by the :ref:`t3tsref:cobj-fluidtemplate-properties-templatename` `NewContentElement`. This will load a :file:`NewContentElement.html` template file from the :typoscript:`templateRootPaths`. .. note:: The :typoscript:`lib.contentElement` path is defined in :file:`EXT:fluid_styled_content/Configuration/TypoScript/Helper/ContentElement.typoscript`. For the final rendering you need a Fluid template. This template will be located at the directory and file name which you have entered in :file:`setup.typoscript` using the parameter :typoscript:`templateName`. Now we can use the `tt_content` fields in the Fluid template by accessing them via the `data` variable. The following example shows the text entered in the richtext enabled field `bodytext` formatted using the defined richtext configuration: .. code-block:: html
{data.bodytext -> f:format.html()}
.. _ConfigureCE-Preview: 4. Optional: configure custom backend preview ============================================= If you want to generate a special preview in the backend "Web > Page" module, you can use a hook for this: .. code-block:: php // Register for hook to show preview of tt_content element of CType="yourextensionkey_newcontentelement" in page module $GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['cms/layout/class.tx_cms_layout.php']['tt_content_drawItem']['yourextensionkey_newcontentelement'] = \Vendor\YourExtensionKey\Hooks\PageLayoutView\NewContentElementPreviewRenderer::class; The preview renderer :file:`NewContentElementPreviewRenderer.php`, for the backend, has been put in the directory :file:`Classes/Hooks/PageLayoutView/` and could look like this: .. code-block:: php We can change our preview here!

'; $drawItem = false; } } } .. _ConfigureCE-Extend-tt_content: 5. Optional: extend tt_content ============================== .. todo:: This will be filled in another patch. .. _ConfigureCE-DataProcessors: 6. Optional: use data processors ================================ You can use data processors for some data manipulation or other actions you would like to perform before passing everything to the view. This is done in the :ref:`dataProcessing ` section where you can add an arbitrary number of data processors, each with a fully qualified class name (FQCN) and optional parameters to be used in the data processor: .. code-block:: typoscript tt_content { yourextensionkey_newcontentelement =< lib.contentElement yourextensionkey_newcontentelement { templateName = NewContentElement dataProcessing { 1 = Vendor\YourExtensionKey\DataProcessing\NewContentElementProcessor 1 { exampleOptionName = exampleOptionValue } } } } In the example :file:`setup.typoscript` above, the data processor is located in the directory :file:`Classes/DataProcessing/`. The file :file:`NewContentElementProcessor.php` could look like this: .. code-block:: php {variableName}