基于整数的迭代

问题描述 投票:0回答:1
typo3 fluid
1个回答
0
投票

你必须编写自己的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>
© www.soinside.com 2019 - 2024. All rights reserved.