Ich bin vor kurzem auf folgendes Problem gestoßen: Ich wollte ein Paginierungs-Partial bauen, um in einem einfachen Plugin Ergebnisse Seite für Seite darstellen zu können. Die Links sollten dabei variabel sein und verschiedene Parameter von TYPO3 erhalten. Dabei fiel mir auf, dass die Standard-ViewHelper in TYPO3 keine Array-Merge-Funktion haben.
Denn ich wollte folgendes machen:
Gegeben sind ein paar Übergabevariabeln im Array $arguments, der in der Fluid-View zu {arguments} wird. Normalerweise würde ich diese dem Action-ViewHelper übergeben: <f:link.action arguments="{arguments}">Link</f:link.action>. Was aber, wenn ich nun {argmuents} noch einen Parameter übergeben will? Hier kommt folgender ViewHelper ins Spiel:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 |
<?php namespace AUXNET\MyExt\ViewHelpers; /*************************************************************** * Copyright notice * * (c) 2015 Dr. Maximilian Kalus <info@auxnet.de>, AUXNET * * All rights reserved * * This script is part of the TYPO3 project. The TYPO3 project is * free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * The GNU General Public License can be found at * http://www.gnu.org/copyleft/gpl.html. * * This script is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * This copyright notice MUST APPEAR in all copies of the script! ***************************************************************/ /** * Apply array merge and define new variable * * @package my_ext * @license http://www.gnu.org/licenses/gpl.html GNU General Public License, version 3 or later * */ class ArrayMergeViewHelper extends \TYPO3\CMS\Fluid\Core\ViewHelper\AbstractViewHelper { /** * @param array $array1 first array * @param array $array2 second array * @param string $variableName variable name to set * @return string content */ public function render($array1, $array2, $variableName = 'merged') { if (!is_array($array1) && !is_array($array2)) $value = null; elseif (!is_array($array1)) $value = $array2; elseif (!is_array($array2)) $value = $array1; else $value = array_merge($array1, $array2); $this->templateVariableContainer->add($variableName, $value); $content = $this->renderChildren(); $this->templateVariableContainer->remove($variableName); return $content; } } ?> |
Der Aufruf in Fluid erfolgt nun wie folgt:
1 2 3 4 5 |
{namespace my=AUXNET\MyExt\ViewHelpers} <my:arrayMerge array1="{arguments}" array2="{page: '1'}"> <f:link.action arguments="{merged}">Start</f:link.action> </my:arrayMerge> |
Innerhalb des Tags my:arrayMerge wird eine Variable {merged} erzeugt, die die Inhalte der beiden Array enthält (im Beispiel oben ist array2 innerhalb von Fluid erzeugt und enthält lediglich den Schlüssel page).