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

U Drupalu 8 je jezik polja uklonjen iz javnopristupnog API-ja, i polja se sada pridružuju objektima sa podrškom za jezik, od kojih „nasleđuju“ svoj jezik.

Glavne prednosti ovoga su:

  • Nije potrebno brinuti o prenosivosti polja jer se time bavi entitet objekta interno.
      // Na neki način odredite $active_langcode.
      $translation = $entity->getTranslation($active_langcode);
      $value = $translation->field_foo->value;
  • Nije više potrebno prosleđivati aktivni jezik, zapravo možemo jednostavno proslediti objekat prevoda koji implementira EntityInterface i u stvari je klon izvornog objekta, ali sa drugačijim internim jezikom. To znači da u mnogim slučajevima kod ne mora znati jezik (osim ako to nije eksplicitno potrebno).
      // Kreirajte odgovarajući objekat prevoda jednom i prosleđujte ga gde je potrebno.
      // Ovo uglavnom rešavaju core podsistemi i u mnogim slučajevima eksplicitno dohvatanje
      // objekta prevoda nije potrebno.
      $langcode = Drupal::languageManager()->getLanguage(Language::TYPE_CONTENT);
      $translation = $entity->getTranslation($langcode);
      entity_do_stuff($translation);

      function entity_do_stuff(EntityInterface $entity) {
        $value = $entity->field_foo->value;
        // obradite podatke
      }
    
  • Sada imamo ponovo upotrebljiv API za usklađivanje jezika entiteta, koji se može koristiti za određivanje prevoda entiteta koji je najprikladniji za određeni kontekst:
      // Pojednostavljeni kod za generisanje renderabilnog niza za entitet.
      function viewEntity(EntityInterface $entity, $view_mode = 'full', $langcode = NULL) {
        // Metod EntityManagerInterface::getTranslationFromContext()
        // primenjuje logiku usklađivanja jezika entiteta na ceo objekat
        // i vraća odgovarajući objekat prevoda za dati kontekst.
        // Parametar $langcode je opcion i označava jezik trenutnog konteksta.
        // Ako nije naveden, koristi se trenutni jezik sadržaja,
        // što je željeno ponašanje u fazi renderovanja.
        // Polja sa praznim vrednostima se ne prikazuju.
        $langcode = NULL;
        $translation = $this->entityManager->getTranslationFromContext($entity, $langcode);
        $build = entity_do_stuff($translation, 'full');
        return $build;
      }
    

Moguće je takođe navesti opcion parametar $context, koji može opisati kontekst u kojem će se koristiti objekat prevoda:

      // Pojednostavljeni kod za generisanje zamena tokena.
      function node_tokens($type, $tokens, array $data = array(), array $options = array()) {
        $replacements = array();

        // Ako za ovaj kontekst nije naveden jezik, podrazumevano se koristi
        // podrazumevani jezik entiteta.
        if (!isset($options['langcode'])) {
          $langcode = Language::LANGCODE_DEFAULT;
        }

        // Prosleđujemo $context parametar koji opisuje operaciju koja se izvodi.
        // Podrazumevana operacija je 'entity_view'.
        $context = array('operation' => 'node_tokens');
        $translation = \Drupal::service('entity.repository')->getTranslationFromContext($data['node'], $langcode, $context);
        $items = $translation->get('body');

        // obrađujte podatke

        return $replacements;
      }
   

Logika koja se koristi za određivanje koji objekat prevoda se vraća može biti menjana od strane modula. Pogledajte LanguageManager::getFallbackCandidates() za detaljnije informacije.

Stvarni podaci polja su raspoređeni među svim objektima prevoda, i izmena vrednosti neprevodivog polja automatski menja tu vrednost za sve objekte prevoda.

  $entity->langcode->value = 'en';
  $translation = $entity->getTranslation('it');
  
  $en_value = $entity->field_foo->value; // $en_value je 'bar'
  $it_value = $translation->field_foo->value; // $it_value je 'bella'

  $entity->field_untranslatable->value = 'baz';
  $translation->field_untranslatable->value = 'zio';
  $value = $entity->field_untranslatable->value; // $value je 'zio'

U svakom trenutku može se kreirati instanca objekta prevoda iz izvornog objekta ili drugog objekta prevoda korišćenjem metode EntityInterface::getTranslation(). Ako je potreban aktivni jezik, može se dobiti preko EntityInterface::language(). Izvorni entitet se može dobiti preko EntityInterface::getUntranslated().

  $entity->langcode->value = 'en';

  $translation = $entity->getTranslation('it');
  $langcode = $translation->language()->id; // $langcode je 'it'

  $untranslated_entity = $translation->getUntranslated();
  $langcode = $untranslated_entity->language()->id; // $langcode je 'en'

  $identical = $entity === $untranslated_entity; // $identical je TRUE

  $entity_langcode = $translation->getUntranslated()->language()->id; // $entity_langcode je 'en'

EntityInterface sada ima nekoliko metoda koji olakšavaju rad sa prevodima entiteta. Ako kod treba da deluje na svakom dostupnom prevodu, može koristiti EntityInterface::getTranslationLanguages():

  foreach ($entity->getTranslationLanguages() as $langcode => $language) {
    $translation = $entity->getTranslation($langcode);
    entity_do_stuff($translation);
  }

Postoje i metode za dodavanje prevoda, njegovo uklanjanje ili proveru da li prevod postoji:

  if (!$entity->hasTranslation('fr')) {
    $translation = $entity->addTranslation('fr', array('field_foo' => 'bag'));
  }

  // Što je ekvivalent sledećem kodu, mada ako je naveden nevalidan jezički kod, baca se izuzetak.
  $translation = $entity->getTranslation('fr');
  $translation->field_foo->value = 'bag';

  // Pristup polju na uklonjenom objektu prevoda baca izuzetak.
  $translation = $entity->getTranslation('it');
  $entity->removeTranslation('it');
  $value = $translation->field_foo->value; // baca InvalidArgumentException

Kada se prevodi entiteta dodaju u skladište ili uklanjaju iz njega, sledeći hookovi se pokreću:

  • hook_entity_translation_insert()
  • hook_entity_translation_delete()

Jezik polja je i dalje dostupan pozivom odgovarajuće metode samog objekta polja:

  $langcode = $translation->field_foo->getLangcode();

 

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.