如何创建一个后端视图模板,但是为自定义内容元素 html 。
我知道我必须使用独立课程,但我不知道如何使用。
系统:typo3 v9
模式:作曲家模式
TARGET :自定义内容元素
第一个步骤在这里完美地描述了:第一步骤
之后,您必须包括一些类
namespace VendorYourExtensionNameHooksPageLayoutView;
use TYPO3CMSBackendViewPageLayoutViewDrawItemHookInterface;
use TYPO3CMSBackendViewPageLayoutView;
use TYPO3CMSCoreUtilityGeneralUtility;
use TYPO3CMSExtbaseObjectObjectManager;
use TYPO3CMSFluidViewStandaloneView;
use TYPO3CMSCoreDatabaseConnectionPool;
然后您有以下内容:
class MyPreviewRenderer implements PageLayoutViewDrawItemHookInterface
{
/**
* Preprocesses the preview rendering of a content element of type "Your CType"
*
* @param TYPO3CMSBackendViewPageLayoutView $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条目的信息,而不是保存在yourTable
表上的CTYPE的信息。因此,我们必须创建一个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();
我们在这里所做的就是获取与TT_CONTENT uid
有关系的所有对象。请注意,tt_content是 field 在 yourtable 中,该容纳了TT_Content的表格条目的uid
。
定义模板
现在我们拥有所有对象,我们必须定义通往后端模板的路径。
$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;
其他信息:
建议您将所有代码(在preProcess
函数内部(包含在其所属的CTYPE中。为此,您必须像这样包装它:
if ($row['CType'] === 'yourCTypeName') {
//...
}