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

9.7. Pluginovi u Drupalu. Kako programski dodati blok.

27/05/2025, by Ivan

U ovom tutorijalu ćemo pogledati kako programski prikazivati blokove kroz prilagođeni modul u Drupalu 8.

Primere koda možete pogledati na github-u:
https://github.com/levmyshkin/drupalbook8

Počnimo sa dodavanjem fajla koji sadrži PHP klasu, blokovi se u Drupalu kreiraju kroz prilagođeni modul na ovaj način. Proces pravljenja fajla je isti kao i za klasu stranice, kao što smo radili ovde:

9.3. Kreiranje prilagođenog Drupal 8 modula. Programski prikaz stranice.

Jedino što sada treba da napravimo fajl sa plugin-om:

modules/custom/drupalbook/src/Plugin/Block/FirstBlock.php

first block

Kopirajmo kod bloka i onda analizirajmo svaki deo koda
modules/custom/drupalbook/src/Plugin/Block/FirstBlock.php:

<?php

namespace Drupal\drupalbook\Plugin\Block;
 
use Drupal\Core\Access\AccessResult;
use Drupal\Core\Block\BlockBase;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Session\AccountInterface;
 
/**
 * Pruža blok sa jednostavnim tekstom.
 *
 * @block(
 *   id = "drupalbook_first_block_block",
 *   admin_label = @block("Moj prvi blok"),
 * )
 */
class FirstBlock extends BlockBase {
  /**
   * {@block}
   */
  public function build() {
    $config = $this->getConfiguration();
 
    if (!empty($config['drupalbook_first_block_settings'])) {
      $text = $this->t('Zdravo @Name u bloku!', ['@Name' => $config['drupalbook_first_block_settings']]);
    }
    else {
      $text = $this->t('Zdravo Svetu u bloku!');
    }
 
    return [
      '#markup' => $text,
    ];
  }
 
  /**
   * {@block}
   */
  protected function blockAccess(AccountInterface $account) {
    return AccessResult::allowedIfHasPermission($account, 'access content');
  }
 
  /**
   * {@block}
   */
  public function blockForm($form, FormStateInterface $form_state) {
    $config = $this->getConfiguration();
 
    $form['drupalbook_first_block_settings'] = [
      '#type' => 'textfield',
      '#title' => $this->t('Ime'),
      '#description' => $this->t('Kome želite da kažete zdravo?'),
      '#default_value' => !empty($config['drupalbook_first_block_settings']) ? $config['drupalbook_first_block_settings'] : '',
    ];
 
    return $form;
  }
 
  /**
   * {@block}
   */
  public function blockSubmit($form, FormStateInterface $form_state) {
    $this->configuration['drupalbook_first_block_settings'] = $form_state->getValue('drupalbook_first_block_settings');
  }
}

block layout

Prikažemo naš blok u regini Leva bočna traka ili nekoj drugoj koloni gde vam je zgodno.

sidebar first

Počnite da kucate ime vašeg bloka i Drupal će vam automatski ponuditi da izaberete vaš blok. Ako nema bloka, proverite da li je kod u pravom fajlu i folderu, i ne zaboravite da očistite keš.

place block

Sada kada je naš blok prikazan, pogledajmo kako funkcioniše kod za dodavanje bloka:

my first block

Na početku fajla imamo namespace, da odredimo gde treba da se nalazi fajl za naš blok plugin, da bi Drupal mogao automatski da ga poveže. Takođe uključujemo klase iz drugih fajlova pomoću use.

namespace Drupal\drupalbook\Plugin\Block;
 
use Drupal\Core\Access\AccessResult;
use Drupal\Core\Block\BlockBase;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Session\AccountInterface;

/**
 * Pruža blok sa jednostavnim tekstom.
 *
 * @block(
 *   id = "drupalbook_first_block_block",
 *   admin_label = @block("Moj prvi blok"),
 * )
 */

Ovde označavamo sa @block da će to biti blok plugin. id i admin_label će Drupal automatski prepoznati, zato id mora biti jedinstven. @block pomaže i kod prevođenja naziva bloka u administratorskom panelu Drupala.

