在 TYPO3 11.5 中使用 Viewhelper 在 Fluid 中输出页面类别

问题描述 投票:0回答:1

我正在为我们的网站创建一个小新闻页面,其中包含一个内容元素,可使用菜单数组获取子页面。因此,我为每篇文章分配了一个类别。但是我开始变得非常迫切地想找到一个解决方案来输出分配给 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}" />

如果有人能指出我正确的方向,我将不胜感激!

typo3 categories typoscript fluid view-helpers
1个回答
0
投票

我想我找到了一个更简单的解决方案: 我将不使用系统类别,而是将子页面创建为类别,并使用每个子页面的标题作为类别名称(因为每篇新闻文章只需要一个类别)。这将节省我很多精力。

© www.soinside.com 2019 - 2024. All rights reserved.