TYPO3 Random Content nach Kategorie ausgeben

Für mein aktuelles Projekt musste ich folgende Aufgabenstellung lösen und ich finde, dass ich eine elegante Lösung dafür gefunden habe. Auf der Startseite sollen in mehreren Spalten Inhalte zufällig ausgegeben werden. Damit die Benutzer bestimmen können, in welchen Spalten welche Inhalte ausgegeben werden, habe ich global Kategorien angelegt (ich nenne sie hiermal Kat1, Kat2, Kat3). In einem Storage-Ordner können nun beliebige Inhalte abgelegt werden und einer (oder mehreren Kategorien) zugewiesen werden. Für die Ausgabe habe ich ein Plugin erstellt, dort kann man die Kategorie für die Ausgabe definieren. Nun wird es interessant: Wie kann man die Inhalte einer bestimmten Kategorie im Plugin auslesen und bei der Ausgabe das normale Rendering der TYPO3 Content Elemente nutzen?

Inspiriert von diesem Beitrag Variierender Content anhand der System Kategorien habe ich folgendes Vorgehen gewählt.

In der Show-Funktion des Controllers erstelle ich die Konfiguration und erzeuge die Ausgabe mithilfe des Content Renderers. Ich definieren mein Plugin auf die übliche Art und Weise in ext_localconf.php und ext_tables.php, setze zusätzlich die Storage Pid in den Settings:

plugin.tx_myext {
	persistence {
		storagePid = {$randomContentStorage}
	}
	settings {
		storagePid = {$randomContentStorage}
	}
}

Die die Auswahl der Kategorie im Plugin nehme ich ein Flexform (das ist nur der relevante Teil davon):

<settings.category>
    <TCEforms>
        <exclude>1</exclude>
        <label>LLL:EXT:ewwald/Resources/Private/Language/locallang_db.xlf:ff.category</label>
        <config>
            <type>group</type>
            <internal_type>db</internal_type>
            <allowed>sys_category</allowed>
            <size>1</size>
            <maxitems>1</maxitems>
            <minitems>0</minitems>
            <show_thumbs>1</show_thumbs>
            <wizards>
                <suggest>
                    <type>suggest</type>
                </suggest>
            </wizards>
        </config>
    </TCEforms>
</settings.category>

Dann erstelle ich eine Klasse RandomContentController mit meiner Show Funktion:

public function showAction()
{
    $conf = [
        'table' => 'tt_content',
        'select.' => [
            'pidInList' => $this->settings['storagePid'],
            'join' => 'sys_category_record_mm ON tt_content.uid = sys_category_record_mm.uid_foreign',
            'groupBy' => 'uid',
            'where' => 'sys_category_record_mm.uid_local = '.(int)$this->settings['category'].' AND sys_category_record_mm.tablenames = \'tt_content\'',
            'max' => '1',
            'orderBy' => 'rand()'
        ]
    ];
    $html = $GLOBALS['TSFE']->cObj->cObjGetSingle('CONTENT', $conf);
    return $html;
}

Das wars! Keine Models und Repositories, keine Templates. Die Inhaltselemente werden wie andere Inhaltselemente ausgegeben.

Kommentare sind geschlossen.