So was wie MenuItemProcFunc in Content Element „Menü“ mit Fluid Styled Content

Früher, in den Zeiten von css_styled_content konnte man in das Inhaltselement „Menü“ mittels itemArrayProcFunc eigene Menü-Items einhängen. Das funktioniert nach wie vor mit HMENU und sieht so aus:

1 = TMENU
1 [...]
2 < .1
2 {
	wrap = <ul>|</ul>
	itemArrayProcFunc = My\Extension\Hooks\MenuItemArrayProcessor->process
}

In der Funktion kann man dann z.B. Items aus der eigenen Extension ins Menü hängen, damit es so aussieht als wären es Seiten.

Das hat mit css_styled_content gut funktioniert, da dort das Rendering des Inhaltselemente (unter anderem Menü) ebenfalls mit TypoScript gemacht wurde. Also wenn man den TypoScriptObjectBrowser richtig bedienen kann, dann findet man auch schnell raus, wo man den Code einsetzen muss.

Nun stand ich vor einem Problem (nein, falsch – Herausforderung). In fluid_styled_content ist das Rendering der Content Element komplett über Fluid. So gibt es z.B. einen ViewHelper, der für „Menü ausgewählter Seiten“ die Seiten holt. Die Ausgabe geschieht dann mit Fluid. Nix TypoScript!

Ich habe folgendes implementiert: Falls eine bestimmte Seiten-ID in der Liste vorkommt (es ist meine Ziel-Detailseite), dann schmeiss ich einen weiteren ViewHelper an, der mit die Items mit Titel und Parameter ermittelt. Das Rendering dann wieder mit Fluid.

1) Eigenes Template für „Menü ausgewählter Seiten“ anlegen. Dazu die Datei Type-0.html aus der Extension fluid_styled_content kopieren, in fileadmin oder eigene Extension ablegen und die Pfade entsprechend konfigurieren. Hab auf die schnelle diesen Beitrag auf jweiland.net gefunden, in dem das mit fluid_styled_content erklärt wird. Die Template-Datei etwas so anpassen:

{namespace my=My\Extension\ViewHelpers}
<ce:menu.list pageUids="{pageUids}" as="pages" includeNotInMenu="1">
	<f:if condition="{pages}">
		<ul class="ce-menu ce-menu-0">
			<f:for each="{pages}" as="page">
				<f:if condition="{page.uid} == 40">
					<f:then>
						<my:itemMenuList as="items">
							<f:for each="{items}" as="item">
								<li>
									<f:link.page pageUid="{page.uid}" additionalParams="{item.additionalParams}">
										{item.title}
									</f:link.page>
								</li>
							</f:for>
						</my:itemMenuList>
					</f:then>
					<f:else>
						<li>
							<f:link.page pageUid="{page.uid}">
								<f:if condition="{page.nav_title}">
									<f:then>
										{page.nav_title}
									</f:then>
									<f:else>
										{page.title}
									</f:else>
								</f:if>
							</f:link.page>
						</li>
					</f:else>
				</f:if>
			</f:for>
		</ul>
	</f:if>
</ce:menu.list>

2) Dann den ViewHelper implementieren:

<?php
namespace My\Extension\ViewHelpers;
 
use TYPO3\CMS\Core\Utility\GeneralUtility;
 
class ItemMenuListViewHelper extends \TYPO3\CMS\Fluid\Core\ViewHelper\AbstractViewHelper
{
 
    /**
     * @param string $as
     * @return string
     */
    public function render($as)
    {
        $menuItems = $this->getMenuItems();
 
        $output = '';
 
        if (!empty($menuItems)) {
            $variables = array(
                $as => $menuItems
            );
            $output = $this->renderChildrenWithVariables($variables);
        }
        return $output;
    }
 
    protected function getMenuItems()
    {
        /** @var $db TYPO3\CMS\Core\Database\DatabaseConnection */
        $db = $GLOBALS['TYPO3_DB'];
 
        $tableName = 'tx_extension_domain_model_item';
        $enableFields = $GLOBALS['TSFE']->sys_page->enableFields($tableName);
        $items = $db->exec_SELECTgetRows('*', $tableName, '1' . $enableFields, '', 'title ASC');
        $menuItems = array();
        foreach ($items as $item) {
            $item2 = array();
            $item2['title'] = $item['title'];
            $item2['additionalParams'] = [
                'tx_extension' => [
                    'item' => $item['uid'],
                    'controller' => 'MyController'
                ]
            ];
            $menuItems[] = $item2;
        }
        return $menuItems;
    }
 
    /**
     * @param array $variables
     * @return mixed
     */
    protected function renderChildrenWithVariables(array $variables)
    {
        foreach ($variables as $name => $value) {
            $this->templateVariableContainer->add($name, $value);
        }
 
        $output = $this->renderChildren();
 
        foreach ($variables as $name => $_) {
            $this->templateVariableContainer->remove($name);
        }
 
        return $output;
    }
}

Wenn die Variablen-Benennung in diesem Code komisch vorkommt – ich habe sie alle umbenannt, damit keine Rückschlüsse auf mein Projekt gezogen werden können. Einen Haken hat die Sache aktuell noch – die „statische“ Seiten-ID in der If-Abfrage.

Kommentare sind geschlossen.