logo

Dodatni tipovi blokova (EBT) - Novo iskustvo rada sa Layout Builder-om❗

Dodatni tipovi blokova (EBT) – stilizovani, prilagodljivi tipovi blokova: slajdšouvi, kartice sa tabovima, kartice, akordeoni i mnogi drugi. Ugrađena podešavanja za pozadinu, DOM Box, javascript dodatke. Iskusite budućnost kreiranja rasporeda već danas.

Demo EBT moduli Preuzmite EBT module

❗Dodatni tipovi pasusa (EPT) – Novo iskustvo rada sa pasusima

Dodatni tipovi pasusa (EPT) – analogni skup modula zasnovan na pasusima.

Demo EPT moduli Preuzmite EPT module

Scroll
25/05/2025, by Ivan

Kreiranje nove klase za EBT Settings formu

Čuo sam od mnogih programera zabrinutost oko broja podešavanja za EBT module: DOM Box, pozadina, ivice, klase itd. Ti programeri su podrazumevali da će urednici sadržaja biti zbunjeni ili na neki drugi način podstaknuti da prave drastično različite blokove, margine, pozadine. Neki projekti zahtevaju fleksibilnost i više podešavanja za urednike sadržaja, ali neki projekti imaju prilično stroga pravila sa komponentama. Za ovaj slučaj treba promeniti naš EBT Settings field widget.

Takođe, ako kreirate novi EBT modul i prikačite JavaScript dodatak sa opcijama, moraćete da koristite sopstveni EBT settings widget sa poljima za podešavanja za te opcije.

EBT Core modul ima klasu EbtSettingsDefaultWidget za EBT Settings field widget. Ona sadrži DOM Box, pozadinu i sva ostala podešavanja. Počnimo sa kreiranjem nove klase EbtSettingsSimpleWidget (stavio sam je u EBT Core modul). Ona će sadržati samo tri podešavanja: širinu (Width), razmak (Spacing) (za marginu ispod bloka).

Kreirajte novi fajl:
/src/Plugin/Field/FieldWidget/EbtSettingsSimpleWidget.php

<?php

namespace Drupal\ebt_core\Plugin\Field\FieldWidget;

use Drupal\Core\Field\FieldItemListInterface;
use Drupal\Core\Form\FormStateInterface;
use Drupal\ebt_core\Plugin\Field\FieldWidget\EbtSettingsDefaultWidget;

/**
 * Implementacija plugina za 'ebt_settings_simple' widget.
 *
 * @FieldWidget(
 *   id = "ebt_settings_simple",
 *   label = @Translation("EBT Simple settings"),
 *   field_types = {
 *     "ebt_settings"
 *   }
 * )
 */
class EbtSettingsSimpleWidget extends EbtSettingsDefaultWidget {

  /**
   * {@inheritdoc}
   */
  public function formElement(FieldItemListInterface $items, $delta, array $element, array &$form, FormStateInterface $form_state) {
    $element = parent::formElement($items, $delta, $element, $form, $form_state);

    return $element;
  }

  /**
   * {@inheritdoc}
   */
  public function massageFormValues(array $values, array $form, FormStateInterface $form_state) {
    foreach ($values as &$value) {
      $value += ['ebt_settings' => []];
    }

    return $values;
  }

}

Proširujemo osnovnu klasu podešavanja EbtSettingsDefaultWidget. U komentaru anotacije @FieldWidget nazivamo naš widget id = "ebt_settings_simple" i label = @Translation("EBT Simple settings").

/**
 * Implementacija plugina za 'ebt_settings_simple' widget.
 *
 * @FieldWidget(
 *   id = "ebt_settings_simple",
 *   label = @Translation("EBT Simple settings"),
 *   field_types = {
 *     "ebt_settings"
 *   }
 * )
 */

Imamo i dve metode: formElement() i massageFormValues(). massageFormValues() možete ostaviti nepromenjeno. Drupal će automatski serijalizovati sva podešavanja u jedno polje field_ebt_settings. Tako da nije bitno koliko podešavanja imate, biće uskladištena kao serijalizovani niz i potrebno je samo da definišete polja za podešavanja koristeći Form API:

https://www.drupal.org/docs/drupal-apis/form-api

