Hello, I’m trying to target the first, last and in-between elements of a repeater array that is the sub-field of a flexible content layout to display previous, next or close buttons in the footer of an image modal based on its position in the array.
The tile_column in the controller is the repeater field that has a sub-field for [‘images’], which will pop-up in a modal when clicked. In the footer of each of these modals I want to display previous, back or close buttons depending on their position in the array.
Here is the controller
<?php
namespace App\Controllers\Partials;
trait FlexibleContent
{
public function flexible_layouts()
{
// Get all page builder fields
$flexible_layouts = get_field('flexible_layouts');
// Set up array
$data = [];
// Loop through each block
if ($flexible_layouts) {
foreach ($flexible_layouts as $flexibleLayouts) {
if ($flexibleLayouts['acf_fc_layout'] == 'two_column_layout_with_video_left') {
// Do any logic for this component here
$this_block = (object) [
'block_type' => $flexibleLayouts['acf_fc_layout'],
'title_and_copy_column' => $flexibleLayouts['title_and_copy_column'],
'video_column' => $flexibleLayouts['video_column'],
'background_color_layout_1' => $flexibleLayouts['background_color_layout_1'],
'background_image_layout_1' => $flexibleLayouts['background_image_layout_1'],
];
array_push($data, $this_block);
} elseif ($flexibleLayouts['acf_fc_layout'] == 'two_column_tile_layout_with_modal') {
$this_block = (object) [
'block_type' => $flexibleLayouts['acf_fc_layout'],
'title_column' => $flexibleLayouts['title_column'],
'tile_column' => $flexibleLayouts['tile_column'],
'button_column' => $flexibleLayouts['button_column'],
'background_color_layout_2' => $flexibleLayouts['background_color_layout_2'],
'background_image_layout_2' => $flexibleLayouts['background_image_layout_2'],
];
array_push($data, $this_block);
}
}
$data = (object) $data;
return $data;
}
}
}
Partial
@if($flexible_layouts)
@foreach($flexible_layouts as $flexibleLayouts)
@if($flexibleLayouts->block_type == 'two_column_layout_with_video_left')
@include('flexible.two-column-layout-video-left')
@elseif($flexibleLayouts->block_type == 'two_column_tile_layout_with_modal')
@include('flexible.two-column-tile-modal')
@endif
@endforeach
@endif
Tile View
@php $counter = 0 @endphp
@php $image_count = count($flexibleLayouts->tile_column) @endphp
@if($flexibleLayouts->tile_column)
@foreach($flexibleLayouts->tile_column as $tile)
@if($tile['title'] || $tile['content'])
<div class="uk-padding-small">
<div class="compose-card-step uk-card uk-card-small uk-text-left">
<div class="uk-card-body">
<h3 class="uk-heading-small uk-text-normal">{!! $tile['title'] !!}</h3>
<p class="liqid-card-copy uk-flex-1 uk-margin-remove-top uk-text-large">{!! $tile['content'] !!}</p>
</div>
</div>
</div>
@elseif($tile['image'])
<?php $image_array = $tile['image'] ?>
<div class="uk-padding-small">
<div class="compose-card-image uk-card uk-card-small uk-card-hover">
<a href="#{{ $tile['current_image_number'] }}" uk-toggle>
<div class="uk-card-body">
<img style class="" src="{!! $tile['image'] !!}">
</div>
</a>
</div>
</div>
<div id="{{ $tile['current_image_number'] }}" class="" uk-modal>
<div class="compose-modal-image uk-card uk-card-small uk-flex uk-flex-column uk-width-xlarge uk-margin-auto-vertical uk-modal-dialog">
<button class="uk-modal-close-default" type="button" uk-close></button>
<div class="uk-card-body">
<img style class="" src="{!! $tile['image'] !!}">
</div>
<div class="uk-card-footer">
@if($counter == 0)
@include('flexible.two-column-tile-modal.tile-footer-1')
@elseif($counter > 0 && $counter < $image_count - 1)
@include('flexible.two-column-tile-modal.tile-footer-2')
@elseif($counter == $image_count - 1)
@include('flexible.two-column-tile-modal.tile-footer-3')
@endif
</div>
</div>
</div>
@php $counter++ @endphp
@endif
@endforeach
@endif
As you can see I’ve tried the counter approach, but its not targeting correctly. Maybe my controller should be setup differently to store the array images in a separate array? Any help is greatly appreciated. Thanks.