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

Kreiranje novih EBT modula

25/05/2025, by Ivan

Najlakši način za kreiranje novog EBT modula je korišćenjem Drush komande (za Drush 12+). Da biste koristili ovu komandu, potrebno je da omogućite EBT Core Starterkit modul:

EBT Starterkit

Nakon toga generator EBT modula će biti dostupan:

drush generate ebt:module

Počnite mašinski naziv sa prefiksom ebt_*, to je obavezno za rad svih EBT modula.

EBT module generate

Takođe možete koristiti EBT Starterkit u folderu EBT Core modula. Samo preimenujte sve fajlove i unutar fajlova promenite ebt_starterkit u mašinski naziv vašeg novog EBT modula.

https://www.drupal.org/project/ebt_core

Ili kopirajte EBT Text modul i zamenite mašinski naziv tamo.

https://www.drupal.org/project/ebt_text

Jer je to najjednostavniji EBT modul i sadrži sva osnovna EBT podešavanja. 

Kreiranje EBT modula korak po korak

Kopirajte postojeći EBT Text modul kao osnovu ili koristite komandu drush generate ebt:module.

EBT Text modul sadrži sledeće foldere:
/ebt_text/config/install - sa konfiguracijama za EBT Text tip bloka i instance polja. Drugi EBT moduli mogu sadržati konfiguracije za tipove paragrafa i skladištenje polja.
/ebt_text/templates - ovde se nalazi šablon block--block-content--ebt-text.html.twig za sadržaj bloka koji se može koristiti na stranici za raspored blokova i block--inline-block--ebt-text.html.twig šablon za inline blokove u Layout Builder-u.
/ebt_text/tests - ovde su testovi za EBT module, trenutno samo jedan test za instalaciju modula.

Uz to, postoje i ostali uobičajeni Drupal modul fajlovi: composer.json, ebt_text.info.yml, readme.md. Više o kreiranju prilagođenih Drupal modula možete pročitati u zvaničnoj dokumentaciji:

https://www.drupal.org/docs/develop/creating-modules

Kreiraću novi modul EBT Countdown koji će koristiti ovaj JavaScript dodatak FlipDown:

https://github.com/PButcher/flipdown

FlipCount.js

Forkujte Github repozitorijum i pošaljite ga na Packagist

Sve biblioteke trećih strana treba da budu fork-ovane i postavljene na Packagist, na primer:

https://packagist.org/packages/levmyshkin/flexslider

sa:

https://github.com/levmyshkin/flexslider

Na taj način Composer može da ih preuzima kao obične biblioteke sa Packagist-a. Ove biblioteke moraju imati "type": "drupal-library", i biće preuzete u /libraries folder, podrazumevano:
https://github.com/levmyshkin/flexslider/blob/master/composer.json

EBT library

Hajde da fork-ujemo GitHub repozitorijum za FlipDown.

Možda je neuobičajeno fork-ovati git repozitorijume, umesto da se koriste izvorni repozitorijumi. Ali verujem da će biti lakše koristiti EBT module bez manipulacija glavnim composer.json fajlom da se u njega dodaju spoljne reference. Zamislite koliko je teško početnicima da instaliraju composer, ručno ažuriraju composer.json i postave repozitorijum na pravo mesto. Sa sopstvenom Packagist bibliotekom proces instalacije postaje jednostavniji. Zato držimo sve biblioteke trećih strana na Packagist-u.

 

fork git repository

Na stranici za forkovanje git repozitorijuma možete preimenovati repozitorijum. Morate da ga držite čistim, bez velikih slova i specijalnih znakova, crtice - i donje crte _ su dozvoljene.

Rename repository

Sada imamo novi git repozitorijum:

https://github.com/levmyshkin/flipdown

Zatim treba da dodamo composer.json fajl u ovaj repozitorijum sa "type": "drupal-library":

git add composer.json
git commit -m 'Add Composer.json file'
git push origin master

Ovde je primer composer.json fajla:

https://github.com/levmyshkin/flipdown/blob/master/composer.json

Ako proverite trenutne tagove u novom git repozitorijumu, biće prazni:

git tag

Git tags

