TYPO3 – sys-category via typoscript und Fluid viewhelper auslesen

Im Netz findet man nicht wirklich Hilfe wenn es um das Thema TYPO3 System-Kategorien geht, die es seit der 6.2 Version im Core gibt.
Ich möchte Euch zwei Wege zeigen wie man diese einmal via typoscript auslesen kann und einmal via PHP als Viewhelper, damit wir die Categories Daten direkt im FLUID-Template verwenden können.

Hier einmal der erste Weg, via PHP / ViewHelper / Fluid:

Bindet dazu in Eure eigene Extension im Ordner diese Datei ein:
extname/Classes/ViewHelpers/SysCategoryViewHelper.php

<?php
namespace ID\Simpletemplates\ViewHelpers;

/*
 *  The MIT License (MIT)
 *
 *  Copyright (c) 2017 INGENIUMDESIGN, http://www.ingeniumdesign.de/
 *
 *  Permission is hereby granted, free of charge, to any person obtaining a copy
 *  of this software and associated documentation files (the "Software"), to deal
 *  in the Software without restriction, including without limitation the rights
 *  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 *  copies of the Software, and to permit persons to whom the Software is
 *  furnished to do so, subject to the following conditions:
 *
 *  The above copyright notice and this permission notice shall be included in
 *  all copies or substantial portions of the Software.
 *
 *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 *  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 *  THE SOFTWARE.
 */

use TYPO3\CMS\Core\Utility\GeneralUtility;
use TYPO3\CMS\Core\Database\ConnectionPool;

/*
 * <html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" xmlns:id="http://typo3.org/ns/ID/Simpletemplates/ViewHelpers" data-namespace-typo3-fluid="true">
 * 
 * 
 * 
 * // get everything with parent = 1 (array would work too)
 * <id:SysCategory uid="1" byParentId="true" />
 * <f:debug>{sysCategoryDetailArray}</f:debug>
 * 
 * // by single ID
 * <id:SysCategory uid="1" />
 * <f:debug>{sysCategoryDetailArray}</f:debug>
 * 
 * // by specific IDs
 * <id:SysCategory uid="{0: 1, 1: 2, 2:3}" />
 * <f:debug>{sysCategoryDetailArray}</f:debug>
 * 
 * 
 * // everything:
 * <id:SysCategory />
 * <f:debug>{sysCategoryDetailArray}</f:debug>
 * 
 */

class SysCategoryViewHelper extends \TYPO3\CMS\Fluid\Core\ViewHelper\AbstractViewHelper {

    /**
     * @params integer $uid (CE)
     * @params string $tableCell (of sys_category)
     * @return CategorieName
     * @author INGENIUMDESIGN
     */
    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);
    }

}

/*
 * TODO: Multilang
 */

Ich habe im Code auch schon die vorhanden Variablen beschrieben:

// get everything with parent = 1 (array would work too)
<id:SysCategory uid="1" byParentId="true" />
<f:debug>{sysCategoryDetailArray}</f:debug>

// by single ID
<id:SysCategory uid="1" />
<f:debug>{sysCategoryDetailArray}</f:debug>

// by specific IDs
<id:SysCategory uid="{0: 1, 1: 2, 2:3}" />
<f:debug>{sysCategoryDetailArray}</f:debug>

// everything:
<id:SysCategory />
<f:debug>{sysCategoryDetailArray}</f:debug>

Im Fluid Tempalte selbst, könnt Ihr nun oben den ViewHelper laden, mit folgender Code-Zeile:


<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers"
 xmlns:id="http://typo3.org/ns/ID/Simpletemplates/ViewHelpers"
 data-namespace-typo3-fluid="true">

Dann könnt Ihr einen der oberen Beispiel-Fluid-Codes beliebig einbinden und via Debug die Felder auslesen.
Ich werde den ViewHelper noch weiter ausbauen und dann hier updaten.

TypoScript

Hier nun die TypoScript Version um die sys_category auszulesen:

Legt dazu einfach im typoscript-Ordner oder in einer neuen ts-Datei diesen dataProcessing Code an.

lib.contentElement {
    dataProcessing {
        999 = TYPO3\CMS\Frontend\DataProcessing\DatabaseQueryProcessor
        999 {
            if.isTrue.field = categories
            table = sys_category
            selectFields = sys_category.*
            pidInList = this
            recursive = 999
            join = sys_category_record_mm ON sys_category.uid = sys_category_record_mm.uid_local
            where.data = field:uid
            where.wrap = sys_category_record_mm.tablenames = 'tt_content' and sys_category_record_mm.uid_foreign='|'
            orderBy = sys_category.sorting
            as = categories
        }
    }
}

Wichtig ist hier aber noch, dass alle Kategorien in einem Ordner liegen.
Hier gibt es leider noch keine Lösung wenn die Kategorien in verschieden Ordner abgelegt sind.

Wenn wir nun im Fluid-Tempalte einmal den {_all} aufrufen, so sollte nun unter „categories“ alle Informationen der Kategorien erfolgen.
Wichtig ist, wir müssen Backend-Elemente auch eine Kategorie zuweisen.

Vielen Dank an @Benjamin und @Kurt

Eure Meinung zu dem Artikel ist gefragt! Schreibt mir ein Kommentar

Hat Euch der Artikel weitergeholfen oder gefallen?
Ich freue mich auf einen Blick auf meine Amazon-Wunschliste. Vielen Dank!

Hat Euch der Artikel weitergeholfen oder gefallen? Ich freue mich auf einen Blick auf meine Amazon-Wunschliste. Vielen Dank!Ich bin freiberuflicher TYPO3-Entwickler, Web-Entwickler und Frontend-Entwickler. Ich arbeite im und für das Web etwas mehr als 12 Jahre. Mehr Infos zu der TYPO3 Internetagentur - INGENIUMDESIGN.

Leave a Reply