Kirby Learnings: Part 5

18.04.2024 08:32 Uhr

Ich evaluiere grad ob ich Kirby für einige bestimmte Websites einsetzen kann. Diese sind vorwiegend wie "Modular Pages" aufgebaut, auf denen verschiedene Content-Sections mit unterschiedlichen Hintergrundfarben untereinander platziert sind. Es gibt Textmodule, Teaser-Cards, Karussells, Formulare usw. Das sieht vereinfacht ungefähr so aus.

Grober Seitenaufbau mit Sections

Ich hab zunächst versucht, das mit einem Layout-Feld umzusetzen. In meinem Fall geht es aber mit Blocks — bzw. vielmehr Custom Blocks — etwas simpler, weil ich das Thema mit den Spalten über Bootstrap realisiere. Ich will es im Panel möglichst simpel halten, so dass auch "Redakteure" oder Kunden ohne Programmierkenntnisse schnell Seiten bauen und anpassen können, mit möglichst wenig Klicks. Es geht am Ende um bessere Workflows, Freigabeprozesse und Arbeitsteilung.

Wenn man ein Feld vom Typ "Blocks" im Blueprint hinzufügt, stehen einem diverse vordefinierte Varianten zur Verfügung. Wem das nicht reicht, der kann sich eigene Blocks z. B. mit weiteren Feldern bauen. Bastian hat dafür auch kürzlich ein anschauliches Video erstellt.

Auszug Page Blueprint

Datei blueprints/pages/blocks.yml. Feld segments vom Typ:Blocks.

sections:
  fields:
    type: fields
    fields:

      segments: 
        label: Segmente
        type: blocks

Im Pagetemplate

templates/blocks.php
Loop durch die einzelnen Blöcke in "segments".

<?php foreach ($page->segments()->toBlocks() as $block): ?>
    <div id="<?= $block->id() ?>" class="block block-type-<?= $block->type() ?>">
    <?= $block ?>
    </div>
<?php endforeach ?>

Die Definition der Felder für die einzelnen Blöcke steht sinnvollerweise in jeweiligen Blueprints in blueprints/blocks/ z.B. in 002-hero.yml:

name: "002: Hero"
icon: image
label: "{{ headline }}"
preview: bgcolor ### hierzu unten mehr
fields:
  headline:
    type: text
    width: 2/3
    maxlength: 50
    validate:
      maxLength: 50
      #usw...

Der HTML/PHP-Code für einzelnen Blocks kommt in snippets/blocks/ z.B. in 002-hero.php:

<section id="heroteaser">
<h1><?= $block->headline();?></h1>
<?=$block->text()->kt();?>
</section>

Hier stark vereinfacht.

Damit man eigene Blocks auch nutzen und im Panel auswählen kann, müssen sie registriert werden. Da es hier beim genannten Projekt um mehr als 30 verschiedene Blocks geht, fand ich es am Ende übersichtlicher diese in einem eigenen Projekt-Plugin zu verwalten. Siehe auch weitere Infos in der Reference.

Auszug aus plugins/projectname/index.php:

Kirby::plugin('projectname/sections', [

  'blueprints' => [ 

        'pages/blocks'      => __DIR__ . '/blueprints/pages/blocks.yml',
        //...

        'blocks/002-hero' => __DIR__ . '/blueprints/blocks/002-hero.yml',   
        //...

        'layout/my-fieldsets'   => __DIR__ . '/blueprints/layout/my-fieldsets.yml', // hierzu weiter unten      
        'options/subs'  => __DIR__ . '/blueprints/options/subs.yml',
        'tabs/meta'     => __DIR__ . '/blueprints/tabs/meta.yml',
  ],

  'snippets' => [
      'blocks/002-hero' => __DIR__ . '/snippets/blocks/002-hero.php',   
        //...
  ], 

  'templates' => [
    //... hierzu weiter unten
  ]

]);

Preview der Blocks im Panel

Man kann hier über vue.js viel machen, siehe Beispiel im Video oder hier oder hier. Das war mir aber nach einigen Versuchen zu wild und unübersichtlich. Mir reicht es für die Übersicht und Orientierung, wenn die jeweilige Hintergrundfarbe des Blocks und ein halbwegs passendes Icon neben dem Blocktyp zu sehen sind. Beispiel:

Blockpreviews im Panel

Man kann Blocks im Panel übrigens auch easy verschieben, duplizieren, löschen, verstecken usw.

In index.js des Plugins muss der Previewtyp bgcolor definiert werden:

panel.plugin("projectname/sections", {
  blocks: {

        bgcolor: {
            computed: {
                bgc() {
                    const F = [];
                    F['#ff4000'] = "orange";
                    F['#00c3d7'] = "blue";
                    F['#191e1e'] = "anthracite";
                    F['#eeeeee'] = "lightgray";
                    F['#ffffff'] = "white";
                    return F[this.content.bgcolor];
                },
                sicon() {
                    return this.$props.fieldset.icon || 'text';
                },
                sname() {
                    return this.$props.fieldset.name;
                },
            },
              template: `
                <div :class="'k-block-title k-block-type-box bg-'+bgc" @dblclick="open">
                    <k-icon :type="sicon"/><span :class="'k-block-name'"> {{ sname }} </span>
                </div>
              `
        }

  } 

});

Dann kann man bgcolor in den Blueprints der Custom Blocks nutzen, hier blueprints/blocks/002-hero.yml:

