logo

Լրացուցիչ Բլոկների Տեսակներ (EBT) - Դասավորության Կառուցողի նոր փորձառություն❗

Լրացուցիչ Բլոկների Տեսակներ (EBT) - ձևավորված, կարգավորելի բլոկների տեսակներ՝ սլայդշոուներ, ներդիրներ, քարտեր, բացվող ցանկեր և շատ ուրիշներ։ Ներառված կարգավորումներ՝ ֆոնի, DOM տուփի, JavaScript փլագինների համար։ Փորձեք դասավորությունների կառուցման ապագան արդեն այսօր։

EBT մոդուլների ցուցադրական տարբերակներ Ներբեռնել EBT մոդուլները

❗Լրացուցիչ Պարբերությունների Տեսակներ (EPT) - Պարբերությունների նոր փորձառություն

Լրացուցիչ պարբերության տեսակներ (EPT) - անալոգիական պարբերության վրա հիմնված մոդուլների հավաքակազմ։

EPT մոդուլների ցուցադրական տարբերակներ Ներբեռնել EPT մոդուլները

Scroll
18/06/2025, by Ivan

Drupal 8-ում դաշտերի լեզուն այլևս չի տրամադրվում հանրային API-ում, փոխարենը դաշտերը միացվում են լեզվի աջակցությամբ օբյեկտներին, որոնցից նրանք «ժառանգում» են իրենց լեզուն։

Հիմնական առավելություններն այստեղ են՝

  • Մենք այլևս չենք անհանգստանում դաշտերի տեղափոխելիության մասին, քանի որ դա հոգում է էնտիթի օբյեկտը ներսում։
      // Ընտրեք $active_langcode որևէ ձևով։
      $translation = $entity->getTranslation($active_langcode);
      $value = $translation->field_foo->value;
  • Մենք այլևս չենք ստիպված փոխանցել ակտիվ լեզուն, фактически կարող ենք պարզապես փոխանցել այն թարգմանության օբյեկտը, որը իրականացնում է EntityInterface և որը փաստացի գերդաստիանում է սկզբնական օբյեկտի կրկնօրինակը՝ տարբեր ներքին լեզվով։ Դա նշանակում է, որ շատ դեպքերում ստացված կոդը չի գիտակցում լեզուն (առանց հատուկ առնչության լեզվին)։
      // Ստեղծեք համապատասխան թարգմանության օբյեկտը մեկ անգամ և փոխանցեք այն այնտեղ, որտեղ անհրաժեշտ է։ Սա սովորաբար հոգում է կորի հիմնական ենթահամակարգերը և շատ դեպքերում թարգմանության օբյեկտի բացահայտ ստացում անհրաժեշտ չէ։
      $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;
        // կատարեք գործողություններ
      }
  • Հիմա մենք ունենք վերամշակելի API լեզվի համաձայնեցման համար, որը կարող է օգտագործվել որոշելու էնտիթի թարգմանությունը՝ համապատասխան կոնտեքստին առավել հարմար։
      // Հարմարեցված կոդ էնտիթի համար renderable զանգված ստեղծելու։
      function viewEntity(EntityInterface $entity, $view_mode = 'full', $langcode = NULL) {
        // EntityManagerInterface::getTranslationFromContext() մեթոդը կիրառում է էնտիթի լեզվի համաձայնեցման լոգիկան ամբողջ էնտիթի օբյեկտի վրա և վերադարձնում է համապատասխան թարգմանության օբյեկտը տվյալ կոնտեքստի համար։
        // $langcode պարամետրը ընտրովի է և ցույց է տալիս ընթացիկ կոնտեքստի լեզուն։ Եթե այն չի տրամադրվում, օգտագործվում է ընթացիկ կոնտենտի լեզուն, ինչը ցանկալի է ցուցադրման փուլում։
        // Նշենք, որ դաշտի արժեքները չեն փոխվում, այնպես որ դատարկ արժեքները պարզապես չեն ցուցադրվի։
        $langcode = NULL;
        $translation = $this->entityManager->getTranslationFromContext($entity, $langcode);
        $build = entity_do_stuff($translation, 'full');
        return $build;
      }

