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

Proširivanje forme EPT podešavanja

13/06/2025, by Ivan

Kreiranje nove klase EPT Settings forme

Čuo sam od mnogih programera zabrinutost zbog broja podešavanja za EPT module: DOM Box, pozadina, okviri, klase itd. Ovi programeri su pretpostavljali da će urednici sadržaja biti zbunjeni ili na neki način podstaknuti da prave drastično različite pasuse, margine, pozadine. Nekim projektima je potrebna fleksibilnost i više podešavanja za urednike sadržaja, ali neki projekti imaju prilično stroge vodiče sa komponentama. Za ovaj slučaj treba da promenimo naš EPT Settings field widget.

Takođe, ako kreirate novi EPT modul i prikačite JavaScript plugin sa opcijama, biće vam potreban sopstveni EPT settings widget sa poljima za ta podešavanja.

EPT Core modul ima klasu EptSettingsDefaultWidget za EPT Settings field widget. Ona sadrži DOM Box, pozadinu i sva ostala podešavanja. Hajde da počnemo da pravimo novu klasu EptSettingsSimpleWidget (ja ću je staviti u EPT Core modul). Ona će sadržati samo tri podešavanja: Širina (Width), Razmak (Spacing, za marginu ispod pasusa).

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

<?php

namespace Drupal\ept_core\Plugin\Field\FieldWidget;

use Drupal\Core\Field\FieldItemListInterface;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Component\Utility\Color;
use Drupal\Core\StringTranslation\TranslatableMarkup;
use Drupal\ept_core\Plugin\Field\FieldWidget\EptSettingsDefaultWidget;

/**
 * Implementacija plugina za 'ept_settings_simple' widget.
 *
 * @FieldWidget(
 *   id = "ept_settings_simple",
 *   label = @Translation("EPT jednostavna podešavanja pasusa"),
 *   field_types = {
 *     "ept_settings"
 *   }
 * )
 */
class EptSettingsSimpleWidget extends EptSettingsDefaultWidget  {

  /**
   * {@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 += ['ept_settings' => []];
    }
    return $values;
  }

}

Proširujemo našu osnovnu klasu za podešavanja EptSettingsDefaultWidget. U komentaru sa anotacijom @FieldWidget dajemo naziv našem widget-u id = "ept_settings_simple" i label = @Translation("EPT jednostavna podešavanja")

/**
 * Implementacija plugina za 'ept_settings_simple' widget.
 *
 * @FieldWidget(
 *   id = "ept_settings_simple",
 *   label = @Translation("EPT jednostavna podešavanja pasusa"),
 *   field_types = {
 *     "ept_settings"
 *   }
 * )
 */

Imamo takođe dve metode: formElement() i massageFormValues(). Metodu massageFormValues() možete ostaviti kako jeste. Drupal će automatski serijalizovati sva podešavanja u jednom polju field_ept_settings. Dakle, nije važno koliko imate podešavanja, ona će se čuvati kao serijalizovani niz, a vi treba samo da definišete polja za podešavanja putem Form API-ja:

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

U metodi formElement() definišemo polja za podešavanja. Hajde da sakrijemo DOM Box i podešavanja za okvire:

  /**
   * {@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['ept_settings']['design_options']['box1']);
    unset($element['ept_settings']['design_options']['other_settings']['border_color']);
    unset($element['ept_settings']['design_options']['other_settings']['border_style']);
    unset($element['ept_settings']['design_options']['other_settings']['border_radius']);

    return $element;
  }

Ako primenite novi field widget za jedan od vaših EPT tipova pasusa:

Simple EPT widget
Jednostavan EPT widget

Videćete manju formu sa podešavanjima:

EPT settings form
Forma sa EPT podešavanjima

Sada ćemo ukloniti i podešavanja za pozadinu. Ako su vam potrebna podešavanja za pozadinu i ne trebaju vam ostala, možete proširiti klasu EptSettingsDefaultWidget i napraviti svoj field widget. Evo primera kako napraviti EPT Settings što jednostavnijim.

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

Naša forma sada sadrži samo dva podešavanja:

Only two fields
Samo dva polja

Ostaje još samo da dodamo polje Spacing za dodavanje margine na dno. 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 EptSettingsSimpleWidget i napravite sopstvenu field widget klasu, kao što smo uradili sa EptSettingsDefaultWidget.

$element['ept_settings']['design_options']['other_settings']['spacing'] = [
      '#type' => 'select',
      '#title' => $this->t('Stil slike u pozadini'),
      '#options' => [
        'spacing-none' => $this->t('Bez'),
        'spacing-sm' => $this->t('Mali'),
        'spacing-md' => $this->t('Srednji'),
        'spacing-lg' => $this->t('Veliki'),
        'spacing-xl' => $this->t('Ekstra veliki'),
        'spacing-xxl' => $this->t('Duplo ekstra veliki'),
      ],
      '#default_value' => $items[$delta]->ept_settings['design_options']['other_settings']['spacing'] ?? 'spacing-none',
    ];

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

1. Preklopite šablon bloka i postavite spacing kao klasu bloka.

2. Generišite stilove u hodu i uključite ih kao posebne CSS stilove za svaki pasus.

3. Dodajte klasu putem JavaScript-a generisanjem posebnog JavaScript-a za svaki EPT pasus.

4. Preklopite listu klasa u funkciji template_preprocess_block().

Svi ovi pristupi će raditi, ali mislim da je najlakše koristiti funkciju template_process_paragraph(). Već imamo ept_core_preprocess_block() funkciju u fajlu ebt_core.module. Hajde da je iskoristimo:

...
  if (!empty($ept_settings[0]['ept_settings']['design_options']['other_settings']['spacing'])) {
    $variables['attributes']['class'][] = $ept_settings[0]['ept_settings']['design_options']['other_settings']['spacing'];
  }
...
Medium spacing
Srednji razmak
Spacing class
Spacing klasa

Sada prosleđujemo ključeve iz polja Spacing kao nazive klasa i koristićemo CSS za definisanje margina na osnovu tih klasa:

/ebt_core/scss/ept_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 preklopiti vrednosti u svom prilagođenom CSS fajlu, na primer korišćenjem bilo koje klase iz sadržaja ili body taga:

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

I možete preklopiti listu spacing vrednosti 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 select box-a za postavljanje margina za vaše EBT blokove.

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

Kontakt

Kreirajte issue na Drupal.org

Povežite se na LinkedIn-u