我正在为我们的网站创建一个小新闻页面,其中包含一个内容元素,可使用菜单数组获取子页面。因此,我为每篇文章分配了一个类别。但是我开始变得非常迫切地想找到一个解决方案来输出分配给 TYPO3 中页面的类别,用于
sys_category
表。
我尝试了多种解决方案,例如 Sebastian Schmal 的SysCategoryViewHelper 或 Hagen Gebauer 的CategoriesOutput ViewHelper 或各种 TS 解决方案——但我总是以失败告终。
ViewHelper 没有注册变量(并且我已经正确命名了所有内容)或者我得到了一个数组但我无法输出与单个页面对应的类别的标题。
这是我目前拥有的新闻部分的(清理过的)代码:
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" xmlns:e="http://typo3.org/ns/Evocan/EvocanTemplate/ViewHelpers" data-namespace-typo3-fluid="true">
<f:layout name="Default" />
<f:section name="Main">
<f:if condition="{menu}">
<f:for each="{menu}" as="page">
<article href="{page.link}"{f:if(condition: page.target, then: ' target="{page.target}"')} title="{page.title}"></a>
<h3>{page.title}</h3>
<p>{page.data.abstract}</p>
<f:for each="{e:SysCategory(uid: page.data.uid)}" as="category">
<span>{category.title}</span>
</f:for>
</article>
</f:for>
</f:if>
</f:section>
</html>
在目前的设置中,我得到了 sysCategoryDetailArray,它显示了每个类别的“数组”,例如它的标题。但是流体代码中的输出是空的。
这是我目前正在使用的ViewHelper:
<?php
namespace Evocan\EvocanTemplate\ViewHelpers;
use TYPO3\CMS\Core\Utility\GeneralUtility;
use TYPO3\CMS\Core\Database\ConnectionPool;
use \TYPO3Fluid\Fluid\Core\ViewHelper\AbstractViewHelper;
class SysCategoryViewHelper extends AbstractViewHelper {
/**@param integer $uid (CE)
@param string $tableCell (of sys_category)
@return CategorieName*/
public function initializeArguments() {
$this->registerArgument('uid', 'integer', 'enthaelt die UID des CE', TRUE);
/* $this->registerArgument('tableCell', 'string', 'enthaelt das Tabellenelement aus sys_category', TRUE);
$this->registerArgument('table', 'string', 'enthaelt den Tabellennamen aus sys_category_record_mm', TRUE); */
}
/**
* @param mixed $uid
* @param boolean $byParentId
*/
public function render($uid = null, $byParentId = false) {
$queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable('sys_category');
$query = $queryBuilder
->select('*')
->from('sys_category');
if ($uid !== null) {
$uid = is_array($uid) ? $uid : [$uid];
$query->where(
$queryBuilder->expr()->in(
$byParentId ? 'parent' : 'uid',
$uid
)
);
}
$result = $query->execute();
$res = [];
while ($row = $result->fetch()) {
$res[] = $row;
}
$this->templateVariableContainer->add('sysCategoryDetailArray', $res);
}
}
这是为新闻内容元素生成的拼写菜单:
news =< lib.contentElement
news {
templateName = News
dataProcessing {
140 = TYPO3\CMS\Frontend\DataProcessing\MenuProcessor
140 {
special = directory
includeNotInMenu = 1
special.value.field = pages
}
150 = TYPO3\CMS\Frontend\DataProcessing\FilesProcessor
150 {
references.fieldName = image
}
}
}
我已经在 ViewHelper 文件中尝试过不同版本的流畅代码,例如
<id:SysCategory uid="{page.data.uid}" />
。
如果有人能指出我正确的方向,我将不胜感激!
我想我找到了一个更简单的解决方案: 我将不使用系统类别,而是将子页面创建为类别,并使用每个子页面的标题作为类别名称(因为每篇新闻文章只需要一个类别)。这将节省我很多精力。