Hero Image

Grav CMS und die Lightbox Gallery

Mit Hilfe der kostenpflichtigen Lightbox-Gallery kann beim GRAV CMS eine leichte und vielseitige Bilder Galerie erstellt werden.

Eine fortgeschrittenere Verwendung dieses Plugins besteht darin, mehrere lightbox Shortcode-Einträge mit einem gemeinsamen gallery=""-Attribut zu verknüpfen. Das Plugin extrahiert dann diese Beschreibungen aus der Seite und stellt sie neben dem Bild in der Ligthbox zur Verfügung.

*und das für jedes Bild einzeln shortcode

Folgen wir nun der Anleitung wird man schnell erkennen das die Lightbox als Modularpage für eine s.g. One-Page Website installiert werden kann. Das Typhoon-Thema bietet bereits eine modulare Twig-Vorlage, die ein sauberes Rasterlayout für Miniaturansichten bietet. Damit könnte man im Backend sich das coden sparen und die Zuordnung über das Admin Menü durchführen bzw. anpassen.

Lightbox01

Für eine OnePage Website ist das auch okay, aber ich persönlich finde, dass dies zu viele Einträge im Backend sind. Neben der Modul Seite für die Galerie wird auch eine Modul Seite für den Titel bzw. den Hero Bereich benötigt. Dazu kommt dann auch noch die übergeordnete Modularpage. Lightbox02

Meine Absicht war nun diese Lightbox-Gallery Vorlage so umzubauen, dass wir diese im Backend als Standard Page nutzen können. Lightbox03

Here We go... Wir fangen an und bauen uns ein Blueprint dafür:

  1. wir legen unter /user/themes/themenname/blueprints/ eine lightbox.yaml Datei mit folgenden Inhalt an.
title: Gallery
extends@: default

form:
  fields:
    tabs:
      fields:
        content:
          fields:
            header.media_order:
              ordering@: 99

            header.gallery.grid_classes:
              type: text
              default: 'grid-cols-2 md:grid-cols-3 lg:grid-cols-4 gap-y-2 gap-x-2'
              label: THEME_TYPHOON.BLUEPRINTS.GRID_CLASSES
              help: THEME_TYPHOON.BLUEPRINTS.GRID_CLASSES_HELP

            header.gallery.thumb.width:
              type: number
              label: THEME_TYPHOON.BLUEPRINTS.THUMBNAIL_WIDTH
              size: x-small
              append: px
              default: 600

            header.gallery.thumb.height:
              type: number
              label: THEME_TYPHOON.BLUEPRINTS.THUMBNAIL_HEIGHT
              size: x-small
              append: px
              default: 450

            header.gallery.items:
              type: list
              style: vertical
              label: THEME_TYPHOON.BLUEPRINTS.GALLERY_ITEMS

              fields:
                .title:
                  type: text
                  label: THEME_TYPHOON.BLUEPRINTS.TITLE
                .image:
                  type: filepicker
                  preview_images: true
                  label: THEME_TYPHOON.BLUEPRINTS.IMAGE
                .desc:
                  type: textarea
                  rows: 4
                  label: THEME_TYPHOON.BLUEPRINTS.DESCRIPTION
                .video:
                  type: text
                  label: THEME_TYPHOON.BLUEPRINTS.VIDEO
                  help: THEME_TYPHOON.BLUEPRINTS.VIDEO_HELP
  1. als nächstes legen wir unter /user/themes/themenname/templates/ eine lightbox.html.twig Datei mit folgenden Inhalt an.
{% extends 'partials/base.html.twig' %}
{% do lightbox_gallery.addAssets() %}

{% block content %}
{% set styling %}
.lightbox-gallery {
  max-width: 1200px;
  margin: 0;
  padding: 0;
}

.lightbox-gallery .lightbox-gallery__columns {
  display: flex;
  flex-wrap: wrap;
  margin: 0 -10px;
}

.lightbox-gallery .lightbox-gallery__column {
  width: 50%;
  padding: 0 10px;
  margin-bottom: 20px;
}

.lightbox-gallery img {
  display: block;
  border-radius: 10px;
  transition: all .2s ease-in-out;
}

.lightbox-gallery img:hover {
  filter: brightness(60%);
  transform: scale(1.05);
}

@media only screen and (min-width: 600px) {
  .lightbox-gallery .lightbox-gallery__column {
    width: calc(100% / 3);
  }
}

@media only screen and (min-width: 1000px) {
  .lightbox-gallery .lightbox-gallery__column {
    width: 25%;
  }
}

.lightbox-gallery .hidden {
  display: none;
}
{% endset %}

{% do assets.addInlineCss(styling) %}

{% set data = page.header.gallery %}
{% set thumb_width = data.thumb.width|default(600) %}
{% set thumb_height = data.thumb.height|default(450) %}

<div class="lightbox-gallery">
    <div class="lightbox-gallery__columns">
        {% set gallery = md5(page.url) %}
        {% for item in data.items %}
        <div class="lightbox-gallery__column">
            {% set item_image = page.media[item.image] %}
            {% if item.title %}
            {% set title = item.title %}
            {% endif %}
            {% if item.desc %}
            {% set desc = ".desc-" ~ md5(item.desc) %}
            {% endif %}
            {% set content = item_image.cropZoom(thumb_width,thumb_height).html(title, title) %}
            {% set image =  item_image.url %}
            {% include "partials/lightbox.html.twig" %}
        </div>
        {% endfor %}
    </div>
    <div class="hidden">
        {% for item in data.items %}
        {% if item.desc %}
            <div class="glightbox-desc desc-{{ md5(item.desc) }}">
            <p>{{ item.desc|markdown(false) }}</p>
            </div>
        {% endif %}
        {% endfor %}
    </div>
</div>
{% endblock %}

Achtet darauf das unbedingt folgende Zeile in der Datei enthalten sind.

{% extends 'partials/base.html.twig' %}
{% block content %}
{% do lightbox_gallery.addAssets() %}
{% do assets.addInlineCss(styling) %}
  1. unter den Pfad /user/themes/themenname/templates/partials/ wird nun eine weitere lightbox.html.twig mit folgenden Code angelegt.
{% if video %}
  {% set type = 'video' %}
  {% set target = page.media[video].url ?? video %}
{% else %}
  {% set type = 'image' %}
  {% set target = page.media[image].url ?? image %}
{% endif %}
<a href="{{ target }}" class="glightbox {{ class }}"
   {% if gallery %}data-gallery="{{ gallery }}"{% endif %}
   {% if title %}data-title="{{ title }}"{% endif %}
   {% if desc %}data-description="{{ desc }}"{% endif %}
   {% if descPosition %}data-desc-position="{{ descPosition }}"{% endif %}
   {% if type %}data-type="{{ type }}"{% endif %}
   {% if effect %}data-effect="{{ effect }}"{% endif %}
   {% if width %}data-width="{{ width }}"{% endif %}
   {% if height %}data-height="{{ height }}"{% endif %}
   {% if zoomable %}data-zoomable="{{ zoomable }}"{% endif %}
   {% if draggable %}data-draggable="{{ draggable }}"{% endif %}
   >
    {{ content|raw }}
</a>

Sind diese Dateien erstellt und der Cache im Backend zurückgesetzt bzw. geleert. Dann könnt ihr beim Anlegen einer neuen Standard Seite die Lightbox auswählen.

Lightbox04 Lightbox05