U metodi formElement() definišemo polja za podešavanja. Sakrićemo DOM Box i podešavanja za ivice:

  /**
   * {@inheritdoc}
   */
  public function formElement(FieldItemListInterface $items, $delta, array $element, array &$form, FormStateInterface $form_state) {
    $element = parent::formElement($items, $delta, $element, $form, $form_state);
    unset($element['ebt_settings']['design_options']['box1']);
    unset($element['ebt_settings']['design_options']['other_settings']['border_color']);
    unset($element['ebt_settings']['design_options']['other_settings']['border_style']);
    unset($element['ebt_settings']['design_options']['other_settings']['border_radius']);

    return $element;
  }

Ako primenite novi field widget za neki od vaših EBT tipova blokova:

EBT Settings

Videćete manju formu za podešavanja:

Without Border fields

Sada ćemo ukloniti i podešavanja pozadine. Ako vam trebaju podešavanja pozadine, ali ne i sva ostala, možete proširiti klasu EbtSettingsDefaultWidget i napraviti sopstveni field widget. Evo primera kako napraviti EBT Settings što jednostavnijim.

...
    unset($element['ebt_settings']['design_options']['other_settings']['background_color']);
    unset($element['ebt_settings']['design_options']['other_settings']['background_media']);
    unset($element['ebt_settings']['design_options']['other_settings']['background_image_style']);
...

Naša forma sada ima samo dve opcije:

only 2 fields

Ostaje samo da dodamo polje Spacing za marginu ispod bloka. Koristićemo dodatne klase i CSS za organizaciju razmaka:

spacing-none,
spacing-sm,
spacing-md,
spacing-lg,
spacing-xl,
spacing-xxl

Možda će vam trebati veća lista razmaka, slobodno proširite klasu EbtSettingsSimpleWidget i napravite sopstvenu klasu field widget-a kao što smo uradili sa EbtSettingsDefaultWidget.

    $element['ebt_settings']['design_options']['other_settings']['spacing'] = [
      '#type' => 'select',
      '#title' => $this->t('Background Image Style'),
      '#options' => [
        'spacing-none' => $this->t('None'),
        'spacing-sm' => $this->t('Small'),
        'spacing-md' => $this->t('Medium'),
        'spacing-lg' => $this->t('Large'),
        'spacing-xl' => $this->t('Extra Large'),
        'spacing-xxl' => $this->t('Double Extra Large'),
      ],
      '#default_value' => $items[$delta]->ebt_settings['design_options']['other_settings']['spacing'] ?? 'spacing-none',
    ];

Sada vidim četiri načina da dodate stilove za naš blok:

1. Prepravite blok šablon i postavite spacing kao klasu bloka.

2. Generišite stilove u letu i uključite ih kao prilagođene CSS stilove za svaki blok.

3. Dodajte klasu pomoću JavaScript-a generišući prilagođeni JavaScript za svaki EBT blok.

4. Prepravite listu klasa u funkciji template_preprocess_block().

Svi ovi pristupi će raditi, ali mislim da je najlakše koristiti funkciju template_preprocess_block(). Već imamo funkciju ebt_core_preprocess_block() u fajlu ebt_core.module. Koristićemo je:

...
  if (!empty($ebt_settings[0]['ebt_settings']['design_options']['other_settings']['spacing'])) {
    $variables['attributes']['class'][] = $ebt_settings[0]['ebt_settings']['design_options']['other_settings']['spacing'];
  }
...

EBT minimal settings

Space for EBT blocks

Sada prosleđujemo ključeve Spacing polja kao nazive klasa i koristimo CSS da definišemo vrednosti margina na osnovu tih klasa:

/ebt_core/scss/ebt_core.scss

.spacing-sm {
  margin-bottom: 10px;
}

.spacing-md {
  margin-bottom: 20px;
}

.spacing-lg {
  margin-bottom: 30px;
}

.spacing-xl {
  margin-bottom: 40px;
}

.spacing-xxl {
  margin-bottom: 50px;
}

Možete prepraviti vrednosti u svom prilagođenom CSS fajlu, na primer koristeći bilo koju klasu iz sadržaja ili body taga:

body .spacing-sm {
  margin-bottom: 15px;
}

I možete promeniti listu razmaka u svojoj prilagođenoj klasi za EBT settings field widget.

To je to, sada možete birati između DOM Box-a i običnog padajućeg menija za podešavanje margina za vaše EBT blokove.

Slobodno pitajte o EBT modulima na Drupal.org ili putem kontakt forme:

Kontakt

Kreirajte prijavu na Drupal.org

Ostanite u kontaktu na LinkedIn-u