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 pour faire ceci en Drupal 7 n'existe pas en Drupal 8. Alors, quelqu'un peut-il m'orienter dans la bonne direction pour le faire?)
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?
Vous savez que vous voulez quelque chose du module de taxonomie donc vous devez d'abord chercher dans Drupal\taxonomy\Entity
- ou le répertoire correspondant - vous y trouverez la classe Term
. Regardez maintenant l'annotation, elle dit @ContentEntityType
Et là-dedans:
* entity_keys = {
* "id" = "tid",
* "bundle" = "vid",
* "label" = "name",
* "uuid" = "uuid"
* },
Donc ce que tu veux c'est
$term = Term::create([
'name' => 'test',
'vid' => 'client',
])->save();
car la clé d'entité label
est name
et la clé d'entité bundle
est vid
. J'ai ajouté un appel à ->save()
et je suppose que vous vouliez aussi le sauvegarder.
À ce moment, vous devez ajouter un terme d'une autre manière (en comparaison avec this réponse) Tout d'abord dans votre fichier, vous devez écrire
utilisez Drupal\taxonomy\Entity\Term;
Parce que la classe Term répertoriée dans Drupal\taxonomy\Entity. Et vous n'avez pas besoin de passer le paramètre taxonomy_term à
Terme :: créer
car un seul paramètre est nécessaire (tableau avec valeurs) (ci-dessous le code répertorié pour cette méthode dans le module de 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();
}
Term::create([
'name' => 'Lama',
'vid' => $vocabulary_id,
]);
Les autres réponses utilisent entity_create()
, qui fonctionne, mais n'est pas aussi agréable que l'approche OOP.
Avec entityTypeManager()
:
$term = [
'name' => $name,
'vid' => $vocabulary,
'langcode' => $language,
];
$term = \Drupal::entityTypeManager()->getStorage('taxonomy_term')->create($term);
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);
Avant de créer un terme, il vaut mieux 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();