Մեզ նաև կարելի է տրամադրել ընտրովի $context պարամետր, որը օգտագործվում է թարգմանության օբյեկտի կիրառման կոնտեքստը նկարագրելու համար։

      // Հեշտացրած կոդ token-ների փոխարինման համար։
      function node_tokens($type, $tokens, array $data = array(), array $options = array()) {
        $replacements = array();

        // Եթե կոնտեքստի համար լեզու չի նշվում, օգտագործվում է լռելյայն էնտիթի լեզուն։
        if (!isset($options['langcode'])) {
          $langcode = Language::LANGCODE_DEFAULT;
        }

        // Մենք փոխանցում ենք $context պարամետր, որը նկարագրում է կատարվող գործողությունը։ Լռելյայն գործողությունը 'entity_view'-ն է։
        $context = array('operation' => 'node_tokens');
        $translation = \Drupal::service('entity.repository')->getTranslationFromContext($data['node'], $langcode, $context);
        $items = $translation->get('body');

        // կատարեք գործողություններ

        return $replacements;
      }

Թարգմանության օբյեկտի ընտրության լոգիկան կարող է փոփոխվել մոդուլներով։ Տեսեք LanguageManager::getFallbackCandidates() լրացուցիչ տեղեկությունների համար։

Դաշտի իրական տվյալները բաշխվում են բոլոր թարգմանության օբյեկտների միջև, և չթարգմանվող դաշտի արժեքի փոփոխությունը ավտոմատ փոփոխվում է բոլոր թարգմանության օբյեկտների համար։

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

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

Բոլոր ժամանակներում կարելի է ստեղծել թարգմանության օբյեկտի օրինակ սկզբնական օբյեկտից կամ մեկ այլ թարգմանության օբյեկտից՝ օգտագործելով EntityInterface::getTranslation() մեթոդը։ Եթե ակտիվ լեզուն բացահայտ անհրաժեշտ է, այն կարելի է ստանալ EntityInterface::language() մեթոդով։ Սկզբնական էնտիթին կարելի է ստանալ EntityInterface::getUntranslated() մեթոդով։

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

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

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

  $identical = $entity === $untranslated_entity; // $identical-ը TRUE է

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

EntityInterface-ը այժմ ունի մի քանի մեթոդներ, որոնք հեշտացնում են էնտիթի թարգմանությունների հետ աշխատանքը։ Եթե կոդի հատվածը պետք է գործի բոլոր մատչելի թարգմանությունների վրա, այն կարող է օգտագործել EntityInterface::getTranslationLanguages() մեթոդը․

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

Կան նաև մեթոդներ թարգմանություն ավելացնելու, ջնջելու կամ ստուգելու համար՝

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

  // Սա համարժեք է հետևյալ կոդին, թեև եթե սխալ լեզվի կոդ է նշվում, հանվում է բացառություն։
  $translation = $entity->getTranslation('fr');
  $translation->field_foo->value = 'bag';

  // Թարգմանության օբյեկտի ջնջված դաշտին մուտք գործելը հանում է InvalidArgumentException բացառություն։
  $translation = $entity->getTranslation('it');
  $entity->removeTranslation('it');
  $value = $translation->field_foo->value; // գցում է InvalidArgumentException

Երբ էնտիթի թարգմանությունները ավելացվում կամ ջնջվում են պահեստից, համապատասխանաբար կանչվում են հետևյալ hook-երը՝

  • hook_entity_translation_insert()
  • hook_entity_translation_delete()

Դաշտի լեզուն դեռ կարող է ստացվել, կանչելով համապատասխան մեթոդ դաշտի օբյեկտի վրա՝

  $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.