¿Crear un término mediante programación?

32

Intento agregar muchos términos (~ 200) a un vocabulario, pero no puedo encontrar ningún módulo de importación que esté actualizado para Drupal 8, y parece que las funciones para hacer esto en Drupal 7 no existen en Drupal 8. Entonces, ¿alguien puede señalarme en la dirección correcta para hacer esto?

Intenté hacerlo entity_create, como se sugiere en los comentarios, con este código:

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

pero recibí este error:

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

¿Algunas ideas?

Samsquanch
fuente
1
Un término es una entidad, así que ...entity_create()
Clive
Intenté hacer esto con este código: $term_create = entity_create('taxonomy_term', array('name' => 'test', 'vocabulary_name' => 'client'));pero recibí el error 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).. ¿Alguna idea?
Samsquanch
Prueba viden lugar de vocabulary_name. Parece que la columna todavía está vidadentro taxonomy_term_data, pero es el nombre del vocabulario en lugar de la identificación ahora
Clive
Los datos de la entidad no deben derivarse de las tablas SQL, ver más abajo.

Respuestas:

42

Sabes que quieres algo del módulo de taxonomía, así que primero debes buscar Drupal\taxonomy\Entity, o el directorio correspondiente, encontrarás la Termclase allí. Ahora mire la anotación, dice @ContentEntityTypey allí:

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

Entonces, lo que quieres es

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

porque la labelclave de entidad es namey la bundleclave de entidad es vid. Agregué una ->save()llamada y supongo que también querías guardarla.

Leksat
fuente
Hay más opciones disponibles en drupal8.ovh/en/tutoriels/55/… .
colan
1
$term = \Drupal\taxonomy\Entity\Term::create(array( 'name' => 'whatever', 'vid' => 'tags', )); $term->save();me da un error grave: Llame al método indefinido Drupal \ taxonomy \ Entity \ Term :: getType
alberto56
15

En este momento, debe agregar el término de otra manera (en comparación con esta respuesta). Primero, en su archivo, comience, debe escribir

use Drupal \ taxonomy \ Entity \ Term;

Porque la clase de término aparece en Drupal \ taxonomy \ Entity. Y no necesita pasar taxonomy_term parametr a

Plazo :: crear

porque solo se necesita un parámetro (matriz con valores) (debajo del código listado para este método en el módulo de taxonomía)

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

Entonces el ejemplo final es

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();
}
Сергей Пустынных
fuente
3
Algo que tal vez quieras saber. $ term será igual a 1 muy probablemente porque Entity::save()devuelve un int. Las constantes SAVED_NEWo SAVED_UPDATEDdependiendo de la operación realizada. Sin embargo, si elimina ->save()y agrega $term->save();, verá que $termse actualiza con la información que se guardó en la base de datos. Ejemplo que ahora puede hacer$tid = $term->tid->value;
General Redneck el
7
Term::create([
 'name' => ''Lama',
 'vid' => $vocabulary_id,
]);

Las otras respuestas usan entity_create(), que funciona, pero no es tan agradable.

Wim Leers
fuente
6

Con entityTypeManager():

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

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

Es posible que desee ver cómo devel / devel_generate hace esto.

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
fuente
2

Antes de crear un término, es mejor verificar si existe, aquí está el código:

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

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

Ah bueno
fuente