Criar programaticamente um termo?

32

Estou tentando adicionar muitos termos (~ 200) a um vocabulário, mas não consigo encontrar nenhum módulo de importação atualizado para o Drupal 8, e parece que as funções para isso no Drupal 7 não existem no Drupal 8. Então, alguém pode me indicar a direção certa para fazer isso?

Tentei fazê-lo entity_create, como sugerido nos comentários, com este código:

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

mas eu recebi este erro:

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

Alguma ideia?

Samsquanch
fonte
1
Um termo é uma entidade, então ...entity_create()
Clive
Tentei fazer isso com este código:, $term_create = entity_create('taxonomy_term', array('name' => 'test', 'vocabulary_name' => 'client'));mas recebi o erro 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).- Alguma idéia?
Samsquanch
Tente vidno lugar de vocabulary_name. Parece que a coluna ainda está videm taxonomy_term_data, mas é o nome vocabulário em vez de id agora
Clive
Os dados da entidade não devem ser derivados das tabelas SQL, veja abaixo.

Respostas:

42

Você sabe que deseja algo do módulo de taxonomia; portanto, primeiro você precisa procurar Drupal\taxonomy\Entity- ou no diretório correspondente - você encontrará a Termclasse lá. Agora veja a anotação, e ela diz @ContentEntityType:

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

Então, o que você quer é

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

porque a labelchave da entidade é namee a bundlechave da entidade é vid. Eu adicionei uma ->save()ligação e presumo que você queira salvá-la também.

Leksat
fonte
Mais opções estão disponíveis em drupal8.ovh/en/tutoriels/55/… .
Colan
1
$term = \Drupal\taxonomy\Entity\Term::create(array( 'name' => 'whatever', 'vid' => 'tags', )); $term->save();me dá erro fatal: Chamada de método indefinido Drupal \ taxonomia \ Entidade \ Term :: getType
alberto56
15

Nesse momento, você deve adicionar um termo de outra maneira (em comparação com esta resposta) Antes de tudo, no início de seu arquivo, você deve escrever

use Drupal \ taxonomia \ Entidade \ Termo;

Porque a classe de termos listados em Drupal \ taxonomy \ Entity. E você não precisa passar o parâmetro taxonomy_term para

Termo :: create

porque apenas um parâmetro é necessário (matriz com valores) (código listado abaixo para este método no módulo de taxonomia)

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

Então o exemplo final é

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();
}
Сергей Пустынных
fonte
3
Algo que você pode querer saber. $ term será igual a 1 provavelmente porque Entity::save()retorna um int. As constantes SAVED_NEWou SAVED_UPDATEDdependendo da operação executada. No entanto, se você remover o ->save()e adicionar $term->save();, verá que $termé atualizado com as informações salvas no banco de dados. Exemplo que você pode fazer agora$tid = $term->tid->value;
General Redneck
7
Term::create([
 'name' => ''Lama',
 'vid' => $vocabulary_id,
]);

As outras respostas usam entity_create(), o que funciona, mas não é tão bom.

Wim Leers
fonte
6

Com entityTypeManager():

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

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

Você pode ver como o devel / devel_generate faz isso.

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

Antes de criar um termo, é melhor verificar se ele existe, eis o 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();

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

Ah bom
fonte