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
19/06/2025, by Ivan

Sistem konfiguracije Drupal 8 upravlja konfiguracijom na jedinstven način. Po podrazumevanju, Drupal čuva konfiguracione podatke u bazi podataka, ali oni se mogu izvesti u YAML fajlove, što omogućava upravljanje konfiguracijom putem verzionog sistema. Međutim, postoje slučajevi kada je potrebno preklopiti vrednosti konfiguracije za određene svrhe. U Drupal 7 postojala je globalna promenljiva $conf, koja se obično popunjavala u fajlu settings.php uslovnim preklapanjima konfiguracije. Veliki nedostatak ovog sistema bio je što su se preklapanja mešala sa stvarnom konfiguracijom. Kada bi se forma konfiguracije, koja je sadržavala preklopljene vrednosti, sačuvala, uslovno preklapanje bi bilo snimljeno u skladište stvarne konfiguracije.

Drupal 8 uvodi sistem preklapanja konfiguracije koji:

  • Podržava ta preklapanja kao privremene slojeve preko standardnih vrednosti konfiguracije
  • Ne koristi preklopljene vrednosti u konfiguracionim formama
  • Može skladištiti preklapanja u posebnim konfiguracionim fajlovima radi podrške pripremi i verzionom upravljanju (npr. u slučaju preklapanja za jezike; vidi dole).

Globalna promenljiva $conf iz Drupala 7 preimenovana je u $config u Drupalu 8 i aktivirana je u sistemu konfiguracije po podrazumevanju.

Globalna preklapanja

Drupal 8 i dalje podržava korišćenje globalne promenljive $config. Sistem konfiguracije kombinuje te vrednosti preklapanja preko implementacije Drupal\Core\Config\ConfigFactory::get(). Kada izvučete vrednost iz konfiguracije, globalna promenljiva $config ima priliku da izmeni vraćenu vrednost:

// Dohvati tekst poruke za održavanje sajta sistema. Ova vrednost može biti preklopljena
// podrazumevano preko globalnog $config (kao i prevoda, vidi dole).
$message = \Drupal::config('system.maintenance')->get('message');

Da biste preklopili vrednosti konfiguracije u globalnom $config, na primer u settings.php, pristupite njihovim ključevima konfiguracije:

$config['system.maintenance']['message'] = 'Izvinjavamo se, sajt je trenutno nedostupan.';

Za ugnježdene vrednosti koristite ključeve ugnježdenog niza:

$config['system.performance']['css']['preprocess'] = 0;

Kada koristite $config van fajla settings.php, koristite prethodni globalni $config.

Može biti korisno definisati dostupne konfiguracione promenljive na jedan od sledećih načina:

  • Pregledajte ih pomoću modula "Configuration Manager" kroz korisnički interfejs na adresi /admin/config/development/configuration/single/export
  • Direktno proveravajte vaše YAML konfiguracione fajlove sajta,
  • ili ih dobijajte preko Drush-a.
drush config-list
drush config-get system.performance --include-overridden