Obično pratim verzije sa izvornog repozitorijuma, na primer ako je najnovija verzija bila 1.4.6, samo inkrementiram malu verziju na 1.4.7. FlipDown repozitorijum nije imao tagove ili izdanja, tako da sam kreirao verziju 1.0.0 za novi repozitorijum:

git tag 1.0.0
git push origin 1.0.0

Potreban nam je novi tag, jer on sadrži novi composer.json sa "type": "library"

Zašto ne možemo jednostavno da kopiramo JavaScript biblioteku unutar modula?

Moguće je kopirati samo biblioteke pod GPL licencom, ali obično JavaScript biblioteke koriste MIT licencu. Tehnički je moguće, ali Drupal.org pravila to zabranjuju: 

https://www.drupal.org/about/licensing

Hajde da pošaljemo FlipDown biblioteku na packagist.org:

https://packagist.org/packages/submit

Submit new library on packagist.org

Ako ste poslali biblioteku i zaboravili da dodate composer.json sa "type": "drupal-library", ne brinite, samo dodajte composer.json i kreirajte novi tag za vaš git repozitorijum. Taj tag će automatski biti ažuriran na packagist-u.

Evo stranice biblioteke na Packagist-u za FlipDown:

https://packagist.org/packages/levmyshkin/flipdown

Packagist library

Proverite da li je na packagist stranici naveden tip drupal-library.

Vratimo se sada našim Drupal fajlovima i kopirajmo folder ebt_text, novi modul ću nazvati ebt_countdown:

EBT Countdown module

Potrebno je:

- ukloniti konfiguracije u /config/install, nove ćemo izvesti kasnije

- zameniti sve pojave ebt_text sa ebt_countdown

- preimenovati fajlove da sadrže "countdown" umesto "text"

- ažurirati tekstove za opis modula u ebt_countdown.info.yml i README.md fajlovima.

Sve ću korake komitovati zasebno u git, tako da možete pratiti izmene korak po korak:

git clone https://git.drupalcode.org/project/ebt_countdown.git

Git history
 

Sada imamo osnovu za naš modul i možemo slati izmene na Drupal.org.

Kreiranje modula na Drupal.org

Idite na sajt drupal.org na stranicu za dodavanje projekta:

https://www.drupal.org/node/add

Drupal.org dodavanje sadržaja

Potrebno je da dodate Projekat tipa Modul:

https://www.drupal.org/node/add/project-module

Naziv: Extra Block Types (EBT): Countdown
Tip projekta: Potpun projekat (Full project)
Kratki naziv: ebt_countdown
Status održavanja: Aktivno održavan
Status razvoja: U aktivnom razvoju
Kategorije modula: Content, Content Display
Eko-sistem: Extra Block Types (EBT): Core (3191928)

Kreiranje novog Drupal projekta

U polje Opis obično unosim kompletnu listu dostupnih EBT modula:

Extra Block Types: Countdown modul omogućava dodavanje bloka sa animiranim odbrojavanjem.

EBT omogućava izbor stilova za odbrojavanje preko UI-a.

EBT moduli omogućavaju dodavanje različitih blokova u Layout Builder-u za par klikova. Možete instalirati odvojene tipove blokova iz ove grupe EBT modula:
<ul>
  <li><a href="https://www.drupal.org/project/ebt_accordion" title="EBT Accordion / FAQ">EBT Akordeon / FAQ</a></li>
  <li><a href="https://www.drupal.org/project/ebt_basic_button" title="EBT Basic Button">EBT Basic Button</a></li>
  <li><a href="https://www.drupal.org/project/ebt_bootstrap_button" title="EBT Bootstrap Button">EBT Bootstrap Button</a></li>
  <li><a href="https://www.drupal.org/project/ebt_cta" title="EBT Call to Action">EBT Call to Action</a></li>
  <li><a href="https://www.drupal.org/project/ebt_carousel" title="EBT Carousel">EBT Carousel</a></li>
  <li><a href="https://www.drupal.org/project/ebt_counter" title="EBT Counter">EBT Counter</a></li>
  <li><a href="https://www.drupal.org/project/ebt_image_gallery">EBT Image Gallery</a></li>
  <li><a href="https://www.drupal.org/project/ebt_quote" title="EBT Quote">EBT Quote</a></li>
  <li><a href="https://www.drupal.org/project/ebt_slick_slider">EBT Slick Slider</a></li>
  <li><a href="https://www.drupal.org/project/ebt_slideshow">EBT Slideshow</a></li>
  <li><a href="https://www.drupal.org/project/ebt_stats">EBT Stats</a></li>
  <li><a href="https://www.drupal.org/project/ebt_tabs" title="EBT Tabs">EBT Tabs</a></li>
  <li><a href="https://www.drupal.org/project/ebt_text">EBT Text</a></li>
  <li><a href="https://www.drupal.org/project/ebt_timeline">EBT Timeline</a></li>
  <li><a href="https://www.drupal.org/project/ebt_webform">EBT Webform</a></li>
  <li><a href="https://www.drupal.org/project/ebt_webform_popup">EBT Webform Popup</a></li>
