Budujemy cząstkę Gantry 5 - budowa cząstki i plik konfiguracyjny zaplecza yaml

W naszym samouczku "Jak stworzyć stronę internetową za darmo" korzystamy z CMS  Joomla oraz posługujemy się frameworkiem Gantry 5. Jednym z głównych celów przyświecających opracowaniu Gantry 5 było umożliwienie osobom niebędącym programistami wykonywania większej ilości zadań bez konieczności otwierania edytora kodu lub bezpośredniej modyfikacji plików.

Gantry 5 jest naprawdę łatwy w użyciu. Posiada funkcję przeciągnij i upuść, która umożliwia drastyczną zmianę układu witryny w ciągu kilku sekund, bez konieczności dotykania klawiatury. 

Czym są kontury/zarysy, cząsteczki, atomy?

Krótki przegląd powszechnie używanych terminów związanych z Gantry 5.

TerminOpis
Zarys Konfigurowalny styl używany w jednym lub kilku obszarach witryny. Służy jako kontener, w którym ustawiany jest styl, ustawienia i układ strony. Jest to odpowiednik szablonu. W ten sposób Gantry układa różne elementy na stronie.
Cząstka Typowo mały blok danych używany na froncie. Działa bardzo podobnie do widżetu/modułu, ale można go łatwo skonfigurować w Gantry 5 Administrator.
Atom Typ cząsteczki zawierający nierenderowane dane, taki jak niestandardowe skrypty (JS, CSS itp.) lub skrypty analityczne do śledzenia ruchu.
Jądro To jest własny front-end framework Gantry 5. Jest to bardzo prosty i lekki framework CSS/SCSS-only.

Zatem do prezentacji treści Gantry 5 używa cząstek/particles. 

Podstawowa budowa cząstki i sposób jej instalacji w szablonie.

W naszym przykładzie mamy już zainstalowany atom UIKit od Joomlead więc będziemy bazować na UIKit do budowy naszej cząstki. Domyślnie Joomla posiada wbudowany framework Bootstrap ale ja osobiście wolę UIKit. Jeżeli wolisz korzystaj z bootstrapa. Dodatkowo Gantry 5 posiada własny framework (Nucleus) ale jest on dość minimalistyczny. Więc nic nie stoi na przeszkodzie abyś posługująć się tym poradnikiem utworzył cząstkę uniwersalną, która działa bez dodatkowych zależności.

Zaczynamy od utworzenia dwóch plików dla naszej cząstki. Plik nazwa_cząstki.yaml oraz nazwa_cząstki.html.twig Pierwszy odpowiada za kontrolki na zapleczu, czyli miejsce gdzie wpiszemy/ustawimy nasze treści, które następnie zostaną pobrane i wyświetlone na froncie przez plik nazwa_cząstki.html.twig

YAML to przyjazny dla człowieka język serializacji danych dla wszystkich języków programowania

Twig to nowoczesny silnik szablonów dla PHP

yaml

name: Example
description: Displays a Title, Image, and Text on the front end.
type: particle

form:
  fields:
    enabled:
      type: input.checkbox
      label: Enabled
      description: Globally enable to the particles.
      default: true

    title:
      type: input.text
      label: Title
      description: Customize the section title text.

    image:
      type: input.imagepicker
      label: Image
      description: Select the main image.

    description:
      type: textarea.textarea
      label: Text / HTML
      description: Create or modify your description.

    css.class:
      type: input.text
      label: Class
      description: CSS class name for the particle.

Ten YAML składa się z dwóch głównych części. Po pierwsze, nagłówek pliku, który ustawia Nazwę , Opis i Typ . Nazwa to to, co pojawia się w administratorze jako tytuł Particle w panelach Particle Defaults i Layout Manager . Type , czyli Particle, informuje Gantry, że ten plik YAML jest używany do tworzenia Particle.

Druga sekcja ustawia formularze/pola, które pojawiają się w administratorze, a także ustawienia domyślne. Te pola pojawiają się w administratorze i są dostępne dla administratorów witryny. Dają im możliwość wykonywania takich czynności, jak ustawianie niestandardowego tekstu, tytułów i ustawień przełączania.

Pierwszy blok pola (enabled) jest wymagane. Informuje Gantry o umieszczeniu przełącznika na zapleczu, który umożliwia włączanie/wyłączanie Particle.

