在动作中呈现内容元素或通过 typenum 过滤它们

Render content elements in an action or filter them via typenum

我只想通过 ajax 获取特定类型的内容元素,例如图片、文本或自定义元素。

我的第一个尝试是创建一个 typeNum 来触发 ajax 请求。从当时在我的控制器中调用的操作中,我想获取某个页面的内容元素,呈现它们并在响应中 return 它们。我完全不知道该怎么做。当我有页面 ID 时如何获取内容元素以及之后如何呈现它们?

我的另一个想法是创建一个 typeNum,在其中我将内容元素过滤为我需要的类型,但我不知道这在 TypoScript 中是否可行。

在您的操作中,您可以执行查询以检索页面的内容元素并按 CType 过滤它们('text'、'textpic'、'image'、.. .) :

/** @var \TYPO3\CMS\Core\Database\Query\QueryBuilder $queryBuilder */
$queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable('tt_content');

/** @var \Doctrine\DBAL\Driver\Statement $statement */
$statement = $queryBuilder->select('uid', 'title')
    ->from('tt_content')
    ->where(
    $queryBuilder->expr()->andX(
        $queryBuilder->expr()->eq('pid', $queryBuilder->createNamedParameter($pid, Connection::PARAM_INT)),
        $queryBuilder->expr()->eq('CType', $queryBuilder->createNamedParameter($cType, Connection::PARAM_STR)),
    )
    ->execute()
   
$listCE = $statement->fetchAll();

然后使用独立视图呈现内容元素:

/** @var StandaloneView $view */
$view = GeneralUtility::makeInstance(StandaloneView::class);

$view->setLayoutRootPaths([GeneralUtility::getFileAbsFileName('EXT:my_ext/Resources/Private/Layouts')]);
$view->setPartialRootPaths([GeneralUtility::getFileAbsFileName('EXT:my_ext/Resources/Private/Partials')]);
$view->setTemplateRootPaths([GeneralUtility::getFileAbsFileName('EXT:my_ext/Resources/Private/Templates')]);
$view->setTemplate('MyContentElementTemplate.html');

$view->assign('contentElements', $listCE);

// Render the content
$myContent = $view->render();