如何为自定义内容元素创建后端视图模板,但以 HTML 格式创建。
我知道我必须使用Standalone类,但我不知道如何使用。
系统:TYPO3 v9
模式:作曲者模式
目标:自定义内容元素
答案 0 :(得分:0)
此处完美地描述了第一步:First steps
在那之后,您将必须包括一些课程
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条目的信息,而不是保存在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是您的表中的字段,其中包含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') {
//...
}