Допустим, вы получаете следующие данные — заголовок, текст статьи, и теги. При этом данные поставляются на двух языках — ‘ru’ и ‘en’. Вам требуется программно сохранить статью и её перевод.
Я полагаю, что уже активирован модуль Content Translation, и правильно настроен тип публикации, который вы собираетесь создавать.
Теги
Сначала надо разобраться со всеми дочерними сущностями, которые потребуется сохранить. В нашем случае это набор тегов.
Для определенности пусть это будут два массива, где в одном хранятся теги на русском языке, а в другом — соответствующие первому массиву английские значения.
Нам нужно собрать айди этих тегов в одном списке.
Пусть есть функция, которой мы передадим русское и английское значения, а она вернет нам объект термина таксономии (существующего термина или только что созданного).
1 2 3 4 5 6 7 |
// $listTerm - это теги на русском // а $listTermEn - на английском foreach($listTerm as $i => $termName) { $term = $this->getTerm($termName, $listTermEn[$i], 'tags'); $tags[] = ['target_id' => $term->id()]; } |
Интересно взглянуть на саму функцию. Я её оформил в виде трейта, чтобы удобнее было подключать в разные классы.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
<?php namespace Drupal\MYMODULE\Trait; use Drupal\taxonomy\Entity\Term; trait TaxonomyTrait { function getTerm(string $termNameRu, string $termNameEn, string $vid): Term { // ищет термин в указанном словаре $vid // по русскому варианту $terms = \Drupal::entityTypeManager() ->getStorage('taxonomy_term') ->loadByProperties([ 'name' => trim($termNameRu), 'langcode' => 'ru', 'vid' => $vid ]); if (!sizeof($terms)) { // если термин не найден, // создадим его $term = Term::create([ 'name' => trim($termNameRu), 'langcode' => 'ru', 'vid' => $vid, ]); $term->save(); // и добавим перевод на англ.: $term_en = $term->addTranslation('en'); $term_en->name->value = trim($termNameEn); $term_en->save(); return $term; } return array_pop($terms); } } |
Так мы создадим теги в таксономии с переводами и получим их список для создания сущности статьи.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
// $title_ru, $title_en, $descr_ru, $descr_en // - заголовки и тексты на двух языках $user = \Drupal::currentUser(); $node = \Drupal\node\Entity\Node::create([ 'uid' => $user->id(), 'type' => 'pic', 'status' => 1, 'langcode' => 'ru', 'title' => $title_ru, 'field_body' => [ 'value' => $descr_ru, 'format' => 'full_html', ], 'field_tags' => $tags ]); $node->save(); $node_en = $node->addTranslation('en', [ 'title' => $title_en, 'field_body' => [ 'value' => $descr_en, 'format' => 'full_html', ], ]); $node_en->save(); |
Важно, чтобы в настройках кастомных полей, вроде field_body, было указано, что пользователь может переводить это поле. Это разрешит drupal хранить значения для каждого из включенных в настройках языков.