Програмно створити термін?


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

Будь-які ідеї?


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).- Будь-які ідеї?
Самскванч

Спробуйте vidзамість vocabulary_name. Схоже, стовпець все ще vidзнаходиться taxonomy_term_data, але це ім'я вокабу, а не id зараз
Clive

Дані сутності не слід отримувати з таблиць 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()дзвінок так само, як вважаю, ви хотіли зберегти його також.


Додаткові опції доступні через в drupal8.ovh/en/tutoriels/55 / ... .
колан

1
$term = \Drupal\taxonomy\Entity\Term::create(array( 'name' => 'whatever', 'vid' => 'tags', )); $term->save();дає мені фатальну помилку: виклик невизначеного методу Drupal \ таксономія \ Entity \ Term :: getType
alberto56

15

У цей час слід додати термін трохи іншим способом (порівняно з цією відповіддю) Перш за все у вашому файлі почати слід написати

використовувати Drupal \ таксономію \ Entity \ Term;

Оскільки клас термінів вказаний в Drupal \ таксономії \ Entity. І вам не потрібно передавати параметр taxonomy_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
Щось, що ви можете хотіти знати. $ термін буде дорівнює 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-programmatic-drupal-8

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.