name: "002: Hero"
icon: image
label: "{{ headline }}"
preview: bgcolor ## hier

Die Hintergrundfarbe der Blöcke kommt eigentlich über CSS-Klassen im Frontend. Damit man die Farben aber im Panel über den Field-Type "color" nutzen kann, hab ich dafür in der config-Datei einen Array angelegt, der sich über einen query aufrufen lässt. Bin nicht sicher, ob das vllt einfacher geht, aber es funktioniert.

config.php

'projectname' => [        
     'colorbox' => [ //classes
         "#ffffff" => "white",
         "#191e1e" => "anthracite",
         "#ff4000" => "orange",
         "#00c3d7" => "blue",
         "#eeeeee" => "lightgray",
     ]
]

fields/bgcolors.yml

label: Hintergrundfarbe
type: color
mode: options
width: 1/2
options:
  type: query
  query: kirby.option('projectname.colorbox')

Da ich das in fast allen Blocks brauche, hab ich es in blueprints/fields/bgcolors.yml ausgelagert. Aufruf in den Block-Blueprints:

  bgcolor: fields/bgcolors

Im Template-Snippet für die Blocks dann:

<?php $bgColor='projectname.colorbox.'.$block->bgcolor(); ?>

<div class="<?= option($bgColor) ?> ">

Defaults

Wenn man Seiten mit immer dem gleichen oder ähnlichen Aufbau hat, dessen Inhalte aber variieren, kann man im Blueprint der Page Standards/Defaults für Blöcke und deren Felder angeben. Das erspart echt viel Arbeit.

Einfache Variante ohne Inhalte:

segments:
  label: Segmente
  type: blocks

  ### THIS PART
  default:
    - type: 002-hero
    - type: 003-intro
    - type: 032-profile
  ### /THIS PART

Die Snippets/Blöcke hab ich in unserem Online-Styleguide für die eindeutige Referenzierung durchnummeriert, daher die vorn anstehenden Zahlenreihen.

Und mit vorausgefüllten Werten einiger Felder:

segments:
    label: Segmente
    type: blocks

    default:
      - type: 002-hero   
        content:  
          bgcolor: "#00c3d7"
      - type: 003-intro
        content:
          bgcolor: "#191e1e"
          logo: yes
      - type: 032-profile
        content:
          bgcolor: "#ff4000"

Defaults für structured fields sind auch möglich:

default:
  - type: 004-3cols
    content:
      bgcolor: "#00c3d7"
      headline: "3 cards"
      cards:
        - headline: "left"
        - headline: "center"
        - headline: "right"

Wiederverwenden von Fieldsets

Mehrere Page-Templates greifen auf die gleichen Fieldsets zurück. Diese kann man in einer eigenen Datei speichern und dann über extend in den page-blueprints laden. Bei mir bieten sich auch Fieldset-Gruppen an, aufgrund der Menge an Blocks.

segments: 
  label: Segmente
  type: blocks

  extends: 
    - layout/my-fieldsets

  default:
    ...

Und aufgrund der Menge an Blocks bietet es sich an, diese in Gruppen aufzuteilen:

fieldsets: 
  main:
    type: group
    open: true
    fieldsets:
      - 002-hero
      - 003-intro
      - 009-icon-section
      ...

  more:
    type: group
    open: false
    fieldsets:
      - 049-submenu
      - 034-hubform      
      - 016-modal
     ...
Fieldsetgruppen

Nutzung des gleichen Pagetemplates für unterschiedliche Blueprints

Beschrieben hier: https://getkirby.com/docs/quicktips/different-blueprints-same-template

Datei plugins/projectname/index.php, wo auch die blueprints und snippets für's Projekt registriert wurden.

'templates' => [
        'blocks-empty'  => __DIR__ . '/templates/subs.php',
        'blocks'            => __DIR__ . '/templates/subs.php',
        'referenz-sub'  => __DIR__ . '/templates/subs.php',
        'workshop-sub'  => __DIR__ . '/templates/subs.php',
    ]

Die Blueprints unterscheiden sich z.B. in den Defaults. Unterschiedliche Bereiche der Website wie Referenzen oder Workshop-Seiten sind im Seitenaufbau nicht gleich.

Das Ganze ist recht komplex, wenn man grade erst versucht reinzufinden und zu verstehen. Ich hab mich da nach und nach herangenähert und auch mal nach Hilfe im Forum gefragt. Sonja ist da immer sehr schnell und hilfsbereit. Bei Fehlern ist es häufig falsches Einrücken im Blueprint oder wenn man vergessen hat irgendetwas im Plugin zu registrieren.

Will noch herausfinden, was das Kirby Modules Plugin von Thomas aka Medienbäcker für eventuelle Vorteile hat bzgl. der Custom Blocks.

Als Nächstes will ich mich unbedingt nochmal mit dem Arbeiten bereits bestehender Datenbanken auseinandersetzen.

Weitere Artikel zu Kirby hier im Blog.

— Sascha

Letzte Änderung: 22.04.2024 07:20 Uhr
teilen mit Elk
Sascha
von
Antworten, Likes, Boosts.
« Vorheriger Artikel Nächster Artikel »

© 2024 assbach.de · Private Website von Sascha Aßbach. Umgesetzt mit Kirby 4 · RSS-Feed

Freiberufliches, Design, Webdevelopment bei assbach.com