Reszta pól tutaj, title, image,description, css.class udostępniają pola, dzięki którym admini witryn mogą konfigurować Particle bez konieczności ręcznej edycji plików.

Następny plik, który musisz utworzyć, będzie znajdował się w tym samym katalogu co plik YAML. Zaleca się nadanie mu takiej samej nazwy, jaką nadałeś plikowi YAML, ale w formacie name.html.twig. Zakończenie nazwy pliku na html.twig informuje Gantry, że jest to plik Twig, który jest zasadniczo szablonem pliku. Kontroluje sposób renderowania Particles, określa kod HTML i określa sposób używania zmiennych zdefiniowanych w YAML.

twig

{% extends '@nucleus/partials/particle.html.twig' %}

{% block particle %}
<div class="example_particle {{ particle.css.class }}">
    <div align="center">
        <img src="{{ url(particle.image) }}" alt="image">
        <h2>{{ particle.title }}</h2>
        <p>{{ particle.description }}</p>
    </div>
</div>
{% endblock %}

To jest oczywiście podstawowa struktura cząstki, którą możemy zobaczyć w dokumentacji Gantry 5. Na jej podstawie zbudujemy Hero Banner, podobny do tego który jest widoczny na mojej stronie głównej.

Do edycji potrzebujemy zatem zdjęcie, nagłówek, krótki opis oraz dwa przyciski CTA. Naszą cząstkę będziemy tworzyć bezpośrednio w szablonie Gantry więc jeżeli nie masz jeszcze zainstalowanego szablonu Gantry 5 musisz to wcześniej zrobić. Oraz tak jak wspomniałem na początku musisz mieć atom UIKit od Joomlead. Następnie utwórz dwa wyżej wymienione pliki (nazwa dowolna) np. herobanner.yaml oraz herobanner.html.twig w lokalizacji templates/g5_helium/custom/particles

Oto nasza struktura plików szablonu po instalacji UIKit oraz naszej cząstki

Zawartość pliku herobanner.yaml


name: Hero Banner
description: Wyświetlaj baner z nagłowkiem oraz dwoma CTA.
type: particle
icon: fa-images
configuration:
  caching:
    type: static
form:
  overrideable: false
  fields:
    enabled:
      type: input.checkbox
      label: Enabled
      description: Globally enable to the particles.
      default: true

    image:
      type: input.imagepicker
      label: Obraz
      description: Wybierz obraz.

    imageAlt:
      type: input.text
      label: Tekst alternatywny dla obrazka
      description: Dodaj text alternatywny dla obrazka.

    title:
      type: input.text
      label: Tytuł
      description: Wpisz tytuł/nagłowek.

    description:
      type: textarea.textarea
      label: Krótki opis
      description: Wpisz krótki opis pod nagłówkiem.

    separatorL:
      type: separator.note
      class: alert alert-info
      content: "Przycisk po lewej stronie"

    buttontextL:
      type: input.text
      label: Tekst na przycisku
      description: Etykieta przycisku.
      placeholder: Pokaż więcej

    buttonlinkL:
      type: input.text
      label: Link
      description: adres odnośnika.
      placeholder: http://

    button_link_titleL:
      type: input.text
      label: Tytuł linku
      description: Tytuł linku to atrybut, który dostarcza więcej informacji o linku.

    button_aria_labelL:
      type: input.text
      label: Link aria label
      description: Dodanie aria-label do linków jest ważne dla zapewnienia dostępności
    
    buttontargetL:
      type: select.selectize
      label: Target
      description: Otwórz odnośnik w tym samym oknie lub w nowej karcie.
      placeholder: "Wybierz..."
      default: _self
      options:
        _self: W tej samej karcie
        _blank: Nowe okno

    separatorR:
      type: separator.note
      class: alert alert-info
      content: "Przycisk po prawej stronie"

    buttontextR:
      type: input.text
      label: Tekst na przycisku
      description: Etykieta przycisku.
      placeholder: Pokaż więcej
    
    buttonlinkR:
      type: input.text
      label: Link
      description: adres odnośnika.
      placeholder: http://
    
    button_link_titleR:
      type: input.text
      label: Tytuł linku
      description: Tytuł linku to atrybut, który dostarcza więcej informacji.
    
    button_aria_labelR:
      type: input.text
      label: Link aria label
      description: Dodanie aria-label do linków jest ważne dla zapewnienia dostępności
    
    buttontargetR:
      type: select.selectize
      label: Target
      description: Otwórz odnośnik w tym samym oknie lub w nowej karcie.
      placeholder: "Wybierz..."
      default: _self
      options:
        _self: W tej samej karcie
        _blank: Nowe okno

    copyright:
      type: separator.note
      class: alert alert-success
      content: 'Cząstka wykonana w ramach nauki'