</ul>

Svi EBT tipovi blokova sadrže podrazumevani widget za EBT blokove, koji ima opcije dizajna za:
<ul>
  <li>CSS Box (margine, padding, ivice)</li>
  <li>Pozadinu koristeći boju, sliku (uključujući paralaksu i cover), video (Youtube)</li>
  <li>Edge to edge, širinu kontejnera</li>
</ul>

Više o EBT blokovima pročitajte na stranici EBT Core modula:
https://www.drupal.org/project/ebt_core

<div class="container">
<div class="panel-layout capricorn pane-bundle-cta-multiple">
  <div class="panel-pane pane-fieldable-panels-pane pane-vid-10729 d-sponsor pane-bundle-cta pane-fpid-422">
   <div class="pane-content">
    <div class="fieldable-panels-pane pane-style-full nographic pane-style-supporter">
     <div class="pane-title pane-bundle-cta-multiple">
       <h3>Treba vam još neki Extra Block Type?</h3>

       <a class="button-link" target="_blank" href="http://drupalbook.org/contact" title="DrupalBook">Kontaktirajte nas</a>

       <a href="http://drupalbook.org/contact" title="DrupalBook"  target="_blank"><img src="/files/logo.svg__1.png" alt="DrupalBook logo" width="85" /></a>
     </div>
   </div>
   </div>
  </div>
</div>
</div>

Sada imamo stranicu projekta za Drupal modul na Drupal.org:
https://www.drupal.org/project/ebt_countdown

Na kartici Verziona kontrola možete videti instrukcije kako dodati udaljeni origin za lokalni git repozitorijum:

https://www.drupal.org/project/ebt_countdown/git-instructions

Drupal projekat verziona kontrola

Nakon početnog komita treba da kreirate novu granu da biste pratili glavnu verziju ostalih EBT modula, trenutno je to 1.4.x.

Sada možemo početi da dodajemo novu funkcionalnost za naš modul. Proces je sličan razvoju prilagođenih modula, kreiraćemo tip bloka, dodaćemo polja, uključiti css/js fajlove.

Počnite sa izradom funkcionalnosti EBT Countdown

Korak 1. Kreiranje tipa bloka EBT Countdown. Jednostavno instalirajte modul ako ste ga generisali pomoću Drush-a.
 

Jednostavno instalirajte modul ako ste ga generisali pomoću Drush-a.

Pre svega, potrebno je da kreiramo novi tip bloka EBT Countdown:

/admin/structure/block/block-content/types/add

Kreiranje novog tipa bloka

Obavezno je da mašinski naziv počinje sa ebt_, zato obično naziv tipa bloka počinjem sa EBT, pa se mašinski naziv automatski kreira na pravi način. Da li mašinski naziv tipa bloka treba da se poklapa sa nazivom modula? Da, dobro je zbog konzistentnosti i da budemo sigurni da drugi EBT modul nema isti mašinski naziv. Mašinski naziv tipa bloka mora početi sa ebt_, jer je to potrebno za preklapanje šablona u modulima umesto u temi, pogledajte funkciju ebt_core_theme_registry_alter() u modulu ebt_core.

Sada možemo dodati EBT settings polje, koje je potrebno za sve EBT module. Trebalo bi dodati postojeće polje EBT Settings: field_ebt_settings:

Dodavanje EBT Settings polja

