Как создать собственные элементы содержимого в TYPO3 7.5 и 7 LTS с помощью Fluid_styled_content?
Мне сказали, что очень легко настроить пользовательские элементы структурированного содержимого для Backend в TYPO3 7.5, используя новое системное расширение Fluid_styled_content.
Посмотрев на sysext/fluid_styled_content
а также sysext/backend
Я не мог понять это сам. Есть намеки?
1 ответ
Источник информации: Fluid_styled_slider на Github
Эта информация также доступна здесь: https://usetypo3.com/custom-fsc-element.html
Официальные документы также онлайн: https://docs.typo3.org/typo3cms/extensions/fluid_styled_content/latest/
конфигурации TS
Чтобы наш элемент контента появился в мастере для новых элементов контента, мы должны добавить его через PageTSconfig
mod.wizards.newContentElement.wizardItems.common {
elements {
fs_slider {
iconIdentifier = content-image
title = LLL:EXT:fluid_styled_slider/Resources/Private/Language/locallang_be.xlf:wizard.title
description = LLL:EXT:fluid_styled_slider/Resources/Private/Language/locallang_be.xlf:wizard.description
tt_content_defValues {
CType = fs_slider
}
}
}
show := addToList(fs_slider)
}
TCA
Теперь нам нужно сообщить TYPO3, какие поля показывать в бэкэнде. Поэтому мы должны расширить конфигурацию TCA tt_content. Этот материал теперь делается в папке Configuration/TCA/Override
, Давайте сначала добавим наш новый CType (это также можно сделать в ext_tables.php
):
\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addTcaSelectItem(
'tt_content',
'CType',
[
'LLL:EXT:fluid_styled_slider/Resources/Private/Language/locallang_be.xlf:wizard.title',
'fs_slider',
'content-image'
],
'textmedia',
'after'
);
Теперь мы определяем, какие поля показывать для нашего CType:
$GLOBALS['TCA']['tt_content']['types']['fs_slider'] = [
'showitem' => '
--palette--;' . $frontendLanguageFilePrefix . 'palette.general;general,
--palette--;' . $languageFilePrefix . 'tt_content.palette.mediaAdjustments;mediaAdjustments,
pi_flexform,
--div--;' . $customLanguageFilePrefix . 'tca.tab.sliderElements,
media
'
];
TypoScript
Новый CType fs_slider
нужно определение рендеринга. Это довольно просто:
tt_content {
fs_slider < lib.fluidContent
fs_slider {
templateName = FluidStyledSlider
dataProcessing {
10 = TYPO3\CMS\Frontend\DataProcessing\FilesProcessor
10 {
references.fieldName = media
}
20 = DanielGoerz\FluidStyledSlider\DataProcessing\FluidStyledSliderProcessor
}
}
}
lib.fluidContent
не намного больше, чем инициализация FLUIDCONTENT
объект. Мы просто меняем имя шаблона (обязательно добавьте путь к шаблону в lib.fluidContent.templateRootPaths
) и укажите, какие dataProcessors мы будем использовать. Ах да, данные Процессоры.
DataProcessors
Это PHP-классы, которые получают данные до того, как они передаются в шаблон. Они могут манипулировать данными или добавлять материалы, присутствующие в шаблоне. TYPO3\CMS\Frontend\DataProcessing\FilesProcessor
например, разрешает все подключенные медиа-элементы для нас, поэтому мы можем получить доступ к объектам FileReference в представлении.DanielGoerz\FluidStyledSlider\DataProcessing\FluidStyledSliderProcessor
пользовательский процессор для иллюстрации того, как это работает.
class FluidStyledSliderProcessor implements DataProcessorInterface
{
/**
* Process data for the CType "fs_slider"
*
* @param ContentObjectRenderer $cObj The content object renderer, which contains data of the content element
* @param array $contentObjectConfiguration The configuration of Content Object
* @param array $processorConfiguration The configuration of this processor
* @param array $processedData Key/value store of processed data (e.g. to be passed to a Fluid View)
* @return array the processed data as key/value store
* @throws ContentRenderingException
*/
public function process(ContentObjectRenderer $cObj, array $contentObjectConfiguration, array $processorConfiguration, array $processedData)
{
// Content of $processedData will be available in the template
// It can be processed here to your needs.
$processedData['slider']['width'] = 1000;
return $processedData;
}
Тем не менее, DataProcessors не являются обязательными.
Шаблон Fluid
Последняя часть головоломки - это фактический шаблон, который в конце получает данные, обработанные всеми указанными обработчиками данных. Это - простая жидкость, поскольку мы знаем (и любим) это:
<html xmlns:f="http://xsd.helhum.io/ns/typo3/cms-fluid/master/ViewHelpers">
<div class="fluid-styled-slider" style="width: {slider.width}px; margin: auto">
<f:for each="{files}" as="file">
<figure class="fluid-styled-slider-item">
<f:image image="{file}" height="{data.imageheight}" width="{data.imagewidth}" alt="{file.properties.alt}" title="{file.properties.title}"/>
<f:if condition="{file.properties.description}">
<figcaption>{file.properties.description}</figcaption>
</f:if>
</figure>
</f:for>
</div>
</html>
Конечно, мы также можем использовать Макеты и Частичные. Обратите внимание, как {data}
содержит строку tt_content из визуализированного элемента содержимого. {files}
добавляется TYPO3\CMS\Frontend\DataProcessing\FilesProcessor
и содержит прикрепленный носитель как надлежащие объекты. {slider.width}
добавлен наш собственный DataProcessor.
Необязательно: Предварительный просмотр в модуле страницы
Мы, вероятно, хотим какой-то предварительный просмотр для наших редакторов в модуле страницы. Есть две примечательные возможности для достижения этой цели:
Шаблон жидкости через PageTSconfigМы можем просто указать текучий шаблон, который будет отображаться как предварительный просмотр в PageTSconfig:
web_layout.tt_content.preview.fs_slider = EXT:fluid_styled_slider/Resources/Private/Templates/Preview/FluidStyledSlider.html
Этот шаблон получит все поля строки tt_content напрямую. Так {header}
содержит заголовок, {bodytext}
содержит текст сообщения и так далее.
Если мы хотим сделать более сложные вещи, такие как разрешение дочерних записей, мы можем зарегистрироваться на tt_content_drawItem
крючок вот так:
$GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['cms/layout/class.tx_cms_layout.php']['tt_content_drawItem']['fluid_styled_slider']
= \DanielGoerz\FluidStyledSlider\Hooks\FsSliderPreviewRenderer::class;
Наш класс должен реализовать \TYPO3\CMS\Backend\View\PageLayoutViewDrawItemHookInterface
,
class FsSliderPreviewRenderer implements PageLayoutViewDrawItemHookInterface
{
/**
* Preprocesses the preview rendering of a content element of type "fs_slider"
*
* @param \TYPO3\CMS\Backend\View\PageLayoutView $parentObject Calling parent object
* @param bool $drawItem Whether to draw the item using the default functionality
* @param string $headerContent Header content
* @param string $itemContent Item content
* @param array $row Record row of tt_content
* @return void
*/
public function preProcess(PageLayoutView &$parentObject, &$drawItem, &$headerContent, &$itemContent, array &$row)
{
if ($row['CType'] === 'fs_slider') {
if ($row['media']) {
$itemContent .= '<h3>Fluid Styled Slider</h3>';
$itemContent .= $parentObject->thumbCode($row, 'tt_content', 'media') . '<br />';
}
$drawItem = false;
}
}
}
Что бы мы ни писали в $itemContent
будет отображаться в модуле страницы внутри нашего элемента содержимого.