Первые шаги описаны здесь отлично: Первые шаги
После этого вам нужно будет включить некоторые классы
namespace Vendor\YourExtensionName\Hooks\PageLayoutView;
use TYPO3\CMS\Backend\View\PageLayoutViewDrawItemHookInterface;
use TYPO3\CMS\Backend\View\PageLayoutView;
use TYPO3\CMS\Core\Utility\GeneralUtility;
use TYPO3\CMS\Extbase\Object\ObjectManager;
use TYPO3\CMS\Fluid\View\StandaloneView;
use TYPO3\CMS\Core\Database\ConnectionPool;
Тогда у вас будет следующее:
class MyPreviewRenderer implements PageLayoutViewDrawItemHookInterface
{
/**
* Preprocesses the preview rendering of a content element of type "Your CType"
*
* @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
)
{
}
Выбор объектов
В функции preProcess
мы должны сначала получить объекты.Не забудь.&parentObjects
сопоставляется с таблицей tt_content, а &row
содержит информацию о текущей записи tt_content, а не информацию о вашем CType, сохраненную в таблице yourTable
.Таким образом, мы должны создать запрос SQL, чтобы получить эту информацию.Для этого у нас есть следующее:
$queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable('yourTable');
$foo = $queryBuilder
->select('*')
->from('yourTable')
->where(
$queryBuilder->expr()->eq('tt_content', $queryBuilder->createNamedParameter($row['uid'], \PDO::PARAM_INT)),
$queryBuilder->expr()->eq('hidden', $queryBuilder->createNamedParameter(0, \PDO::PARAM_INT)),
$queryBuilder->expr()->eq('deleted', $queryBuilder->createNamedParameter(0, \PDO::PARAM_INT)),
)
->execute()
->fetchAll();
То, что мы сделали здесь, - это получить все объекты, которые имеют отношение с uid
в tt_content.Обратите внимание, что tt_content представляет собой поле в yourTable , которое содержит uid
записи таблицы tt_content.
Определить шаблон
Теперь, когда у нас есть все объекты, мы должны определить путь к бэкэнду template .
$objectManager = GeneralUtility::makeInstance(ObjectManager::class);
$standaloneView = $objectManager->get(StandaloneView::class);
$templatePath = GeneralUtility::getFileAbsFileName('EXT:yourExtension/Resources/Private/Templates/Backend/Backend.html');
Теперь мы должны присвоить объекты переменнойчтобы передать их шаблону жидкости.
$standaloneView->setFormat('html');
$standaloneView->setTemplatePathAndFilename($templatePath);
$standaloneView->assignMultiple([
'foo' => $foo,
'cTypeTitle' => $parentObject->CType_labels[$row['CType']],
]);
И, наконец, отрендерить шаблон:
$itemContent .= $standaloneView->render();
$drawItem = false;
Дополнительная информация:
ItРекомендуется, чтобы вы завернули весь свой код (внутри функции preProcess
) в CType, к которому он принадлежит.Для этого вам нужно будет обернуть его так:
if ($row['CType'] === 'yourCTypeName') {
//...
}