Mam nadzieję, że nazwy, których użyłem oraz opisy są zrozumiałe i nie wymagają dodatkowego wyjaśnienia. Kluczową rolę w plikach yaml maja wcięcia. Nie można ich dowolnie modyfikować. Nazwy zakończone dwukropkiem (image: imageAlt: itd.) to nasze zmienne, które będziemy używać w pliku twig do wyświetlania treści.

icon: fa-images czyli ikonka, która jest widoczna przy cząstkach jest ikonką z zestawu darmowego fontawensome który jest ładowany domyślnie przez Joomla. Możesz wybrać dowolną ikonkę z tego zestawu.

Efekt na zapleczu

Aktualnie nasza konfiguracja znajduje się na jednej karci. Podzielmy nasze dane na zakładki. W jednej umieścimy baner z tekstem a w drugiej nasze przyciski. Dzięki temu cząstka będzie bardziej czytelna. W tym celu do naszych pół (fields) dodamy karty (tabs). Jest to pole typu containers.tabs

 


_tabs:
    type: container.tabs
    fields:

Następnie każdą zakładkę fields zaczynamy od identyfikatora oraz etykiety pamiętając o wcięciach


_tab_content:
    label: Etykieta zakładki
    fields:

Kod po wprowadzonych zmianach


name: Hero Banner
description: Wyświetlaj baner z nagłowkiem oraz dwoma CTA.
type: particle
icon: fa-images
configuration:
  caching:
    type: static
form:
  overrideable: false
  fields:
    enabled:
      type: input.checkbox
      label: Enabled
      description: Globally enable to the particles.
      default: true

    _tabs:
      type: container.tabs
      fields:
        _tab_content:
          label: Baner z nagłowkiem
          fields:
            image:
              type: input.imagepicker
              label: Obraz
              description: Wybierz obraz.

            imageAlt:
              type: input.text
              label: Tekst alternatywny dla obrazka
              description: Dodaj text alternatywny dla obrazka.

            title:
              type: input.text
              label: Tytuł
              description: Wpisz tytuł/nagłowek.

            description:
              type: textarea.textarea
              label: Krótki opis
              description: Wpisz krótki opis pod nagłówkiem.
        _tab_buttons:
          label: Przyciski CTA
          fields:
            separatorL:
              type: separator.note
              class: alert alert-info
              content: "Przycisk po lewej stronie"

            buttontextL:
              type: input.text
              label: Tekst na przycisku
              description: Etykieta przycisku.
              placeholder: Pokaż więcej

            buttonlinkL:
              type: input.text
              label: Link
              description: adres odnośnika.
              placeholder: http://

            button_link_titleL:
              type: input.text
              label: Tytuł linku
              description: Tytuł linku to atrybut, który dostarcza więcej informacji o linku i dokąd prowadzi.

            button_aria_labelL:
              type: input.text
              label: Link aria label
              description: Dodanie aria-label do linków jest ważne dla zapewnienia dostępności

            buttontargetL:
              type: select.selectize
              label: Target
              description: Otwórz odnośnik w tym samym oknie lub w nowej karcie.
              placeholder: "Wybierz..."
              default: _self
              options:
                _self: W tej samej karcie
                _blank: Nowe okno

            separatorR:
              type: separator.note
              class: alert alert-info
              content: "Przycisk po prawej stronie"

            buttontextR:
              type: input.text
              label: Tekst na przycisku
              description: Etykieta przycisku.
              placeholder: Pokaż więcej

            buttonlinkR:
              type: input.text
              label: Link
              description: adres odnośnika.
              placeholder: http://

            button_link_titleR:
              type: input.text
              label: Tytuł linku
              description: Tytuł linku to atrybut, który dostarcza więcej informacji o linku i dokąd prowadzi.

            button_aria_labelR:
              type: input.text
              label: Link aria label
              description: Dodanie aria-label do linków jest ważne dla zapewnienia dostępności

            buttontargetR:
              type: select.selectize
              label: Target
              description: Otwórz odnośnik w tym samym oknie lub w nowej karcie.
              placeholder: "Wybierz..."
              default: _self
              options:
                _self: W tej samej karcie
                _blank: Nowe okno

    copyright:
      type: separator.note
      class: alert alert-success
      content: "Cząstka wykonana w ramach nauki"