EBT Settings je zajedničko polje iz EBT Core modula, koje pruža DOM Box, pozadinu, razmak i podešavanja širine.

Pošto nam treba odbrojavanje do datuma, treba nam i timestamp polje. Dodajmo i njega:

Kreiranje polja za datum

Dodao sam prefiks ebt_ za mašinski čitljiv naziv, ali to nije obavezno. Može biti i field_countdown_date. Takođe imamo podrazumevana polja za telo i naslov bloka, što je dovoljno za countdown blok.

Obično za EBT module koristimo horizontalne kartice na formi za uređivanje:

Podešavanje prikaza forme

Nije obavezno, ali je dobro podeliti sadržaj i podešavanja, jer imamo mnogo podešavanja za blokove. 

Glavna grupa polja treba da bude kartice (Tabs) sa podešavanjima:

  • Pravac (Direction): Horizontal
  • Širina prekidača (Width Breakpoint): 120 (ili neki manji broj)

Podešavanja kartica

Sada imamo tip bloka, omogućimo EBT Countdown modul da bi se primenili šabloni za tip bloka:

/admin/modules

Omogućavanje EBT Countdown

Takođe je potrebno omogućiti Layout Builder modul i uključiti Layout Builder za bilo koji tip sadržaja, na primer za Basic Page.

/admin/structure/types/manage/page/display

Drupal EBT Countdown

Kada kreirate novu stranicu, moći ćete da dodajete blokove u raspored stranice (Layout).

EBT Countdown

A ovako izgleda na stranici:

EBT Countdown prikaz

Korak 2. Uključivanje biblioteka trećih strana u EBT module

Sada možemo uključiti našu biblioteku treće strane. Imamo levmyshkin/flipdown biblioteku u composer.json, ali pošto je ovaj novi modul prilagođeni modul, potrebno je da ovu biblioteku instaliramo ručno preko composera:

composer require levmyshkin/flipdown

Nova biblioteka bi trebalo automatski da se postavi u folder /libraries:

Instalacija flipdown

Dodajmo fajl ebt_countdown.libraries.yml i uključimo u njega flipdown css/js i JavaScript fajl ebt_flipdown/js/ebt_countdown.js u kome ćemo kasnije inicijalizovati flipdown plugin:

ebt_countdown.libraries.yml

ebt_countdown:
  css:
    component:
      /libraries/flipdown/dist/flipdown.min.css: { minified: true }
  js:
    /libraries/flipdown/dist/flipdown.min.js: { minified: true }
    js/ebt_countdown.js: {}
  dependencies:
    - core/once
    - core/drupalSettings

Za fajlove u /libraries folderu koristimo kosu crtu na početku puta, što označava apsolutnu putanju.

js/ebt_countdown.js:

(function ($, Drupal) {

  /**
   * EBT Countdown behavior.
   */
  Drupal.behaviors.ebtCountDown = {
    attach: function (context, settings) {
      // Inicijalizacija FlipDown plugina će ići ovde.
    }
  };

})(jQuery, Drupal);

Takođe treba da uključimo novu biblioteku ebt_countdown u šablonima, ne zaboravite da imamo dva šablona:

{{ attach_library('ebt_countdown/ebt_countdown') }}

Drupal šabloni

Očistite keš i proverite da li su JavaScript fajlovi na stranici:

Dodavanje JavaScript fajla

Poslaćemo datum sa PHP-a u JavaScript koristeći drupalSettings. Zato treba da proširimo fajl ebt_countdown.libraries.yml sa zavisnostima. Takođe ćemo koristiti funkciju once():

  dependencies:
    - core/once
    - core/drupalSettings

Korak 3. Uključivanje sopstvenog field widget-a za EBT Settings, prosleđivanje promenljivih u JavaScript

U EBT modulima podešavanja se po defaultu ne prosleđuju u JavaScript. Potrebno je da preklopimo klasu field widget-a EbtSettingsDefaultWidget:

ebt_countdown/src/Plugin/Field/FieldWidget/EbtSettingsCountDownWidget.php:

<?php

namespace Drupal\ebt_countdown\Plugin\Field\FieldWidget;

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

