TYPO3 Fluid 将迭代器用于第二个数组

xxx*_*xxx 4 arrays iteration loops typo3 content-management-system

我目前正在开发一个TYPO3扩展,我有两个独立阵列工作:一个包含有关产品(文本信息自行车),第二个包含相应的图像(bikesimages)。在前端模板中,我使用 for 循环遍历产品。

我的问题:如何使用 for 循环的迭代器 ( bikeIterator ) 访问第二个数组的相同索引?

<f:for each="{bikes}" as="bike" iteration="bikeIterator">               
    <div class="teaser-image"><f:image src="{bikesimages.{bikeIterator}}" alt="{bike.manufacturer} {bike.type}" /></div>
Run Code Online (Sandbox Code Playgroud)

这不起作用。如何正确使用迭代器?

Dan*_*iel 5

{bikeIterator}是一个对象本身,具有您可以使用的多种方法/属性。我给你举个例子。鉴于您有 3 辆自行车,迭代器为您提供以下选项:

第一辆自行车:

{bikeIterator.index} = 0
{bikeIterator.cycle} = 1
{bikeIterator.isFirst} = 1
{bikeIterator.isLast} = 0
{bikeIterator.isEven} = 0
{bikeIterator.isOdd} = 1
Run Code Online (Sandbox Code Playgroud)

第二辆自行车:

{bikeIterator.index} = 1
{bikeIterator.cycle} = 2
{bikeIterator.isFirst} = 0
{bikeIterator.isLast} = 0
{bikeIterator.isEven} = 1
{bikeIterator.isOdd} = 0
Run Code Online (Sandbox Code Playgroud)

第三辆自行车:

{bikeIterator.index} = 2
{bikeIterator.cycle} = 3
{bikeIterator.isFirst} = 0
{bikeIterator.isLast} = 1
{bikeIterator.isEven} = 0
{bikeIterator.isOdd} = 1
Run Code Online (Sandbox Code Playgroud)

TYPO3 >= 8LTS

由于TYPO3 8LTS 流体具有动态可变分配能力。所以你可以使用这个解决方案:

<f:for each="{bikes}" as="bike" iteration="bikeIterator">               
    <div class="teaser-image"><f:image src="{bikesimages.{bikeIterator.index}}" alt="{bike.manufacturer} {bike.type}" />
</div>
Run Code Online (Sandbox Code Playgroud)

TYPO3 <= 7LTS

反正在TYPO3 7LTS或降低你不能传递{bikeIterator.index}{bikesimages}像你这样的尝试。我建议实现您自己的 ViewHelper,它接受{bikeIterator.index}{bikesimages}objectStorage 或数组并返回图像 src 的路径。

所以你可以事后在你的模板中写:

<f:image src="{myNamespace:myViewHelper(index:bikeIterator.index, bikesImgaes: bikesImages)}" alt="{bike.manufacturer} {bike.type}" />
Run Code Online (Sandbox Code Playgroud)

在你的 ViewHelper 你有这样的东西:

/**  
 * @param integer $index
 * @param array $bikesImages
 * @return string
 */ 
public function render($index, $bikesImages) {
    return $bikesImages[$index] ?: 'path/to/dummyImage.png';
}
Run Code Online (Sandbox Code Playgroud)