Wynik naszej przeróbki to dwie oddzielne zakładki Baner z nagłówkiem i Przyciski CTA

Wprowadźmy jeszcze jedno udogodnienie. Ponieważ nasze przyciski ogólnie są takie same, są to elementy powtarzalne możemy użyć dynamicznego generowania ich na zapleczu. Służy do tego pole typu collection.list

UWAGA!!! Ważne  jest to, że każde pole, które chcesz umieścić w fields musi zaczynać się od kropki ( . ) Zamiast więc wywoływać pole buttontext należałoby użyć .buttontext


button_items:
    type: collection.list
    array: true
    label: Przyciski
    overrideable: false
    description: Utwórz kolejny element do wyświetlenia.
    value: name
    ajax: true
    fields:

i teraz kiedy mamy przyciski tworzone dynamicznie nie potrzebujemy mieć zapisanych dwóch przycisków jak do tej pory ale wystarczy jeden, który będzie wzorem dla kolejnych. Nasz kod jest krótszy i bardziej czytelny.


name: Hero Banner
description: Wyświetlaj baner z nagłowkiem oraz dwoma CTA.
type: particle
icon: fa-images
configuration:
  caching:
    type: static
form:
  overrideable: false
  fields:
    enabled:
      type: input.checkbox
      label: Enabled
      description: Globally enable to the particles.
      default: true

    _tabs:
      type: container.tabs
      fields:
        _tab_content:
          label: Baner z nagłowkiem
          fields:
            image:
              type: input.imagepicker
              label: Obraz
              description: Wybierz obraz.

            imageAlt:
              type: input.text
              label: Tekst alternatywny dla obrazka
              description: Dodaj text alternatywny dla obrazka.

            title:
              type: input.text
              label: Tytuł
              description: Wpisz tytuł/nagłowek.

            description:
              type: textarea.textarea
              label: Krótki opis
              description: Wpisz krótki opis pod nagłówkiem.
        _tab_buttons:
          label: Przyciski CTA
          fields:
            label: Przyciski CTA
            button_items:
              type: collection.list
              array: true
              label: Przyciski
              overrideable: false
              description: Utwórz kolejny element do wyświetlenia.
              value: name
              ajax: true
              fields:
                .buttontext:
                  type: input.text
                  label: Tekst na przycisku
                  description: Etykieta przycisku.
                  placeholder: Pokaż więcej

                .buttonlink:
                  type: input.text
                  label: Link
                  description: adres odnośnika.
                  placeholder: http://

                .button_link_title:
                  type: input.text
                  label: Tytuł linku
                  description: Tytuł linku to atrybut, który dostarcza więcej informacji o linku i dokąd prowadzi.
                .button_aria_label:
                  type: input.text
                  label: Link aria label
                  description: Dodanie aria-label do linków jest ważne dla zapewnienia dostępności

                .buttontarget:
                  type: select.selectize
                  label: Target
                  description: Otwórz odnośnik w tym samym oknie lub w nowej karcie.
                  placeholder: "Wybierz..."
                  default: _self
                  options:
                    _self: W tej samej karcie
                    _blank: Nowe okno

    copyright:
      type: separator.note
      class: alert alert-success
      content: "Cząstka wykonana w ramach nauki"


Zmieniłem tryb zaplecza z ciemnego na jasny ponieważ kiedy tworzę ten poradnik ta wersja Gantry 5.5.20 jest jeszcze w fazie testów i nie działa poprawnie. Cześć tekstów jest nieczytelna.

Tak wygląda cząstka po zmianach (dynamiczne dodawanie przycisków CTA)

W tym momencie mamy już widoczną cząstkę w obszarze administracyjnym Gantry ale poza możliwością ustawienia danych nic się nie dzieje. Treści nie są wyświetlane. 

Następny krok, który musimy wykonać to uzupełnienie pliku html.twig. Kontroluje on sposób renderowania Particles, poprzez kod HTML i określa sposób używania zmiennych zdefiniowanych w YAML.