Napomena: vrednosti preklopljene preko $config u settings.php neće biti vidljive u administrativnom interfejsu Drupala (pre nego što se reši #2408549: U konfiguracionim formama ne stoji da su vrednosti preklopljene, dok ne budete mogli koristiti Configuration Override Warn ili Config Override Inspector) niti kroz Drush bez dodavanja zastavice --include-overridden. Administrativni interfejs prikazuje vrednosti sačuvane u konfiguraciji, tako da možete da menjate okruženja koja nemaju preklapanja.

Primer preklapanja API ključeva zbog bezbednosnih razloga vidi na: Preklapanje API ključeva za Commerce Gateway plaćanja

Izbegavanje preklapanja

Možete dohvatiti konfiguraciju bez preklapanja da biste dobili sirovu vrednost konfiguracije (na primer, da onemogućite čak i primenu globalnih preklapanja). Ovo je korisno, na primer, ako pravite konfiguracionu formu. Važno je koristiti okruženje bez preklapanja za formu, da biste izbegli unošenje preklopljenih vrednosti u sačuvanu konfiguraciju. Još je korisnije ako se vaš kod koristi u višejezičkom okruženju, gde se vrednosti konfiguracije obično preklapaju kao prevodi.

Primeri dobijanja konfiguracije sa i bez preklapanja:

// Dohvati ime sajta sa preklapanjima.
$site_name = \Drupal::config('system.site')->get('name');

// Dohvati ime sajta bez preklapanja.
$site_name = \Drupal::config('system.site')->getOriginal('name', FALSE);
// Napomena: promenjiva konfiguracija je uvek bez preklapanja.
$site_name = \Drupal::configFactory()->getEditable('system.site')->get('name');

Takođe možete direktno pristupiti skladištu podešavanja preko servisa config.storage, koji implementira StorageInterface::read(). Međutim, ovo retko predstavlja ispravan način za pristup konfiguraciji.

Jezička preklapanja

Na primer, za slanje mejla korisniku, njegova konfiguracija mora biti na jeziku korisnika, a ne na jeziku stranice. Zapamtite prethodno korišćen jezik, postavite odgovarajući jezik u zavisnosti od korisnika, izvršite operacije bazirane na konfiguraciji i vratite jezik nazad:

// Učitaj servis language_manager
$language_manager = \Drupal::service('language_manager');

// Dohvati ciljani jezik
$langcode = $account->getPreferredLangcode();
$language = $language_manager->getLanguage($langcode);

// Zapamti originalni jezik pre ove operacije.
$original_language = $language_manager->getConfigOverrideLanguage();
// Postavi ciljani jezik za preklapanje konfiguracije.
$language_manager->setConfigOverrideLanguage($language);

$mail_config  = \Drupal::config('user.mail');

// Sada pošalji mejl baziran na $mail_config na odgovarajućem jeziku.

// Vrati jezik konfiguracije nazad.
$language_manager->setConfigOverrideLanguage($original_language);

Sistem jezičkih preklapanja takođe koristi skladište konfiguracije za čuvanje preklapanja (za razliku od globalnih preklapanja na bazi $config). Jezička preklapanja se čuvaju u fajlovima imenovanim po njihovom osnovnom fajlu. Dakle, ako postoji jezičko preklapanje za dati konfiguracioni fajl user.mail, on će se zvati language.config.$langcode.user.mail. Fajlovi preklapanja se imenuju koristeći prefiks language.config., zatim kod jezika, pa originalni ključ konfiguracije. Čuvanje fajlova zajedno sa običnom konfiguracijom omogućava postepeni prevod konfiguracije i može se menjati kao i osnovna konfiguracija.

Kako se ovi jezički fajlovi preklapanja prvo kreiraju? Lokalni modul se integriše sa sistemskim događajima da bi kreirao prevodne fajlove za isporučenu konfiguraciju na osnovu informacija iz konfiguracione šeme. Takođe postoji osnovni modul za prevođenje konfiguracije koji pruža zajednički korisnički interfejs za prevođenje konfiguracije bazirane na šemama. Radi i sa isporučenom i sa korisničkom konfiguracijom i koristi iste fajlove jezičkih preklapanja.

Obezbeđivanje preklapanja iz modula

Moguće je takođe obezbediti preklapanje na nivou modula iz bilo kog modula. Dok Drupal jezgro podržava globalna preklapanja i preklapanja bazirana na jeziku, postoje slučajevi za mnoge druge vrste preklapanja, uključujući one bazirane na ulogama korisnika, kontekstu, domenima, grupama itd. Moduli mogu definisati svoja pravila za vršenje tih preklapanja.

Kada ConfigFactory skuplja preklapanja modula, poziva sve servise označene kao config.factory.override:

config_example.services.yml
services:
  config_example.overrider:
    class: Drupal\config_example\Config\ConfigExampleOverrides
    tags:
      - {name: config.factory.override, priority: 5}

Postavite prioritet pretplatnika da odredite prioritet preklapanja. Preklapanja sa višim prioritetom imaju prednost nad onima sa nižim (za isti naziv konfiguracije).

src/Config/ConfigExampleOverrides.php
namespace Drupal\config_example\Config;

use Drupal\Core\Cache\CacheableMetadata;
use Drupal\Core\Config\ConfigFactoryOverrideInterface;
use Drupal\Core\Config\StorageInterface;

/**
 * Primer preklapanja konfiguracije.
 */
class ConfigExampleOverrides implements ConfigFactoryOverrideInterface {

  /**
   * {@inheritdoc}
   */
  public function loadOverrides($names) {
    $overrides = array();
    if (in_array('system.site', $names)) {
      $overrides['system.site'] = ['name' => 'Overridden site name!'];
    }
    return $overrides;
  }

  /**
   * {@inheritdoc}
   */
  public function getCacheSuffix() {
    return 'ConfigExampleOverrider';
  }
  
  /**
   * {@inheritdoc}
   */
  public function getCacheableMetadata($name) {
    return new CacheableMetadata();
  }

  /**
   * {@inheritdoc}
   */
  public function createConfigObject($name, $collection = StorageInterface::DEFAULT_COLLECTION) {
    return NULL;
  }

}

Preklapanja konfiguracije funkcionišu na tri različita nivoa: jezik, moduli i settings.php, pri čemu poslednji ima najveći prioritet. Preklapanja u settings.php imaju prioritet nad vrednostima koje obezbeđuju moduli. Preklapanja modula imaju prioritet nad jezičkim preklapanjima. Prioritet pretplatnika događaja za preklapanja modula određuje samo prioritet u odnosu na preklapanja drugih modula i ne može se koristiti za postavljanje višeg prioriteta u odnosu na jezička ili settings.php preklapanja.

Imajte na umu da konfiguracione forme u Drupal Core ne koriste preklopljene vrednosti konfiguracije. U gore navedenom primeru preklapanja modula, nećete videti "Overridden site name!" na stranici /admin/config/system/site-information.

Vredno je ponoviti da, ako želite da pročitate originalne vrednosti konfiguracije u preklapanju, npr. za poređenje ili spajanje, treba da učitate preko \Drupal::configFactory, a ne \Drupal::config, da biste izbegli rekurzivno pozivanje unutar vašeg preklapanja:

$original = \Drupal::configFactory()->getEditable('system.site')->getOriginal('name', FALSE);

Još dodatnih informacija

Sistem preklapanja u svojoj sadašnjoj formi uveden je u #2098119: Zamenite sistem konteksta config ugrađenom podrškom za lokalizaciju i preklapanja bazirana na jednom događaju.

Istorijske/zastarjele informacije pogledajte u #1646580: Implementacija događaja i slušalaca konfiguracije i opsega skladišta za lokalizovanu konfiguraciju, gde je sistem preklapanja konfiguracije prvobitno predstavljen i #1763640: Uvesti kontekst konfiguracije da bi se izvornu konfiguraciju učinilo dostupnom i druge izmene koje su omogućile kontekstualni pristup. Preklapanja specifična za jezik dodata su kasnije u #2020361: Kreirati LanguageConfigContext za aktiviranje jezičkih preklapanja konfiguracije.

Drupal’s online documentation is © 2000-2020 by the individual contributors and can be used in accordance with the Creative Commons License, Attribution-ShareAlike 2.0. PHP code is distributed under the GNU General Public License.