【问题标题】:How to get the selected categories for an CE in the selected language如何以所选语言获取 CE 的所选类别
【发布时间】: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


【解决方案1】:

我以为有人会有答案......最终我解决了,不需要“覆盖”,因为我一开始就坚持,只是提出了包含语言的查询,我做了如下:

<?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 the system categories (sys_category) data of an element as a localized array
 */
class CategoriesOutputViewHelper extends AbstractViewHelper
{
    protected $escapeOutput = false;

    public function initializeArguments()
    {
        $this->registerArgument('CEUid', 'integer', 'record UID, e.g. of a content element', true);
        $this->registerArgument('LangId', 'integer', 'language ID of the page', true);
    }


    public function render(): ?array
    {
        $CEUid = $this->arguments['CEUid'];
        $LangId = $this->arguments['LangId'];

        $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable('sys_category');

        return $queryBuilder
            ->select('sys_category.uid', 'sys_category.title')
            ->from('sys_category')
            ->join(
                'sys_category',
                'sys_category_record_mm',
                'mm',
                $queryBuilder->expr()->or(
                    $queryBuilder->expr()->eq(
                        'mm.uid_local',
                        'sys_category.uid'
                    ),
                    $queryBuilder->expr()->eq(
                        'mm.uid_local',
                        'sys_category.t3_origuid'
                    )
                )
            )
            ->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')
                ),
                $queryBuilder->expr()->in(
                    'sys_category.sys_language_uid',
                    $queryBuilder->createNamedParameter($LangId, \PDO::PARAM_INT)
                )
            )
            ->execute()
            ->fetchAll();
    }
}

JOIN 必须包含翻译语音的 t3_original 字段,WHERE sys_language_uid ...

现在在流体模板中调用它也必须给出这样的语言:

<f:for each="{rs:CategoriesOutput(CEUid: data.uid, LangId: data.sys_language_uid)}" as="category">
  {category.title}
</f:for>

只是为了适当的信用;我从这里的工作示例开始:Hagen Gebauer 的musikinsnetz.de,他只是从未完成本地化,谢谢

【讨论】:

    猜你喜欢
    • 2021-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-06
    • 1970-01-01
    相关资源
    最近更新 更多