Vordefiniertes Content-Element für Redakteure

Für die Anzeige von Datensätzen eines MetaModel steht die MM-Liste als Content-Element bzw. FE-Modul zur Verfügung. Hier muss man verschiedene Auswahlen wie das MetaModel, Rendersetting, Filterung usw. treffen - das kann für Redakteure unter Umständen nicht gewünscht sein.

Gibt es den Wunsch, dass Redeakteure bei einem festgelegten MetaModel einfach ein oder mehrere Datensätze auswählen und diese angezeigt werden sollen, kann man das zum Beispiel mit den folgenden Methoden durchführen.

Auswahl und Anzeige mit Erweiterung RockSolid Custom Elements

RockSolid Custom Elements (RST-CE) geben einem die Möglichkeit, sämtliche im Contao Backend verfügbaren Eingabefelder nach belieben als Content Element und/oder Modul zur Verfügung zu stellen. Mehr dazu auf der Webseite von RockSolid oder Vortrag der CK24 von Marcus Lelle.

Im folgenden Beispiel soll ein einzelner Point-of-Interest (POI) durch den Redakteur ausgewählt und im FE angezeigt werden können. In der Auswahl soll der Name und der Ort erscheinen.

Wie bei RST-CE üblich, muss eine Konfigurationsdatei für die Anzeige im BE sowie ein Template für die FE-Ausgabe erstellt werden. Die Quelltexte sollen nur das Vorgehen verdeutlichen und wie angegeben ist eine Auslagerung der API-Abfragen in separate Dateien zu empfehlen. Mehr zu den Abfragen bei MetaModels API oder dem Vortrag von Ingolf Steinhardt zur CK23

 1<?php
 2//rsce_mm_poi_single_config.php
 3/**
 4 * Auswahl eines POI in RST-CE.
 5 *
 6 * Hinweis: Die Ermittlung der Options sollte man in eine Helper-Klasse auslagern - siehe Vortrag CK23 - bzw.
 7 * per options_callback (https://docs.contao.org/dev/reference/widgets/select/) holen.
 8 */
 9
10use Contao\System;
11
12// POI-Liste.
13$options = [];
14
15// Name der MetaModel Tabelle.
16$modelName = 'mm_poi';
17// ID des Filters "BE POI Einzelansicht: Veröffentlicht".
18$filterId = 12;
19
20// Item ermitteln.
21$container        = System::getContainer();
22$factory          = $container->get('metamodels.factory');
23$model            = $factory->getMetaModel($modelName);
24$filter           = $model->getEmptyFilter();
25$filterFactory    = $container->get('metamodels.filter_setting_factory');
26$filterCollection = $filterFactory->createCollection($filterId);
27$items = $model->findByFilter($filter);
28
29if ($items->getCount()) {
30    foreach ($items as $item) {
31        $options[$item->get('id')] = \sprintf('%s - %s', $item->get('name'), $item->get('city'));
32    }
33}
34
35return [
36    'label'           => ['POI Einzelanzeige', 'POI Einzelanzeige'],
37    'types'           => ['content'],
38    'fields'          => [
39        'poi' => [
40            'label'     => ['POI-Auswahl', 'Wählen Sie ein POI aus, welches angezeigt werden soll.'],
41            'inputType' => 'select',
42            'options'   => $options,
43            'eval'      => [
44                'chosen'             => true,
45                'mandatory'          => true,
46                'includeBlankOption' => true,
47                'tl_class'           => 'w50',
48            ],
49        ],
50    ],
51];

Für die Filterung nach der ausgwählten POI-Id kann man eine Filterregel „Eigenes SQL“ anlegen und dort über den übergebenen Parameter aus $filterUrl entsprechend filtern.

1-- Filterregel in Filter 11
2SELECT id FROM {{table}}
3WHERE id = {{param::filter?name=poi}}

Weiterhin könnte man z. B. in dem SQL oder in einer weiteren Filterregel nach dem Veröffentlichungsstatus filtern.

 1<?php
 2// rsce_mm_poi_single.html5
 3
 4/**
 5 * Ausgabe eines POI - Auswahl mit RST-CE.
 6 *
 7 * Hinweis: Die Ermittlung der Items sollte man in eine Helper-Klasse auslagern - siehe Vortrag CK23.
 8 */
 9
10// Check POI-Id.
11if (!$this->poi) {
12    return;
13}
14
15// Name der MetaModel Tabelle.
16$modelName = 'mm_poi';
17// ID des Filters "FE POI Einzelansicht: POI-Auswahl + Veröffentlicht".
18$filterId = 11;
19// Filterwert POI-Id.
20$filterUrl = ['poi' => (int) $this->poi];
21// ID der Render-Einstellungen "FE Detailansicht - POI Einzelansicht ".
22$renderId = 20;
23
24// Item ermitteln.
25$factory          = $this->getContainer()->get('metamodels.factory');
26$model            = $factory->getMetaModel($modelName);
27$filter           = $model->getEmptyFilter();
28$filterFactory    = $this->getContainer()->get('metamodels.filter_setting_factory');
29$filterCollection = $filterFactory->createCollection($filterId);
30$filterCollection->addRules($filter, $filterUrl);
31$items = $model->findByFilter($filter);
32
33// Item rendern.
34$renderFactory = $this->getContainer()->get('metamodels.render_setting_factory');
35$arrItems      = $items->parseAll('html5', $renderFactory->createCollection($model, $renderId));
36?>
37<?php if (count($arrItems)): ?>
38    <div class="layout_full">
39        <?php foreach ($arrItems as $arrItem): ?>
40            <div class="poi_item">
41                <h2><?= $arrItem['text']['name'] ?></h2>
42                <p><?= $arrItem['text']['city'] ?></p>
43                <?= $arrItem['html5']['image'] ?>
44                <?php if($arrItem['actions']['jumpTo']['href']): ?>
45                    <p><a href="<?= $arrItem['actions']['jumpTo']['href'] ?>" title="Details">Details</a></p>
46                <?php endif; ?>
47            </div>
48        <?php endforeach; ?>
49    </div>
50<?php else : ?>
51    <p class="info">Kein POI ausgewählt!</p>
52<?php endif; ?>

Auswahl und Anzeige mit eigenem Content-Element

… folgt je nach Finanzierung des Artikels/Handbuchs…