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
27/05/2025, by Ivan

Možemo koristiti parametre u URL-u za rute. Oni funkcionišu slično kao i kontekstualni filteri u Views. Na primer, u URL možemo proslediti ID različitih entiteta, tekstualne nizove ili sekvencijalne ID-jeve odvojene zarezom ili plusom. U ovoj lekciji ćemo proslediti ID noda i prikazati naslov i telo tog noda u sadržaju.

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

Dodajmo rutu u naš modul u fajlu drupalbook.routing.yml:

drupalbook.display_node:
  path: '/display-node/{node}'
  defaults:
    _controller: '\Drupal\drupalbook\Controller\DisplayNode::content'
    _title_callback: '\Drupal\drupalbook\Controller\DisplayNode::getTitle'
  requirements:
    _custom_access: '\Drupal\drupalbook\Controller\DisplayNode::access'
  options:
    parameters:
      node:
        type: entity:node

Ovde u putanji prosleđujemo drugi argument {node}, u URL ćemo upisivati obični ID: /display-node/101, ali našem kontroleru će stići već spreman objekat noda. Da bismo to postigli, u options navodimo parametre šta treba proslediti i kakav će biti tip izlaza.

options:
    parameters:
      node: # ime argumenta, ono što je između {}, može biti node1, node2 ako prosleđujemo dva različita argumenta.
        type: entity:node # tip objekta koji će biti prosleđen, možemo koristiti objekat entiteta unutar kontrolera.

Definisali smo i u kojoj metodi će se prikazivati naslov preko parametra _title_callback. Takođe ćemo ograničiti prikaz članaka za anonimne korisnike, za to koristimo _custom_access parametar u kome navodimo metodu koja će ograničavati pristup.

Sada kada smo definisali rutu, pređimo na pisanje klase za ovu rutu.

modules/custom/drupalbook/src/Controller/DisplayNode.php:

<?php
/**
 * @file
 * Contains \Drupal\drupalbook\Controller\DisplayNode.
 */
 
namespace Drupal\drupalbook\Controller;
 
use Drupal\Core\Access\AccessResult;
use Drupal\node\NodeInterface;
 
/**
 * Pruža odgovore za rute modula DrupalBook.
 */
class DisplayNode {
 
  /**
   * Vraća jednostavnu stranicu.
   *
   * @return array
   *   Renderabilni niz za prikaz.
   */
  public function content(NodeInterface $node) {
    $element = array(
      '#markup' => $node->body->value,
    );
    return $element;
  }
 
  /**
   * Proverava pristup za ovaj kontroler.
   */
  public function access(NodeInterface $node) {
    $user = \Drupal::currentUser();
    if ($node->getType() == 'article' && !in_array('authenticated', $user->getRoles())) {
      return AccessResult::forbidden();
    }
    return AccessResult::allowed();
  }
 
  /**
   * Vraća naslov stranice.
   */
  public function getTitle(NodeInterface $node) {
    return $node->getTitle();
  }
 
}

Kreirao sam posebnu klasu za moju rutu da ne bi sva logika bila u jednom kontroleru. Pogledajmo šta svaki deo koda znači.

namespace Drupal\drupalbook\Controller;

Ovde navodimo gde se nalazi fajl našeg kontrolera.

use Drupal\Core\Access\AccessResult;
use Drupal\node\NodeInterface;

Uključujemo AccessResult klasu za vraćanje 403 greške i NodeInterface da bismo u kontroler dobili objekat noda kao parametar metode.

public function content(NodeInterface $node) {
  $element = array(
    '#markup' => $node->body->value,
  );
  return $element;
}

Obratite pažnju na parametar, dobijamo objekat noda, Drupal sam konvertuje ID iz URL-a u objekat i prosleđuje ga, tako da ne moramo ponovo da učitavamo nodu, već dobijamo spreman objekat gde nam treba. $node->body->value je način da dohvatimo vrednost polja iz noda. Detaljnije ćemo rad sa objektima obrađivati u narednoj lekciji o Entity API-ju. Na kraju vraćamo niz sa #markup za prikaz sadržaja noda kao tekstualne stranice.

public function access(NodeInterface $node) {
  $user = \Drupal::currentUser();
  if ($node->getType() == 'article' && !in_array('authenticated', $user->getRoles())) {
    return AccessResult::forbidden();
  }
  return AccessResult::allowed();
}

Prvo koristimo Drupal metodu currentUser() da dobijemo trenutnog korisnika, zatim proveravamo uloga korisnika. U if-u proveravamo tip sadržaja noda i korisničke uloge; anonimni korisnici dobiće 403 grešku, ostali će imati pristup. Možete pogledati u klasu AccessResult koje metode postoje za kontrolu pristupa.

Access Result

Metode koje možete koristiti su:

neutral
allowed
forbidden
allowedIf
forbiddenIf
allowedIfHasPermission
allowedIfHasPermissions
isAllowed
isForbidden
isNeutral
orIf
andIf

Možete eksperimentisati sa allowedIfHasPermission() i dodeljivati različite dozvole različitim ulogama. Na primer, možete kreirati novu dozvolu u vašem modulu i koristiti je u kontroleru. Iako je lakše koristiti dozvole direktno u yml fajlu rute, AccessResult klasa daje fleksibilnost da definišete složenu logiku pristupa (npr. pristup dozvoljen samo ovlašćenim korisnicima od 12 do 16h, ili korisnicima sa premium ulogom tokom celog dana). Eksperimentišite i primenjujte različite pristupne kontrole za vaše članke.

Drupal pruža nekoliko načina za implementaciju pristupa sadržaju, što je zgodno jer u 99% slučajeva je dovoljna jedna dozvola.

public function getTitle(NodeInterface $node) {
  return $node->getTitle();
}

Ovde jednostavno vraćamo naslov noda kao naslov stranice, ali možemo proširiti ovu funkciju, na primer:

public function getTitle(NodeInterface $node) {
    $user = \Drupal::currentUser();
    if ($node->getType() == 'article' && !in_array('authenticated', $user->getRoles())) {
     return 'Premium sadržaj: ' . $node->getTitle();
   }
   else {
     return 'Sadržaj sa slobodnim pristupom: ' . $node->getTitle();
   }
}

Ili možemo prikazati datum objave u naslovu.

Kao što vidite, Drupal pruža mogućnost fleksibilnog podešavanja ruta i kontrolera. Kada vaš klijent ima ideje za prikaz sadržaja na sajtu, uvek možete to realizovati koristeći Drupal API i malo PHP koda.

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