Programowo utworzyć termin?

32

Próbuję dodać wiele terminów (~ 200) do słownictwa, ale nie mogę znaleźć żadnych modułów importu, które zostałyby zaktualizowane dla Drupal 8, i wydaje się, że funkcje umożliwiające to w Drupal 7 nie istnieją w Drupal 8. Czy ktoś może skierować mnie w dobrym kierunku?

Próbowałem to zrobić entity_create, zgodnie z sugestiami w komentarzach, za pomocą tego kodu:

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

ale dostałem ten błąd:

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

Jakieś pomysły?

Samsquanch
źródło
1
Termin jest bytem, ​​więc ...entity_create()
Clive
Próbowałem to zrobić za pomocą tego kodu: $term_create = entity_create('taxonomy_term', array('name' => 'test', 'vocabulary_name' => 'client'));ale dostałem błąd 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).- jakieś pomysły?
Samsquanch
Spróbuj vidzamiast vocabulary_name. Wygląda na to, że kolumna wciąż jest vidw taxonomy_term_dataśrodku, ale teraz jest to nazwa słownika zamiast id
Clive
Dane encji nie powinny pochodzić z tabel SQL, patrz poniżej.

Odpowiedzi:

42

Wiesz, że chcesz czegoś z modułu taksonomii, więc najpierw musisz zajrzeć do Drupal\taxonomy\Entity- lub odpowiedniego katalogu - Termtam znajdziesz klasę. Teraz spójrz na adnotację, która mówi @ContentEntityType:

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

Więc czego chcesz

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

ponieważ labelklucz encji jest, namea bundleklucz encji jest vid. Dodałem ->save()telefon, a także zakładam, że też chciałeś go zapisać.

Leksat
źródło
Więcej opcji dostępnych jest na stronie drupal8.ovh/en/tutoriels/55/… .
colan
1
$term = \Drupal\taxonomy\Entity\Term::create(array( 'name' => 'whatever', 'vid' => 'tags', )); $term->save();daje mi błąd krytyczny: Wywołanie niezdefiniowanej metody Drupal \ taksonomia \ Entity \ Term :: getType
alberto56
15

W tym momencie powinieneś dodać termin w nieco inny sposób (w porównaniu z odpowiedzią) Przede wszystkim w swoim pliku zacznij od napisania

użyj Drupal \ taksonomia \ Podmiot \ Termin;

Ponieważ klasa Term wymieniona w Drupal \ taksonomia \ Jednostka. I nie musisz przekazywać parametru taksonomia_term do

Termin :: tworzenie

ponieważ potrzebny jest tylko jeden parametr (tablica z wartościami) (poniżej wymieniony kod dla tej metody w module taksonomii)

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;
}

Ostatnim przykładem jest

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();
}
Сергей Пустынных
źródło
3
Coś, co możesz chcieć wiedzieć. $ termin będzie równy 1 najprawdopodobniej, ponieważ Entity::save()zwraca liczbę całkowitą. Stałe SAVED_NEWlub w SAVED_UPDATEDzależności od wykonanej operacji. Jeśli jednak usuniesz ->save()i dodasz $term->save();, zobaczysz, że $termjest aktualizowany o informacje zapisane w bazie danych. Przykład, który możesz teraz zrobić$tid = $term->tid->value;
Generał Redneck
7
Term::create([
 'name' => ''Lama',
 'vid' => $vocabulary_id,
]);

Inne odpowiedzi wykorzystują entity_create(), co działa, ale nie jest tak przyjemne.

Wim Leers
źródło
6

Z entityTypeManager():

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

$term = \Drupal::entityTypeManager()->getStorage('taxonomy_term')->create($term);
Sándor Juhász
źródło
2

Możesz przyjrzeć się, jak robi to devel / devel_generate.

Od 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);
David Luhman
źródło
2

Przed utworzeniem terminu lepiej sprawdzić, czy istnieje, oto kod:

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();

Źródło: https://www.btmash.com/article/2016-04-26/saving-and-retrieving-taxonomy-terms-programmatically-drupal-8

ahgood
źródło