Программно создать термин?

32

Я пытаюсь добавить много слов (~ 200) в словарь, но я не могу найти какие-либо модули импорта, которые обновляются для Drupal 8, и кажется, что функции для этого в Drupal 7 не существуют в Drupal 8. Итак, кто-нибудь может указать мне правильное направление для этого?

Я попытался сделать это entity_create, как это было предложено в комментариях, с помощью этого кода:

$term_create = entity_create('taxonomy_term', array('name' => 'test', 'vocabulary_name' => 'client'));

но я получил эту ошибку:

Drupal\Core\Entity\EntityStorageException: Missing bundle for entity type taxonomy_term in Drupal\Core\Entity\FieldableEntityStorageControllerBase->create() (line 65 of core/lib/Drupal/Core/Entity/FieldableEntityStorageControllerBase.php).

Любые идеи?

Samsquanch
источник
1
Термин является юридическим лицом, так что ...entity_create()
Клайв
Я попытался сделать это с помощью этого кода:, $term_create = entity_create('taxonomy_term', array('name' => 'test', 'vocabulary_name' => 'client'));но я получил ошибку Drupal\Core\Entity\EntityStorageException: Missing bundle for entity type taxonomy_term in Drupal\Core\Entity\FieldableEntityStorageControllerBase->create() (line 65 of core/lib/Drupal/Core/Entity/FieldableEntityStorageControllerBase.php).- Есть идеи?
Samsquanch
Попробуй vidвместо vocabulary_name. Похоже , колонна все еще vidв taxonomy_term_data, но это имя Vocab вместо идентификатора в настоящее время
Клайв
Данные сущностей не должны быть получены из таблиц SQL, см. Ниже.

Ответы:

42

Вы знаете, что хотите что-то из модуля таксономии, поэтому сначала вам нужно заглянуть в Drupal\taxonomy\Entity- или соответствующий каталог - вы найдете там Termкласс. Теперь посмотрите на аннотацию, там написано @ContentEntityType:

*   entity_keys = {
*     "id" = "tid",
*     "bundle" = "vid",
*     "label" = "name",
*     "uuid" = "uuid"
*   },

Итак, что вы хотите, это

$term = Term::create([
  'name' => 'test', 
  'vid' => 'client',
])->save();

потому что labelключ сущности есть, nameа bundleключ сущности есть vid. Я добавил ->save()звонок, так как полагаю, что ты тоже хотел его сохранить.

Leksat
источник
Дополнительные параметры доступны по адресу drupal8.ovh/en/tutoriels/55/… .
Колан
1
$term = \Drupal\taxonomy\Entity\Term::create(array( 'name' => 'whatever', 'vid' => 'tags', )); $term->save();дает мне фатальную ошибку: вызов неопределенного метода Drupal \ taxonomy \ Entity \ Term :: getType
alberto56
15

В это время вы должны добавить термин немного по-другому (по сравнению с этим ответом). Прежде всего, в начале файла вы должны написать

используйте Drupal \ taxonomy \ Entity \ Term;

Потому что термин класс указан в Drupal \ taxonomy \ Entity. И вам не нужно передавать параметр taxonomy_term

Term :: создать

потому что нужен только один параметр (массив со значениями) (ниже приведен код для этого метода в модуле таксономии)

public function create(array $values = array()) {
  // Save new terms with no parents by default.
  if (empty($values['parent'])) {
    $values['parent'] = array(0);
  }
  $entity = parent::create($values);
  return $entity;
}

Итак, последний пример

use Drupal\taxonomy\Entity\Term;
$categories_vocabulary = 'blog_categories'; // Vocabulary machine name
$categories = ['test 1', 'test 2', 'test 3', 'test 4']; // List of test terms
foreach ($categories as $category) {
  $term = Term::create(array(
    'parent' => array(),
    'name' => $category,
    'vid' => $categories_vocabulary,
  ))->save();
}
Сергей Пустынных
источник
3
Что-то, что вы можете захотеть узнать. $ term будет равен 1, скорее всего, потому что Entity::save()возвращает int. Либо константы, SAVED_NEWлибо в SAVED_UPDATEDзависимости от выполненной операции. Однако, если вы удалите ->save()и добавите $term->save();, вы увидите, что $termон обновляется с информацией, которая была сохранена в базе данных. Пример, который вы можете сделать сейчас$tid = $term->tid->value;
генерал Реднек
7
Term::create([
 'name' => ''Lama',
 'vid' => $vocabulary_id,
]);

Другие ответы используют entity_create(), что работает, но не так хорошо.

Вим Лирс
источник
6

С entityTypeManager():

$term = [
  'name'     => $name,
  'vid'      => $vocabulary,
  'langcode' => $language,
];

$term = \Drupal::entityTypeManager()->getStorage('taxonomy_term')->create($term);
Шандор Юхас
источник
2

Возможно, вы захотите посмотреть, как это делает devel / devel_generate.

Из devel_generate :

$values['name'] = devel_generate_word(mt_rand(2, $maxlength));
$values['description'] = "description of " . $values['name'];
$values['format'] = filter_fallback_format();
$values['weight'] = mt_rand(0, 10);
$values['langcode'] = LANGUAGE_NOT_SPECIFIED;
$term = entity_create('taxonomy_term', $values);
Дэвид Лухман
источник
2

Перед созданием термина лучше проверить, существует ли он, вот код:

use Drupal\taxonomy\Entity\Term;

if ($terms = taxonomy_term_load_multiple_by_name($term_value, 'vocabulary')) {
  // Only use the first term returned; there should only be one anyways if we do this right.
  $term = reset($terms);
} else {
  $term = Term::create([
    'name' => $term_value,
    'vid' => 'vocabulary',
  ]);
  $term->save();
}
$tid = $term->id();

Источник: https://www.btmash.com/article/2016-04-26/saving-and-retrieving-taxonomy-terms-programmatics-drupal-8

а, хорошо
источник