/**
 * Plugin implementacija za 'ebt_settings_countdown' widget.
 *
 * @FieldWidget(
 *   id = "ebt_settings_countdown",
 *   label = @Translation("EBT Countdown settings"),
 *   field_types = {
 *     "ebt_settings"
 *   }
 * )
 */
class EbtSettingsCountDownWidget 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);

    $element['ebt_settings']['pass_options_to_javascript'] = [
      '#type' => 'hidden',
      '#value' => TRUE,
    ];

    return $element;
  }

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

}

Sada možemo izabrati ovaj field widget za polje EBT Settings:

/admin/structure/block/block-content/manage/ebt_countdown/form-display

Drupal podešavanja

Sačuvajte blok ponovo i proverite drupalSettings JavaScript promenljivu. Sada će sve opcije iz polja EBT Settings biti prosleđene u JavaScript:

JavaScript promenljiva

Na kraju block-revision-id-* imamo Block revision ID, tako da imamo jedinstvene ključeve za sve blokove. Za inline blokove koristimo plugin ID kao što je plugin-id-block-contentd202c374-f31b-4f7e-8a0d-12842a1422ff. Tako imamo jedinstvene ID-jeve u Layout Builder-u.

FlipDown plugin ima opciju za tamnu/svetlu temu, zato prosledimo ovo podešavanje u našem field widget-u EbtSettingsCountDownWidget:

    $element['ebt_settings']['color_theme'] = [
      '#title' => $this->t('Color theme'),
      '#type' => 'radios',
      '#options' => [
        'dark' => $this->t('Dark'),
        'light' => $this->t('Light'),
      ],
      '#default_value' => $items[$delta]->ebt_settings['color_theme'] ?? 'dark',
      '#description' => $this->t('Select color theme for countdown'),
      '#weight' => '3',
    ];

Boja teme

Zatim možemo u JavaScript-u dohvatiti vrednost boje teme:

JavaScript vrednost

Korak 4. Inicijalizacija FlipDown plugina za EBT Countdown blok

Prosledili smo promenljive iz podešavanja u JavaScript, ali treba da prosledimo i vrednost datuma iz sadržaja u JavaScript. Kreiraćemo prazan div sa atributom data-date="", u koji ćemo smestiti datum i vreme iz polja Date. Za inline blokove (blokove u Layout Builder-u) koristićemo block_revision_id za jedinstveni ID bloka:

block--inline-block--ebt-countdown.html.twig:

    <div
      class="ebt-countdown-date ebt-countdown-inline-block flipdown"
      id="block-id-{{ configuration.block_revision_id }}"
      data-date="{{ content.field_ebt_countdown_date[0]['#attributes']['datetime']|date('U') }}">
    </div>

Inline Block countdown

Za content blokove sa stranice za raspored blokova koristićemo plugin_id:

block--block-content--ebt-countdown.html.twig:

    <div
      class="ebt-countdown-date ebt-countdown-block-content flipdown"
      id="block-id-{{ plugin_id|clean_class }}"
      data-date="{{ content.field_ebt_countdown_date[0]['#attributes']['datetime']|date('U') }}">
    </div>

EBT countdown block

Ako niste sigurni gde se nalazi podatak iz polja, možete instalirati modul Twig Debugger i ispisati na stranici {{ dump(content.field_ebt_countdown_date) }}:

https://www.drupal.org/project/twig_debugger

Korišćen je Twig filter date('U') za konverziju datuma u timestamp.

Sada možemo uključiti prilagođeni JavaScript i inicijalizovati FlipDown.

/ebt_countdown/js/ebt_countdown.js:

(function ($, Drupal) {

  /**
   * EBT Countdown behavior.
   */
  Drupal.behaviors.ebtCountDown = {
    attach: function (context, settings) {
      var countdowns = once('ebt-countdown-block', '.ebt-countdown-date', context);
      countdowns.forEach(function(countdown) {
        var countdownTimestamp = parseInt(countdown.getAttribute('data-date'));
        var countdownId = countdown.getAttribute('id');
        new FlipDown(countdownTimestamp, countdownId, {
          theme: "dark",
        }).start();
      });
    }
  }

})(jQuery, Drupal);

Ne zaboravite da očistite keš da biste videli izmene. Nakon toga FlipDown bi trebalo da radi na stranici:

FlipDown

