【发布时间】:2022-08-13 21:25:55
【问题描述】:
我已经看到 Georg Ringer 通过控制器添加类别,我正在尝试让 ViewHelper 来执行此操作...
<?php
namespace Vendor\\Extension\\ViewHelpers;
use TYPO3\\CMS\\Core\\Utility\\GeneralUtility;
use TYPO3\\CMS\\Core\\Database\\ConnectionPool;
use TYPO3Fluid\\Fluid\\Core\\ViewHelper\\AbstractViewHelper;
/**
* will return system categories (sys_category) array of an element
*/
class CategoriesOutputViewHelper extends AbstractViewHelper
{
protected $escapeOutput = false;
public function initializeArguments()
{
$this->registerArgument(\'CEUid\', \'integer\', \'record UID, e.g. of a content element\', true);
}
/**
* Get content element registered categories
*/
protected function getCategories(int $CEUid): ?array
{
$queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable(\'sys_category\');
return $queryBuilder
->select(\'sys_category.uid\', \'sys_category.title\', \'sys_category.shortcut\')
->from(\'sys_category\')
->join(
\'sys_category\',
\'sys_category_record_mm\',
\'mm\',
$queryBuilder->expr()->eq(
\'mm.uid_local\',
\'sys_category.uid\'
)
)
->where(
$queryBuilder->expr()->eq(
\'mm.uid_foreign\',
$queryBuilder->createNamedParameter($CEUid, \\PDO::PARAM_INT)
),
$queryBuilder->expr()->eq(
\'mm.tablenames\',
$queryBuilder->quote(\'tt_content\')
),
$queryBuilder->expr()->eq(
\'mm.fieldname\',
$queryBuilder->quote(\'categories\')
)
)
->execute()
->fetchAll();
}
/**
* Do category translation overlay
*/
public function render()
{
$CEUid = $this->arguments[\'CEUid\'];
$categories = $this->getCategories($CEUid);
foreach ($categories as $key => $category) {
$overlaidCategory = $category;
if ($overlaidCategory !== null){
$categories[$key] = $overlaidCategory;
}
}
return $categories;
}
}
显然在我的渲染函数中什么都没有发生,但这就是我可以让事情工作的程度,它以默认语言返回正确的类别数组......
在流体中,我这样称呼它(rs 是扩展名称空间):
<f:if condition=\"{data.categories}\">
<span class=\"category-list\">
<f:for each=\"{rs:CategoriesOutput(CEUid: data.uid)}\" as=\"category\" iteration=\"iteration\">
<f:if condition=\"{category.shortcut}\">
<f:then>
<f:link.typolink parameter=\"{category.shortcut}\">
{category.title}
</f:link.typolink>
</f:then>
<f:else>
{category.title}
</f:else>
</f:if>
<f:if condition=\"!{iteration.isLast}\">
::
</f:if>
</f:for>
</span>
</f:if>
我正在使用 V11.5.13,但我认为 V9 及更高版本的解决方案将是相同的,感谢您的关注
-
快速思考一下:Viewhelpers 是否总是以小写形式调用?
-
那将仅确定本地化吗? viewhelper 确实提供了默认语言的类别
标签: php typo3 categories typo3-9.x view-helpers