Joomla 4 Cassiopeia - Individuelles Layout, Trennung von Inhalt und Design - wie macht man es richtig?
Individuelles Layout, Trennung von Inhalt und Design - wie macht man es richtig?
Die Überschrift dieses Beitrags war eine Frage im deutschen Joomla Forum1.
Abgesehen davon, dass es meiner Meinung nach kein Richtig und kein Falsch gibt, hängt die Antwort von dem Ziel ab, das man mit seiner Website verfolgen und welche Voraussetzungen man mitbringt.
Generell gilt: Websites, die ihre Besucher begeistern, hinterlassen einen bleibenden Eindruck. Das ist das Ziel einer jeden Website. Dabei kommt es in meinen Augen nicht nur auf das Design an, sondern auch auf die geschickte Umsetzung, wenn man ein leistungsfähiges Content Management System (CMS) wie Joomla verwendet. Den ein schickes Design, in dem die Inhalte nicht gepflegt werden, begeistert niemanden lange.
In diesem Artikel werfen wir einen genaueren Blick darauf, wie Joomla selbst uns hilft, die beste Praxis der Trennung von Inhalt und Design
umzusetzen und dabei den Content nicht aus dem Auge zu verlieren. Denn letzterer ist das A und O einer jeden Website.
Warum ist die Trennung von Inhalt und Design wichtig? Durch die Trennung von Inhalt und Design können wir Änderungen am Design vornehmen, ohne den eigentlichen Inhalt zu beeinflussen. Auf diese Weise wird die Aktualisierung des visuellen Erscheinungsbildes der Website einfacher, ohne dass umfangreiche inhaltliche Anpassungen erforderlich sind. Darüber hinaus ermöglicht uns dieser Ansatz, dass verschiedene Teams gleichzeitig an der Website arbeiten können - Webdesigner können sich auf das Erscheinungsbild konzentrieren, während Redakteure und Autoren Inhalte erstellen und aktualisieren, ohne die Website offline zu nehmen oder sich komplexen technischen Herausforderungen stellen zu müssen.
Joomla bietet eine Vielzahl von Funktionen, um Inhalt und Design auf benutzerfreundliche und individuelle Weise zu trennen. Dieser Artikel beschreibt,
- wie Joomla uns unterstützt,
- welche Best Practices zu beachten sind und
- wie wir das Beste aus dem CMS herausholen können, indem wir es klug einsetzen.
Dieser Beitrag beinhaltet nur einen kleiner Ausschnitt von dem, was Joomla an Flexibilität liefert. Ein Weg von den vielen, die nach Rom führen.
Webdesign versus Grafikdesign
Bei der Planung einer neuen Website passiert es mir immer wieder, dass ich Layouts als Skizze sehe, ohne dass der Content dazu beschrieben wird. Meiner Meinung nach ist dies bei der Planung mit einem Content Management System nur die halbe Information. In einer Skizze für ein CMS ist es wichtig zu wissen, welcher Inhalt an einer Layout-Position angezeigt werden soll. Wie der Name sagt, ist dies der große Vorteil eines Content Management Systems. Es managed den Inhalt oder anders ausgedrückt: Es passt den Inhalt dynamisch an ein Layout an.
Um die Funktionen eines CMS clever zu nutzen, ist es aus diesem Grund meiner Meinung nach wichtig, ob an einer Layout-Positon ein Inhalt ausgegeben werden soll,
- der an mehreren Stellen der Website ausgegeben wird,
- er in einer Beziehung zu anderen Inhalten steht oder
- es sich um einen Inhalt handelt, der nur zu dem gerade angezeigten Inhalt passt.
Ein konkretes Beispiel ist das Layout das in der Frage im Forum als Skizze gezeigt wurde.
Als erstes habe ich mich gefragt, ob auf den verschieden Unterseiten die gleichen allgemeinen Inhalte dargestellt werden sollen. In diesem Fall würde ich ganz anders an den Joomla Entwurf herangehen, als wenn es sich um spezifische und zum Inhalt der Unterseite gehörende Inhalte handelt.
Beim Betrachten der Skizze für die Anzeige einer Leistung fragte ich mich, ob alle Inhalte tatsächlich für jede Leistung unterschiedlich sind oder ob es nicht teilweise Informationen sind, die auf jede Leistung zutreffen. Dann verwende ich unterschiedliche Werkzeuge. Falls der Inhalt spezifisch ist nutze ich ein Custom Field. Wenn etwas für jede Leistung gleich ist, ist ein Modul in der Regel meine Wahl.
Zuletzt fiel mir auf, dass das die Website unterschiedlich endet. Gewollt ist sicherlich, dass eine einheitliche Fußzeile erscheint. Die Skizzen zeigen lediglich den relevanten Inhalt. Ich möchte es nur nicht unerwähnt lassen, dass ich der Meinung bin, dass bestimmte Bereiche einer Website gleich aussehen sollten, damit einem Besucher die Orientierung leicht fällt und er erkennt, dass er die Website nicht verlassen hat. Ein einheitlicher Footer und ein ähnlicher Header gehören für mich zu diesen Bereichen, neben der zusammenpassenden Farbgestaltung und Schriftwahl.
Dass eine Website nicht statisch wie ein Flyer auf Papier ausgegeben wird und deshalb auf unterschiedlichen Displaybreiten idealerwiese anders strukturiert dargestellt wird ist meiner Meinung heutzutage bei jedem angekommen, der offen für Neues ist.
Exkurs: Joomla 4 bietet fünf Arten von Erweiterungen
Verschaffen wir uns kurz einen Überblick über die Hauptbestandteile einer Joomla-Website:
- Komponenten:
Eine Komponente füllt den Hauptinhalt der Site. In der Regel nutzt diese Daten, die in der Datenbank gespeichert werden.
Der Hauptinhalt der Unterseite
Übersicht der Leistungen
ist beispielsweise dieAnsicht der Kategorie
, in der alle Leistungen gespeichert sind. Die Detailansicht zeigt dann alle Informationen zu der entsprechenden Leistung an. - Module: Ein Modul ist ein Add-On zur Site, das die Funktionalität erweitert. Es nimmt einen sekundären Teil der Webseite ein und wird an verschiedenen Positionen angezeigt. Auf welchen aktiven Menüelementen es ausgegeben wird ist wählbar. Module sind leichte und flexible Erweiterungen. Man verwendet sie für kleine Teile der Seite, die weniger komplex sind und über verschiedene Komponenten hinweg angezeigt werden. Ein Beispiel sind Öffnungszeiten oder Ansprechpartner, die man vielleicht auf jeder Unterseite in einer Seitenleiste anzeigen möchte. Sie gehören nicht direkt zum Inhalt, ergänzen diesen aber in der Regel sinnvoll.
- Plugins:
Ein Plugin bearbeitet die Ausgabe, die vom System generiert wurde. Es wird normalerweise nicht als separater Teil der Site aufgerufen. Es nimmt Daten aus anderen Quellen und manipuliert diese vor der Ausgabe. Ein Plugin arbeitet im Hintergrund.
Custom Fields sind beispielsweise Plugins, die den Hauptinhalt ergänzen. Ist das Plugin zum Custom Field aktiviert, prüft es beim Aufruf der Unterseite,
- was es an dieser Stelle genau an Programmcode aufrufen soll und
- ob etwas Spezielles für diese Unterseite in der Datenbank gespeichert ist. Mit Custom Fields ist es möglich Inhalte vom
- einfachen Text bis hin zur
- digitalen Karte mit Markern, Geocoding und Routing Funktionen zu einem Hauptinhalt individuell angepasst hinzuzufügen.
- Sprachen: Die grundlegendsten Erweiterungen sind Sprachen. Im Wesentlichen bestehen die Sprachpaketdateien aus Schlüssel/Wert-Paaren, die die Übersetzung statischer Textzeichenfolgen im Joomla Quellcode ermöglichen.
- Templates: Ein Template bestimmt das Design deiner Joomla Website.
Content mit Kategorien und Schlagworten strukturieren
Bootstrap 5 bietet ein
statisches
und einfluid
Layout. In den Beispielen nutze ich dasfluid
, welches die volle Bildschirmbreite nutzt. Deshalb habe ich diese Option in den Option des Cassiopeia Templates eingestellt.
Die Übersicht der Leistungen ist ein schönes Beispiel, wie man mit einem Content Management System wie Joomla Inhalte strukturiert. Für die Übersicht der Leistungen habe ich als erstes eine Kategorie mit dem Namen Leistungen
angelegt.
Dann habe ich 6 Artikel erstellt, die die Leistungen beschreiben - naja, ich habe Lorom ipsum
und die Batch-Funktion in Joomla zu Hilfe genommen.
Als nächstes habe ich einen Menüpunkt erstellt, der die Kategorie Leistungen
anzeigt
und das Layout festgelegt
Im Joomla Magazin gibt es einen Artikel, der die Optionen erklärt.
Mit dem optionalen zusätzlichen CSS, welches den Rahmen anzeigt,
.com-content-category-blog__item {
border:solid 2px;
}
ist der Entwurf für die Übersicht der Leistungen erstellt.
Das Schöne an einem dynamischen Content Management System wie Joomla ist, dass die Leitungen nicht auf 6 beschränkt sind, wie in einem Flyer auf Papier. Im gleichen Layout werden weitere Inhalte, die unter der Kategorie Leistungen veröffentlicht werden, angefügt.
Custom Field = Die zum Inhalt gehörenden Informationen darzustellen
Bei den Inhalten, die in der Detailansicht zur Leistung angezeigt werden, bin ich davon ausgegangen, dass diese spezifisch zum Inhalt gehören.
Ich habe Custom Fields mit Gruppen kombiniert und eine Menge davon erstellt. Zunächst habe ich fünf Gruppen erstellt, damit die Eingabe bei der Erstellung eines Beitrags später übersichtlich ist:
- Erste Reihe - zwei Elemente
- Zweite Reihe - volle Breite
- Dritte Reihe - drei Elemente
- Vierte Reihe - volle Breite
- Fünfte Reihe - Ein Beispiel für ein Subform
Bei der Eingabe im Beitrag erscheinen die Custom Field später übersichtlich pro Gruppe in einem Tabulator.
Optional: Weil diese Custom Fields nur für die Kategorie Leistungen wichtig sind, habe ich in den Gruppen zusätzlich die Kategorie eingeschränkt.
Angelegt habe ich die Custom Fields
- oben1 (Erste Reihe - zwei Elemente)
- oben2 (Erste Reihe - zwei Elemente)
- oben (obenvollebreite)
- obenvollebreite (Zweite Reihe - volle Breite)
- unten1 (Dritte Reihe - drei Elemente)
- unten2 (Dritte Reihe - drei Elemente)
- unten3 (Dritte Reihe - drei Elemente)
- untenvollebreite (Vierte Reihe - volle Breite)
- eins
- zwei
- drei
- vier
- subform (Fünfte Reihe - Ein Beispiel für ein Subform)
Der Einfachheit halber habe ich, abgesehen vom Subform, jeweils den Typ ‘Editor’ gewählt. Joomla bietet bereits viele verschiedene Typen, die je nach Inhalt verwendet werden sollten.
Meiner Meinung nach ist das Subform am Interessantesten für die Arbeit mit einem Content Managment System. Es verdeutlicht die Flexibilität. Das Custom Field vom Typ Subform
, welches ich auch subform
genannt habe, verwendet vier andere Custom Fields.
Ich habe diese vier anderen Custom Fields auf die Verwendung in einem Subform per Option beschränkt. Das ist aber nicht zwingend.
Im Beispiel habe ich die Anzeige für jedes Custom Field auf Do not automatic display
gesetzt, weil ich die Anzeige im Override selbst bestimmen möchten.
Dann habe ich ein Override für die Anzeige der Leistungen erstellt.
Der am Ende dieses Abschnitts gezeigte Codeschnipsel zeigt den Code im Ganzen. Dabei ist der letzte Teil für unser Beispiel relevant, welches die Ausgabe der Custom Fields zeigt. Der erste Teil ist eine 1:1 Kopie des Standardtemplates, in meinem Fall von /templates/cassiopeia/html/com_content/article/default.php
.
Zu Beginn speichere ich die Werte der Custom Fields mithilfe von
$fieldsData = [];
if (!empty($this->item->jcfields)) {
$fieldsData['com_fields'] = [];
foreach ($this->item->jcfields as $field) {
$fieldsData[$field->id] = $field->rawvalue;
}
}
Anstelle von
$field->id
kann man auch$field->name
verwenden, wenn man lieber mit Namen als Zahlen arbeitet.
Die Ausgabe am Ende ist für jemanden der Bootstrap 5 kennt selbsterklärend. Nur das Subfield ist in meinen Augen etwas Besonderes. Deshalb schauen wir uns dieses vorher einmal genauer an. Der nachfolgende Codeschnipsel zeigt, dass man eine Zeile beliebig oft für eine Leistung wiederholen kann. Eine Schleife fragt alle Elemente im Custom Field ab. Wenn man lediglich 4 Zeilen sehen möchte, muss man dies begrenzen. Wer es dynamisch haben möchte, mag meine Implememtierung übernehmen.
Randbemerkung: Wer alle Inhalte an ein starres Layout anpassen möchte, sollte sich überlegen, ob ein Content Management System das passende Werkzeug ist. Das gleiche gilt in meinen Augen, wenn der Inhalt der Website - der Content - sich nicht oft ändert oder von einem Webentwickler bearbeitet wird. Für diese Anwendungsfälle gibt es meiner Meinung nach bessere Tools. An manchen Stellen hat ein starres Layout aber natürlich auch in einem CMS eine Berechtigung.
<?php foreach (json_decode($fieldsData[13]) as $row): ?>
<div class="container-fluid com-content-article item-page">
<div class="row">
<div class="col-1 myfieldscol">
<?php echo $row->field9; ?>
</div>
<div class="col-5 myfieldscol">
<?php echo $row->field10; ?>
</div>
<div class="col-1 myfieldscol">
<?php echo $row->field11; ?>
</div>
<div class="col-5 myfieldscol">
<?php echo $row->field12; ?>
</div>
</div>
</div>
<?php endforeach; ?>
Hier nun der vollständige Code, der auf dem Standardlayout in Joomla aufbaut.
<?php
/**
* @package Joomla.Site
* @subpackage com_content
*
* @copyright (C) 2006 Open Source Matters, Inc. <https://www.joomla.org>
* @license GNU General Public License version 2 or later; see LICENSE.txt
*/
defined('_JEXEC') or die;
use Joomla\CMS\Factory;
use Joomla\CMS\HTML\HTMLHelper;
use Joomla\CMS\Language\Associations;
use Joomla\CMS\Language\Text;
use Joomla\CMS\Layout\FileLayout;
use Joomla\CMS\Layout\LayoutHelper;
use Joomla\CMS\Router\Route;
use Joomla\CMS\Uri\Uri;
use Joomla\Component\Content\Administrator\Extension\ContentComponent;
use Joomla\Component\Content\Site\Helper\RouteHelper;
// Create shortcuts to some parameters.
$params = $this->item->params;
$canEdit = $params->get('access-edit');
$user = Factory::getUser();
$info = $params->get('info_block_position', 0);
$htag = $this->params->get('show_page_heading') ? 'h2' : 'h1';
// Check if associations are implemented. If they are, define the parameter.
$assocParam = (Associations::isEnabled() && $params->get('show_associations'));
$currentDate = Factory::getDate()->format('Y-m-d H:i:s');
$isNotPublishedYet = $this->item->publish_up > $currentDate;
$isExpired = !is_null($this->item->publish_down) && $this->item->publish_down < $currentDate;
$fieldsData = [];
if (!empty($this->item->jcfields)) {
$fieldsData['com_fields'] = [];
foreach ($this->item->jcfields as $field) {
$fieldsData[$field->id] = $field->rawvalue;
}
}
?>
<div class="com-content-article item-page<?php echo $this->pageclass_sfx; ?>" itemscope itemtype="https://schema.org/Article">
<meta itemprop="inLanguage" content="<?php echo ($this->item->language === '*') ? Factory::getApplication()->get('language') : $this->item->language; ?>">
<?php if ($this->params->get('show_page_heading')) : ?>
<div class="page-header">
<h1> <?php echo $this->escape($this->params->get('page_heading')); ?> </h1>
</div>
<?php endif;
if (!empty($this->item->pagination) && !$this->item->paginationposition && $this->item->paginationrelative) {
echo $this->item->pagination;
}
?>
<?php $useDefList = $params->get('show_modify_date') || $params->get('show_publish_date') || $params->get('show_create_date')
|| $params->get('show_hits') || $params->get('show_category') || $params->get('show_parent_category') || $params->get('show_author') || $assocParam; ?>
<?php if ($params->get('show_title')) : ?>
<div class="page-header">
<<?php echo $htag; ?> itemprop="headline">
<?php echo $this->escape($this->item->title); ?>
</<?php echo $htag; ?>>
<?php if ($this->item->state == ContentComponent::CONDITION_UNPUBLISHED) : ?>
<span class="badge bg-warning text-light"><?php echo Text::_('JUNPUBLISHED'); ?></span>
<?php endif; ?>
<?php if ($isNotPublishedYet) : ?>
<span class="badge bg-warning text-light"><?php echo Text::_('JNOTPUBLISHEDYET'); ?></span>
<?php endif; ?>
<?php if ($isExpired) : ?>
<span class="badge bg-warning text-light"><?php echo Text::_('JEXPIRED'); ?></span>
<?php endif; ?>
</div>
<?php endif; ?>
<?php if ($canEdit) : ?>
<?php echo LayoutHelper::render('joomla.content.icons', ['params' => $params, 'item' => $this->item]); ?>
<?php endif; ?>
<?php // Content is generated by content plugin event "onContentAfterTitle" ?>
<?php echo $this->item->event->afterDisplayTitle; ?>
<?php if ($useDefList && ($info == 0 || $info == 2)) : ?>
<?php echo LayoutHelper::render('joomla.content.info_block', ['item' => $this->item, 'params' => $params, 'position' => 'above']); ?>
<?php endif; ?>
<?php if ($info == 0 && $params->get('show_tags', 1) && !empty($this->item->tags->itemTags)) : ?>
<?php $this->item->tagLayout = new FileLayout('joomla.content.tags'); ?>
<?php echo $this->item->tagLayout->render($this->item->tags->itemTags); ?>
<?php endif; ?>
<?php // Content is generated by content plugin event "onContentBeforeDisplay" ?>
<?php echo $this->item->event->beforeDisplayContent; ?>
<?php if ((int) $params->get('urls_position', 0) === 0) : ?>
<?php echo $this->loadTemplate('links'); ?>
<?php endif; ?>
<?php if ($params->get('access-view')) : ?>
<?php echo LayoutHelper::render('joomla.content.full_image', $this->item); ?>
<?php
if (!empty($this->item->pagination) && !$this->item->paginationposition && !$this->item->paginationrelative) :
echo $this->item->pagination;
endif;
?>
<?php if (isset($this->item->toc)) :
echo $this->item->toc;
endif; ?>
<div itemprop="articleBody" class="com-content-article__body">
<?php echo $this->item->text; ?>
</div>
<?php if ($info == 1 || $info == 2) : ?>
<?php if ($useDefList) : ?>
<?php echo LayoutHelper::render('joomla.content.info_block', ['item' => $this->item, 'params' => $params, 'position' => 'below']); ?>
<?php endif; ?>
<?php if ($params->get('show_tags', 1) && !empty($this->item->tags->itemTags)) : ?>
<?php $this->item->tagLayout = new FileLayout('joomla.content.tags'); ?>
<?php echo $this->item->tagLayout->render($this->item->tags->itemTags); ?>
<?php endif; ?>
<?php endif; ?>
<?php
if (!empty($this->item->pagination) && $this->item->paginationposition && !$this->item->paginationrelative) :
echo $this->item->pagination;
?>
<?php endif; ?>
<?php if ((int) $params->get('urls_position', 0) === 1) : ?>
<?php echo $this->loadTemplate('links'); ?>
<?php endif; ?>
<?php // Optional teaser intro text for guests ?>
<?php elseif ($params->get('show_noauth') == true && $user->get('guest')) : ?>
<?php echo LayoutHelper::render('joomla.content.intro_image', $this->item); ?>
<?php echo HTMLHelper::_('content.prepare', $this->item->introtext); ?>
<?php // Optional link to let them register to see the whole article. ?>
<?php if ($params->get('show_readmore') && $this->item->fulltext != null) : ?>
<?php $menu = Factory::getApplication()->getMenu(); ?>
<?php $active = $menu->getActive(); ?>
<?php $itemId = $active->id; ?>
<?php $link = new Uri(Route::_('index.php?option=com_users&view=login&Itemid=' . $itemId, false)); ?>
<?php $link->setVar('return', base64_encode(RouteHelper::getArticleRoute($this->item->slug, $this->item->catid, $this->item->language))); ?>
<?php echo LayoutHelper::render('joomla.content.readmore', ['item' => $this->item, 'params' => $params, 'link' => $link]); ?>
<?php endif; ?>
<?php endif; ?>
<?php
if (!empty($this->item->pagination) && $this->item->paginationposition && $this->item->paginationrelative) :
echo $this->item->pagination;
?>
<?php endif; ?>
<?php // Content is generated by content plugin event "onContentAfterDisplay" ?>
<?php echo $this->item->event->afterDisplayContent; ?>
</div>
<div class="container-fluid com-content-article item-page">
<div class="row">
<div class="col myfieldscol">
<?php echo $fieldsData[1]; ?>
</div>
<div class="col myfieldscol">
<?php echo $fieldsData[2]; ?>
</div>
</div>
</div>
<div class="container-fluid com-content-article item-page">
<div class="row">
<div class="col myfieldscol">
<?php echo $fieldsData[4]; ?>
</div>
</div>
</div>
<div class="container-fluid com-content-article item-page">
<div class="row">
<div class="col myfieldscol">
<?php echo $fieldsData[5]; ?>
</div>
<div class="col myfieldscol">
<?php echo $fieldsData[6]; ?>
</div>
<div class="col myfieldscol">
<?php echo $fieldsData[7]; ?>
</div>
</div>
</div>
<div class="container-fluid com-content-article item-page">
<div class="row">
<div class="col myfieldscol">
<?php echo $fieldsData[8]; ?>
</div>
</div>
</div>
<?php foreach (json_decode($fieldsData[13]) as $row): ?>
<div class="container-fluid com-content-article item-page">
<div class="row">
<div class="col-1 myfieldscol">
<?php echo $row->field9; ?>
</div>
<div class="col-5 myfieldscol">
<?php echo $row->field10; ?>
</div>
<div class="col-1 myfieldscol">
<?php echo $row->field11; ?>
</div>
<div class="col-5 myfieldscol">
<?php echo $row->field12; ?>
</div>
</div>
</div>
<?php endforeach; ?>
Die Detailansicht einer Leistung sieht nun wie folgt aus,
wenn man als Layout Leistungen
gewählt hat.
- Ein Bereich über die ganze Breite ganz oben
- Zwei Bereiche in einer Zeile
- Noch einmal ein Bereich über die ganze Breite ganz oben
- Drei Bereiche in einer Zeile
- Noch einmal ein Bereich über die ganze Breite ganz oben
- Sechzehn Bereiche über 4 Zeilen verteilt, wobei die Breite unterschiedlich ist.
Module = Die zu mehreren Inhalten gehörende Informationen darzustellen
Inhalt in Kategorien organisieren
In einem Content Management System geht es in erster Linie um Content. Diesen organisiert man in der Regel in Kategorien. Manchmal nimmt man Tags oder andere Eigenschaften wie Featured zu Hilfe.
Für die Unterseite Über uns
habe ich die Kategorie Über uns
sowie vier Unterkategorien erstellt. In jeder Kategorie habe ich vier Beitrage angelegt. Drei der Beiträge sollen besonders hervorgehoben werden und später auf der Startseite erscheinen. Deshalb habe ich diesen dreien die Eigenschaft Featured
gegeben. Und drei erhalten das Schlagwort drei
.
Damit habe in den oberen Bereich der Site mit dem Menüpunkt des Typs List All Categories in an Article Category Tree
angelegt.
Mit Hilfe des zusätzlichen CSS aus dem nachfolgenden Codeschnipsel in der Datei user.css
, werden die vier Unterkategorien der Hauptkategorie Über uns
nun zweispaltig dargestellt. Die ersten beiden Anforderungen des Layouts Über uns
sind erfüllt, wenn es genau vier Unterkategorien gibt.
.com-content-categories__items {
display:flex;
flex-wrap:wrap;
}
.com-content-categories__item {
max-width:50%;
min-width:50%;
}
Mit Modulen arbeiten
Ich erstelle zwei Module des Typs Articles - Newsflash
. Beide veröffentliche ich auf der Position main-bottom
, wähle die horizontale Anzeige und ordne sie dem Menüpunkt Über uns
zu. Ich arbeite hier nicht mit Overrides. Anpassungen erledige ich ausschließlich mittels CSS.
Module mit 3 Spalten
Im Layout Über uns
fehlt nun noch die Position, die drei gleichgroße Bereiche in einer Zeile anzeigt. Die Inhalte für die drei Bereiche habe ich mit dem Tag drei
bestimmt. Nun erstelle ich ein Modul, welches dies aus dem Content auswählt.
Das horizontale Layout nutzt standardmäßig dass CSS grid-template-columns: repeat(auto-fit,minmax(200px,1fr));
. Der Inhalt wird automatisch über die ganze Zeile angezeigt. Falls der Inhalt zu groß ist, wird automatisch in die nächste Zeile umgebrochen. Jeder Bereich wird mindestens 200px
groß dargestellt. Ich finde dies ist eine ideale Umsetzung für dynamischen Content. Verlassen kann man sich nun aber nicht darauf, dass immer drei Inhalte in einer Zeile sind. Ist das Display schmaler als 600px
oder Inhalt sowieso schon breiter, wird umgebrochen! Alles hat Vorteile und Nachteile.
Im nächsten Beispiel sehen wir uns an, wie wir die vier Inhalte in einer Zeile fix bestimmen. Mit dieser Variante muss für mobile Geräte nachgearbeitet werden, finde ich. Dafür ist die Layoutskizze erfüllt.
Modul mit 4x4 Spalten
Jetzt geht es um den letzten Bereich im Layout Über uns
. Hier werden 16 Inhalte in vier Spalten ausgegeben.
Weil es wichtig ist, dass immer sechzehn Inhalte angzeigt werden, beschränken wir die Anzahl im Modul auf 16.
Um das Modul später individuell mit CSS stylen zu können, fügen wir eine Klasse hinzu. Die Anweisung .sechzehn .mod-articlesnews-horizontal
wirkt sich so lediglich auf dieses Modul aus. .mod-articlesnews-horizontal
ohne .sechszehn
würde alle Module des Typs Module Articles - Newsflash
stylen!
Mit dem nachfolgenden Codeschnippsel erreiche ich, dass immer 4 Beiträge pro Zeile angezeigt werden. Die 16 Beiträge werde so in 4 Zeilen ausgegeben. Auf schmalen Displays ist dies nicht optimal und muss noch angepasst werden.
.sechzehn .mod-articlesnews-horizontal {
grid-template-columns:25% 25% 25% 25%;
grid-gap:0;
}
Modul mit 4x4 Spalten
Im Frontend sieht das Grundgerüst ohne Bilder und Überschrift und mit Lorum ipsum
Texten wie folgt aus.
- Ein Bereich über die ganze Breite ganz oben
- Vier Bereiche über zwei Zeilen verteilt.
- Drei Bereiche in einer Zeile (die responsive reagieren)
- Sechzehn Bereiche über 4 Zeilen verteilt, die bisher fix bleiben.
Startseite
Für die Startseite habe ich einen Menüpunkt vom Typ Features angelegt
und das Bloglayout auf drei Spalten gesetzt. So habe ich die ersten Zeilen des Layouts umgesetzt.
- Ein Bereich über die ganze Breite ganz oben der momentan lediglich die Navigation enthält.
- Drei Bereiche über zwei Zeilen verteilt.
- Das Ergänzen der anderen Bereiche kann analog der vorherigen Beispiele erfolgen.
Natürlich ist das Layout so nicht statisch. Wenn es mehr als drei Beiträge mit der Eigenschaft Featured
gibt, wird das Layout dynamisch um eine Zeile erweitert. In einem Content Management System sieht man dies in der Regel als Vorteil an.
Lesson learned
Das Zusammenbringen von gutem Content und Design ist in einem Content Management System stets ein spannendes Thema.
Der idealen Weg zwischen der Nutzung von Flexibiliät
- um Content dynamisch darzustellen und
- gewollter Starrheit, um Inhalte an ein Design anzupassen, ist oft schwer zu finden.
Vieles hängt in meinen Augen zudem von der Struktur des Inhalts selbst und von den Kenntnissen der Nutzer ab.
Jemand der über gute Programmierkenntnisse verfügt, programmiert unter Umständen vieles selbst, obwohl das CMS ihm den Code dafür schon bietet. Jemand der viel mit Content arbeitet, findet sich bei der Dateneingabe und Strukturierung schnell zurecht, fühlt sich aber hilflos beim Stylen.
Footnotes
-
forum.joomla.de/thread/19000-individuelles-layout-trennung-von-inhalt-und-design-wie-macht-man-es-richtig/?postID=136288#post136288 ↩