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?


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.


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

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.


6

Com entityTypeManager():

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

$term = \Drupal::entityTypeManager()->getStorage('taxonomy_term')->create($term);

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

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

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.