Korak 5. Stilizovanje novog EBT Countdown bloka. Gulp.js fajl je uključen za Drush-om generisani EBT modul.

Kao što vidite, čak ni podrazumevani FlipDown stilovi ne rade najbolje. Na primer, na desktopu su prikazane dve linije brojeva. Ali to možemo lako popraviti prilagođenim stilovima. Možete kopirati fajlove gulpfile.js i package.json za kompajliranje SCSS u CSS iz EBT Counter modula:

https://www.drupal.org/project/ebt_counter

gulpfile.js:

// --------------------------------------------------
// Učitavanje pluginova
// --------------------------------------------------

var gulp = require('gulp'),
    sass = require('gulp-dart-scss'),
    postcss = require("gulp-postcss"),
    autoprefixer = require("autoprefixer"),
    cssnano = require("cssnano"),
    notify = require('gulp-notify'),
    sassUnicode = require('gulp-sass-unicode');


var config = {
    // glavni scss fajlovi koji importuju delove
    scssSrc: 'scss/*.scss',
    // svi scss fajlovi u scss direktorijumu
    allScss: 'scss/**/*.scss',
    // destinacija za css fajlove
    cssDest: 'css/',
    // svi js fajlovi u js direktorijumu
    allJs: 'assets/js/**/*.js',
    // sve slike
    allImgs: 'assets/img/**/*'
};


// Definisanje zadataka nakon učitavanja zavisnosti
function style() {

  return gulp.src(config.allScss)
    .pipe(sass())
    .pipe(sassUnicode())
    .pipe(postcss([autoprefixer()]))
    .pipe(gulp.dest(config.cssDest));

  gulp.task('sass:watch', function () {
    gulp.watch('./scss/**/*.scss', ['sass']);
  });
}

// Izvoz zadataka
exports.style = style;

function watch(){
    // gulp.watch prati promene fajlova i izvršava funkciju style
    gulp.watch('scss/**/*.scss', style)
}

// Ne zaboravite da izvezete zadatak!
exports.watch = watch

package.json:

{
  "name": "ebt_styles",
  "version": "1.0.0",
  "description": "Pokrenite npm install, a zatim gulp watch",
  "main": "gulpfile.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC",
  "devDependencies": {
    "autoprefixer": "^10.2.5",
    "cssnano": "^5.0.2",
    "gulp": "^4.0.2",
    "gulp-dart-scss": "^1.1.0",
    "gulp-notify": "^4.0.0",
    "gulp-postcss": "^9.0.0",
    "gulp-sass-unicode": "^1.0.5",
    "gulp-sourcemaps": "^3.0.0"
  },
  "dependencies": {
    "cucumber": "*",
    "postcss": "^8.2.13"
  }
}

Fajl package-lock.json biće generisan nakon što pokrenete:

npm install

A možete pokrenuti gulp zadatak sa:

gulp watch

Sada ćemo dodati scss fajlove:

/ebt_countdown/scss/flipdown.scss

.flipdown {
  width: 580px;
}

flipdown.css fajl će biti automatski generisan iz flipdown.scss, i možemo uključiti .css fajl u .libraries.yml:

ebt_countdown:
  css:
    component:
      /libraries/flipdown/dist/flipdown.min.css: { minified: true }
      css/flipdown.css: { }

Očistite keš i pogledajte rezultate:

EBT countdown

Sada izgleda bolje!

Da li možemo koristiti običan CSS bez kompajliranja iz SCSS?

Možemo, ali pisanje u SCSS-u je praktičnije za većinu programera.

Korak 6. Proširenje forme za podešavanja sa opcijama FlipDown plugina

FlipDown plugin ima nekoliko opcija za podešavanje prikaza:

https://github.com/PButcher/flipdown

  • theme (tema)
  • headings (naslovi)

Već smo kreirali novi field widget za EBT Settings EbtSettingsCountDownWidget, sada ćemo proširiti formu sa novim poljima:

