你必须编写自己的ViewHelper
这是我对此类 ViewHelper 的实现:
use TYPO3Fluid\Fluid\Core\Rendering\RenderingContextInterface;
use TYPO3Fluid\Fluid\Core\ViewHelper;
use TYPO3Fluid\Fluid\Core\ViewHelper\AbstractViewHelper;
use TYPO3Fluid\Fluid\Core\ViewHelper\Traits\CompileWithRenderStatic;
use TYPO3\CMS\Extbase\Utility\DebuggerUtility;
class LoopViewHelper extends AbstractViewHelper
{
use CompileWithRenderStatic;
/**
* @var bool
*/
protected $escapeOutput = false;
public function initializeArguments()
{
parent::initializeArguments();
$this->registerArgument('increment', 'int', 'The number determing the increment e.g. 2 -> 1, 3, 5, ... (should be positive - absolute value is used!)', false, 1);
$this->registerArgument('start', 'int', 'The starting value to count from', false, 0);
$this->registerArgument('end', 'int', 'The value to count to e.g. 7 and increment 3 -> 1, 3, 6 ( using <=)', true);
$this->registerArgument('reverse', 'boolean', 'If TRUE, iterates in reverse e.g from start to finish with decrement (using increment value) instead of increment', false, false);
$this->registerArgument('iterator', 'string', 'The name of the variable to store iteration information (index, isFirst, isLast, isEven, isOdd)', false, 'iterator');
}
/**
* @param array $arguments
* @param \Closure $renderChildrenClosure
* @param RenderingContextInterface $renderingContext
* @return string
* @throws ViewHelper\Exception
*/
public static function renderStatic(array $arguments, \Closure $renderChildrenClosure, RenderingContextInterface $renderingContext)
{
$templateVariableContainer = $renderingContext->getVariableProvider();
if (!isset($arguments['end'])) {
return '';
}
if ($arguments['reverse']) {
$iterationData = [
'index' => $arguments['end'],
];
$end = $arguments['start'];
$stepValue = abs($arguments['increment']) * -1;
$comparison = 'compareGreater';
}
else
{
$iterationData = [
'index' => $arguments['start'],
];
$end = $arguments['end'];
$stepValue = abs($arguments['increment']);
$comparison = 'compareLesser';
}
$output = '';
for ($i = $iterationData['index']; self::$comparison($i, $end); $i = $i + $stepValue)
{
// $iterationData['isFirst'] = $arguments['start'] === $i;
// $iterationData['isLast'] = $i === $iterationData['total'] + $stepValue;
$iterationData['index'] = $i;
$iterationData['isEven'] = ($i + 1) % 2 === 0;
$iterationData['isOdd'] = !$iterationData['isEven'];
$templateVariableContainer->add($arguments['iterator'], $iterationData);
$output .= $renderChildrenClosure();
$templateVariableContainer->remove($arguments['iterator']);
}
return $output;
}
private static function compareGreater($left, $right) {
return $left >= $right;
}
private static function compareLesser($left, $right) {
return $left <= $right;
}
}
流体:
{namespace wow=Vendor\Ext\ViewHelpers}
<wow:loop start="1" end="53" iterator="iterator">
{iterator.index}
</wow:loop>