TYPO3:如何使用Standalone创建后端视图。 (自定义内容元素)

时间:2019-05-03 13:44:12

标签: php html typo3 backend typo3-9.x

如何为自定义内容元素创建后端视图模板,但以 HTML 格式创建。

我知道我必须使用Standalone类,但我不知道如何使用。

系统:TYPO3 v9
模式:作曲者模式
目标:自定义内容元素

1 个答案:

答案 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')  {
    //...
}