TYPO3: Как создать бэкэнд-вид с помощью Standalone. (Пользовательские элементы содержимого) - PullRequest
0 голосов
/ 03 мая 2019

Как я могу создать шаблон представления бэкэнда, но как HTML для пользовательских элементов содержимого.

Я знаю, что должен использовать автономный класс, но я не знаю как.

Система : TYPO3 v9 Режим : режим композитора Цель : элемент пользовательского содержимого

1 Ответ

0 голосов
/ 03 мая 2019

Первые шаги описаны здесь отлично: Первые шаги

После этого вам нужно будет включить некоторые классы

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