Skip to content

Commit 515238f

Browse files
committed
Implement a grid element using the nested content elements feature
1 parent f3f53d1 commit 515238f

File tree

7 files changed

+109
-0
lines changed

7 files changed

+109
-0
lines changed
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace ContaoBootstrap\Grid\Component\ContentElement;
6+
7+
use Contao\ContentModel;
8+
use Contao\CoreBundle\Controller\ContentElement\AbstractContentElementController;
9+
use Contao\CoreBundle\DependencyInjection\Attribute\AsContentElement;
10+
use Contao\CoreBundle\Twig\FragmentTemplate;
11+
use ContaoBootstrap\Core\Helper\ColorRotate;
12+
use ContaoBootstrap\Grid\Exception\GridNotFound;
13+
use ContaoBootstrap\Grid\GridIterator;
14+
use ContaoBootstrap\Grid\GridProvider;
15+
use Symfony\Component\HttpFoundation\Request;
16+
use Symfony\Component\HttpFoundation\Response;
17+
18+
#[AsContentElement('bs_grid_wrapper', 'bs_grid', nestedFragments: true)]
19+
final class GridWrapperElementController extends AbstractContentElementController
20+
{
21+
public function __construct(
22+
private readonly GridProvider $provider,
23+
private readonly ColorRotate $colorRotate,
24+
) {
25+
}
26+
27+
protected function getResponse(FragmentTemplate $template, ContentModel $model, Request $request): Response
28+
{
29+
$template->iterator = $this->getIterator($model);
30+
$template->name = $model->bs_grid_name;
31+
$template->color = $this->colorRotate->getColor('ce:' . $model->id);
32+
$template->isBackend = $this->isBackendScope($request);
33+
34+
return $template->getResponse();
35+
}
36+
37+
protected function getIterator(ContentModel $model): GridIterator|null
38+
{
39+
try {
40+
$iterator = $this->provider->getIterator('ce:' . $model->id, (int) $model->bs_grid);
41+
$this->tagResponse('contao.db.tl_bs_grid.' . $model->bs_grid);
42+
43+
return $iterator;
44+
} catch (GridNotFound) {
45+
// Do nothing. In backend view an error is shown anyway.
46+
return null;
47+
}
48+
}
49+
}

src/Resources/config/services.yaml

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
11
services:
2+
_defaults:
3+
autowire: true
4+
autoconfigure: true
25
contao_bootstrap.grid.grid_builder:
36
class: ContaoBootstrap\Grid\GridBuilder
47
arguments:
@@ -10,6 +13,11 @@ services:
1013
arguments:
1114
- '@contao_bootstrap.grid.grid_builder'
1215

16+
ContaoBootstrap\Grid\Component\ContentElement\GridWrapperElementController:
17+
arguments:
18+
- '@contao_bootstrap.grid.grid_provider'
19+
- '@contao_bootstrap.core.helper.color_rotate'
20+
1321
ContaoBootstrap\Grid\Component\ContentElement\GridStartElementController:
1422
arguments:
1523
- '@netzmacht.contao_toolkit.template_renderer'

src/Resources/contao/dca/tl_content.php

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,20 @@
2727
* Palettes
2828
*/
2929

30+
$GLOBALS['TL_DCA']['tl_content']['metapalettes']['bs_grid_wrapper'] = [
31+
'type' => [
32+
'title',
33+
'headline',
34+
'type',
35+
'bs_grid',
36+
'bs_grid_name',
37+
],
38+
'template' => [':hide', 'customTpl'],
39+
'protected' => [':hide', 'protected'],
40+
'expert' => [':hide', 'guests', 'cssID'],
41+
'invisible' => ['invisible', 'start', 'stop'],
42+
];
43+
3044
$GLOBALS['TL_DCA']['tl_content']['metapalettes']['bs_gridStart'] = [
3145
'type' => [
3246
'type',

src/Resources/contao/languages/de/modules.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
declare(strict_types=1);
44

55
$GLOBALS['TL_LANG']['CTE']['bs_grid'] = 'Grid';
6+
$GLOBALS['TL_LANG']['CTE']['bs_grid_wrapper'][0] = 'Grid';
7+
$GLOBALS['TL_LANG']['CTE']['bs_grid_wrapper'][1] = 'Grid mit verschachtelten Elementen';
68
$GLOBALS['TL_LANG']['CTE']['bs_gridSeparator']['0'] = 'Grid-Trennung';
79
$GLOBALS['TL_LANG']['CTE']['bs_gridSeparator']['1'] = 'Grid-Trennelement';
810
$GLOBALS['TL_LANG']['CTE']['bs_gridStart']['0'] = 'Grid-Start';

src/Resources/contao/languages/en/modules.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44

55
$GLOBALS['TL_LANG']['CTE']['bs_grid'] = 'Grid';
66

7+
$GLOBALS['TL_LANG']['CTE']['bs_grid_wrapper'][0] = 'Grid';
8+
$GLOBALS['TL_LANG']['CTE']['bs_grid_wrapper'][1] = 'Grid with nested elements';
79
$GLOBALS['TL_LANG']['CTE']['bs_gridStart'][0] = 'Grid Start';
810
$GLOBALS['TL_LANG']['CTE']['bs_gridStart'][1] = 'Grid Start Element';
911
$GLOBALS['TL_LANG']['CTE']['bs_gridSeparator'][0] = 'Grid Separator';

src/Resources/contao/templates/twig/.twig-root

Whitespace-only changes.
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
{% extends "@Contao/content_element/_base.html.twig" %}
2+
3+
{% block content %}
4+
{% if isBackend %}
5+
{% if iterator is not null %}
6+
{% for fragment in nested_fragments %}
7+
<div><span style="color: {{ color }}">{{ name }}</span> <span class="tl_gray">[{{ iterator.current }}]</span></div>
8+
{{ content_element(fragment) }}
9+
{% endfor %}
10+
{% else %}
11+
{% for fragment in nested_fragments %}
12+
{{ content_element(fragment) }}
13+
{% endfor %}
14+
{% endif %}
15+
{% else %}
16+
{% if iterator is not null %}
17+
<div class="{{ iterator.row }}">
18+
{% for fragment in nested_fragments %}
19+
{% for reset in iterator.resets %}
20+
<div class="clearfix w-100 {{ reset }}"></div>
21+
{% endfor %}
22+
<div class="{{ iterator.current }}">
23+
{{ content_element(fragment) }}
24+
</div>
25+
{% endfor %}
26+
</div>
27+
{% else %}
28+
<span class="tl_gerror">{{ 'ERR.bsGridParentMissing'|trans({}, 'contao_default') }}</span>
29+
{% for fragment in nested_fragments %}
30+
{{ content_element(fragment) }}
31+
{% endfor %}
32+
{% endif %}
33+
{% endif %}
34+
{% endblock %}

0 commit comments

Comments
 (0)