/ebt_countdown/src/Plugin/Field/FieldWidget/EbtSettingsCountDownWidget.php:

    $element['ebt_settings']['color_theme'] = [
      '#title' => $this->t('Color theme'),
      '#type' => 'radios',
      '#options' => [
        'dark' => $this->t('Dark'),
        'light' => $this->t('Light'),
      ],
      '#default_value' => $items[$delta]->ebt_settings['color_theme'] ?? 'dark',
      '#description' => $this->t('Select color theme for countdown'),
      '#weight' => '3',
    ];

    $element['ebt_settings']['styles'] = [
      '#title' => $this->t('Styles'),
      '#type' => 'radios',
      '#options' => [
        'default' => $this->t('Default'),
        'new_year' => $this->t('New Year'),
      ],
      '#default_value' => $items[$delta]->ebt_settings['styles'] ?? 'default',
      '#description' => $this->t('Select special style for countdown'),
      '#weight' => '4',
    ];

    $element['ebt_settings']['heading_days'] = [
      '#title' => $this->t('Heading Days'),
      '#type' => 'textfield',
      '#default_value' => $items[$delta]->ebt_settings['heading_days'] ?? $this->t('Days'),
      '#description' => $this->t('Header for Days counter'),
      '#weight' => '5',
    ];

    $element['ebt_settings']['heading_hours'] = [
      '#title' => $this->t('Heading Hours'),
      '#type' => 'textfield',
      '#default_value' => $items[$delta]->ebt_settings['heading_hours'] ?? $this->t('Hours'),
      '#description' => $this->t('Header for Hours counter'),
      '#weight' => '6',
    ];

    $element['ebt_settings']['heading_minutes'] = [
      '#title' => $this->t('Heading Minutes'),
      '#type' => 'textfield',
      '#default_value' => $items[$delta]->ebt_settings['heading_minutes'] ?? $this->t('Minutes'),
      '#description' => $this->t('Header for Minutes counter'),
      '#weight' => '7',
    ];

    $element['ebt_settings']['heading_seconds'] = [
      '#title' => $this->t('Heading Seconds'),
      '#type' => 'textfield',
      '#default_value' => $items[$delta]->ebt_settings['heading_seconds'] ?? $this->t('Seconds'),
      '#description' => $this->t('Header for Seconds counter'),
      '#weight' => '8',
    ];
    
    return $element;

Ažuriranje forme za podešavanja

Na ovaj način možemo koristiti naslove za prevode:

Dodavanje naslova

Imamo sve vrednosti iz EBT podešavanja u JavaScript-u, zato sam samo dodao ID u šablon radi lakšeg dohvata ispravnog jedinstvenog ključa.

.setAttribute('id', 'plugin-id-' ~ plugin_id|clean_class)
.setAttribute('id', 'block-revision-id-' ~ configuration.block_revision_id)

Ključevi opcija prate isti obrazac kao i ID-jevi:

/ebt_core/ebt_core.module:

  // Koristi plugin_id za Block content.
  $build['#attached']['drupalSettings'][$bundle]['block-revision-id-' . $revision_id[0]['value']] = $block_options;
  $uuid = $entity->get('uuid')->getValue();
  $block_options = [
    'blockClass' => 'plugin-id-block-content' . $uuid[0]['value'],
    'options' => $options,
  ];
  $build['#attached']['drupalSettings'][$bundle]['plugin-id-block-content' . $uuid[0]['value']] = $block_options;

Na taj način možemo koristiti opcije iz JavaScript drupalSettings:

EBT podešavanja

/ebt_countdown/js/ebt_countdown.js:

(function ($, Drupal) {

  /**
   * EBT Countdown behavior.
   */
  Drupal.behaviors.ebtCountDown = {
    attach: function (context, settings) {
      var countdowns = once('ebt-countdown-block', '.ebt-countdown-date', context);
      countdowns.forEach(function(countdown) {
        // Dohvati ID bloka.
        var countdownWrapper = countdown.closest('.ebt-block-countdown');
        var countdownWrapperId = countdownWrapper.getAttribute('id');
        // Dohvati EBT podešavanja bloka.
        var ebtOptions = drupalSettings['ebtCountdown'][countdownWrapperId];
        // Pripremi opcije za JavaScript plugin.
        var countdownTimestamp = parseInt(countdown.getAttribute('data-date'));
        var countdownId = countdown.getAttribute('id');
        // Inicijalizuj JavaScript plugin.
        new FlipDown(countdownTimestamp, countdownId, {
          theme: ebtOptions['options']['color_theme'],
          headings: [
            ebtOptions['options']['heading_days'],
            ebtOptions['options']['heading_hours'],
            ebtOptions['options']['heading_minutes'],
            ebtOptions['options']['heading_seconds'],
          ],
        }).start();
      });
    }
  }

})(jQuery, Drupal);

