Typo3:如何使用独立创建后端视图.(自定义内容元素)



如何创建一个后端视图模板,但是为自定义内容元素 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')  {
    //...
}

相关内容

  • 没有找到相关文章