Créer un terme par programme?

32

J'essaie d'ajouter beaucoup de termes (~ 200) à un vocabulaire, mais je ne trouve aucun module d'importation mis à jour pour Drupal 8, et il semble que les fonctions permettant de le faire dans Drupal 7 n'existent pas dans Drupal 8. Alors, quelqu'un peut-il m'indiquer la bonne direction à suivre?

J'ai essayé de le faire avec entity_create, comme suggéré dans les commentaires, avec ce code:

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

mais j'ai eu cette erreur:

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

Des idées?

Samsquanch
la source
1
Un terme est une entité, alors ...entity_create()
Clive
J'ai essayé de faire cela avec ce code:, $term_create = entity_create('taxonomy_term', array('name' => 'test', 'vocabulary_name' => 'client'));mais j'ai eu l'erreur 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).- Des idées?
Samsquanch
Essayez vidà la place de vocabulary_name. On dirait que la colonne est encore viden taxonomy_term_data, mais c'est le nom de vocab au lieu de id maintenant
Clive
Les données d'entité ne doivent pas être dérivées des tables SQL, voir ci-dessous.

Réponses:

42

Vous savez que vous voulez quelque chose du module taxonomie, vous devez donc commencer par regarder Drupal\taxonomy\Entity- ou le répertoire correspondant - vous y trouverez la Termclasse. Maintenant, regardez l'annotation, il est écrit @ContentEntityType:

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

Alors, ce que vous voulez c'est

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

parce que la labelclé d'entité est nameet la bundleclé d'entité est vid. J'ai ajouté un ->save()appel et je suppose que vous vouliez le sauvegarder également.

Leksat
la source
Plus d'options sont disponibles sur drupal8.ovh/en/tutoriels/55/… .
colan
1
$term = \Drupal\taxonomy\Entity\Term::create(array( 'name' => 'whatever', 'vid' => 'tags', )); $term->save();me donne une erreur fatale: appel de la méthode non définie Drupal \ taxonomy \ Entity \ Term :: getType
alberto56
15

A ce stade, vous devriez ajouter le terme petit à petit d’une autre manière (par rapport à cette réponse). Tout d’abord dans votre fichier, commencez par écrire

utilisez Drupal \ taxonomy \ Entity \ Term;

Parce que la classe Term est listée dans Drupal \ taxonomy \ Entity. Et vous n'avez pas besoin de passer taxonomy_term parametr à

Term :: create

car un seul paramètre est nécessaire (tableau avec valeurs) (code ci-dessous pour cette méthode dans le module taxonomie)

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

Donc, le dernier exemple est

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();
}
Сергей Пустынных
la source
3
Quelque chose que vous voudrez peut-être savoir. $ term sera égal à 1, probablement parce que Entity::save()renvoie un int. Soit les constantes SAVED_NEWou en SAVED_UPDATEDfonction de l'opération effectuée. Cependant, si vous deviez supprimer ->save()et ajouter $term->save();, vous verrez alors que $termles informations qui ont été enregistrées dans la base de données sont mises à jour. Exemple que vous pouvez maintenant faire$tid = $term->tid->value;
Général Redneck le
7
Term::create([
 'name' => ''Lama',
 'vid' => $vocabulary_id,
]);

Les autres réponses utilisent entity_create(), ce qui fonctionne, mais n’est pas aussi agréable.

Wim Leers
la source
6

Avec entityTypeManager():

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

$term = \Drupal::entityTypeManager()->getStorage('taxonomy_term')->create($term);
Sándor Juhász
la source
2

Vous voudrez peut-être voir comment devel / devel_generate fait cela.

De 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
la source
2

Avant de créer un terme, il est préférable de vérifier s'il existe, voici le code:

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

Source: https://www.btmash.com/article/2016-04-26/saving-and-retrieving-taxonomy-terms-programmatically-drupal-8

Ah bien
la source