class FirstBlock extends BlockBase {

Nasleđujemo BlockBase klasu, u PhpStormu možete pritisnuti Ctrl i kliknuti na BlockBase da vidite koje metode možete redefinisati u bloku, ne koristimo sve. Možete redefinisati druge metode po potrebi.

Pogledajmo dalje metode klase:

/**
 * {@block}
 */
protected function blockAccess(AccountInterface $account) {
  return AccessResult::allowedIfHasPermission($account, 'access content');
}

Već smo u ovom članku razmatrali pristup stranici, u blokovima možemo koristiti iste pristupne dozvole:

https://drupalbook.org/ru/drupal/126-rout-s-parametrom

Ovde koristimo istu klasu AccessResult.

/**
 * {@block}
 */
public function blockForm($form, FormStateInterface $form_state) {
  $config = $this->getConfiguration();
 
  $form['drupalbook_first_block_settings'] = [
    '#type' => 'textfield',
    '#title' => $this->t('Ime'),
    '#description' => $this->t('Kome želite da kažete zdravo?'),
    '#default_value' => !empty($config['drupalbook_first_block_settings']) ? $config['drupalbook_first_block_settings'] : '',
  ];
 
  return $form;
}

Za svaki blok napravljen programatski možemo imati poseban konfiguracioni formular. Ako odete u podešavanja bloka:

configure block

Videćete polje Ime koje smo dodali u metodi blockForm():

configure block

Koristimo Drupal Form API za kreiranje polja forme:

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

https://api.drupal.org/api/drupal/elements/8.5.x

Detaljnije ćemo analizirati Form API i napraviti višestepeni iskačući formular u budućnosti. Za sada možete videti koja druga polja možete koristiti preko Form API-ja. Svako polje se dodaje kao niz. Probajte da dodate još polja u formu bloka.

/**
 * {@block}
 */
public function blockSubmit($form, FormStateInterface $form_state) {
  $this->configuration['drupalbook_first_block_settings'] = $form_state->getValue('drupalbook_first_block_settings');
}

Ovde čuvamo vrednost polja iz forme u konfiguraciju Drupala. Konfiguraciju ćemo detaljnije razmatrati u narednim lekcijama, za sada treba da razumete da Drupal koristi zajedničko skladište svih konfiguracija koje koriste svi moduli. Te konfiguracije mogu da se prenesu sa jednog sajta na drugi. Na primer, ako ste promenili podešavanja bloka na lokalnoj kopiji sajta, te konfiguracije se mogu exportovati i uvesti na live sajt i tada će se podešavanja bloka primeniti i na live sajtu.

/**
 * {@block}
 */
public function build() {
  $config = $this->getConfiguration();
 
  if (!empty($config['drupalbook_first_block_settings'])) {
    $text = $this->t('Zdravo @Name u bloku!', ['@Name' => $config['drupalbook_first_block_settings']]);
  }
  else {
    $text = $this->t('Zdravo Svetu u bloku!');
  }
 
  return [
    '#markup' => $text,
  ];
}

Sada glavna metoda build() koja prikazuje sadržaj bloka. U ovoj metodi proveravamo konfiguraciju bloka, ako imamo Ime, prikazujemo tekst sa tim imenom. Obratite pažnju na $this->t() metodu, ona omogućava da se tekst prevede kroz Drupal administrativni panel na druge jezike. Takođe koristimo placeholder @Name da bismo prevodili samo željeni tekst, a ne vrednosti polja koje unosimo u konfiguracionim formama. To omogućava da se izbegne mnoštvo linija za prevod, na primer ako ne koristite placeholder, sve opcije teksta koje prolaze kroz $this->t() bi bile vidljive za prevod u admin panelu:

Zdravo Josh ...
Zdravo Mike ...
Zdravo Ivan ...
itd.

Mislim da vam je sada jasno kako prikazivati i konfigurisati prilagođene blokove u Drupalu 8, kasnije ćemo razmatrati složenije primere koristeći blokove, stranice, forme.

Primere koda možete pogledati na github-u:
https://github.com/levmyshkin/drupalbook8