Takođe sam dodao $element['ebt_settings']['styles'] u field widget, da bismo ga koristili u šablonu za dodavanje nove klase celom bloku.

{%
  set classes = [
  'block',
  'ebt-block',
  'ebt-block-countdown',
  'ebt-block-' ~ plugin_id|clean_class,
  'block-' ~ configuration.provider|clean_class,
  'block-' ~ plugin_id|clean_class,
  'plugin-id-' ~ plugin_id|clean_class,
  content.field_ebt_settings['#object'].field_ebt_settings.ebt_settings.styles,
]
%}
{% if content.field_ebt_settings['#object'].field_ebt_settings.ebt_settings.styles == 'new_year' %}
  {{ attach_library('ebt_countdown/new_year') }}
{% endif %}

Na ovaj način uključujemo new_year biblioteku za stil Novu godinu, ali sada treba da kreiramo tu biblioteku.

/ebt_countdown/ebt_countdown.libraries.yml:

new_year:
  css:
    component:
      css/new-year.css: { }

Evo stilova za new-year blok:

/ebt_countdown/scss/new-year.scss
/ebt_countdown/css/new-year.css

.ebt-block-countdown.new_year {
  background: url(../img/snowflakes.webp) center center repeat;
}

Evo rezultata primene novog stila:

New Year EBT block

Možete dodati proizvoljan broj stilova za nove ili postojeće EBT module. Takođe možete predložiti sopstvene stilove za bilo koji EBT modul tako što ćete kreirati issue na drupal.org:

https://www.drupal.org/project/issues/ebt_core

Korak 7. Izvoz konfiguracija za EBT tip bloka, tip paragrafa i polja

Mислим да смо завршили са додавањем функционалности у EBT Countdown, време је да извеземо конфигурације и поставимо измене на Drupal.org. Треба да копирамо све конфигурације везане за EBT Countdown у фасциклу /ebt_countdown/config/install.

Ако сте генерисали EBT модул преко Drush-а, потребно је да ажурирате конфигурације за нова поља и ваш EBT тип блока.

Након тога, омогућите EBT модул на страници Extend /admin/modules. Нови EBT тип блока и остала подешавања биће инсталирани из фасцикле /config/install из конфигурационих фајлова:

EBT module configs

Нема потребе да додајете language.* конфигурације, јер неки Drupal сајтови имају само један језик и Language модул може бити искључен.

Обично копирам све фајлове и проверавам да ли их имам у фасцикли config/install.

Copy of configs

Сада треба да уклонимо uuid и hash вредности из конфигурационих фајлова у фасцикли config/install:

Remove uuid

Пошто користимо друге Drupal модуле, треба их додати као зависности у .info фајлу.

Drupal dependencies

/ebt_countdown/ebt_countdown.info:

dependencies:
  - drupal:datetime

Korak 8. Deploy na Drupal.org i testiranje

Претходно смо креирали нови пројекат на Drupal.org:

https://www.drupal.org/project/ebt_countdown

Користићу грану 1.4.x као главну грану, ради конзистентности са осталим EBT модулима:

Drupal EBT модул

Сви издаци ће почети од верзије 1.4.0:

git tag 1.4.0
git push origin 1.4.0

Такође можете креирати -alpha или -beta верзије пре него што направите стабилну 1.4.0 верзију.

Потребно је сачекати 10 дана пре него што модул може бити укључен у безбедносна упозорења (security advisory coverage).

EBT Countdown

Сада можемо тестирати наш нови модул и исправљати грешке.

Korak 9. Dodavanje README.md fajla

Не заборавите да додате README.md фајл, пример можете видети у другим EBT модулима:

https://www.drupal.org/project/ebt_slideshow

Хвала што користите EBT модуле! Слободно питајте или предложите идеје:

Креирајте issue на Drupal.org

Контактирајте EBT програмера

Или ми пошаљите поруку на LinkedIn