Creare a livello di programmazione un termine?


32

Sto tentando di aggiungere molti termini (~ 200) a un vocabolario, ma non riesco a trovare alcun modulo di importazione aggiornato per Drupal 8 e sembra che le funzioni per farlo in Drupal 7 non esistano in Drupal 8. Quindi, qualcuno può indicarmi la giusta direzione per farlo?

Ho provato a farlo con entity_create, come suggerito nei commenti, con questo codice:

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

ma ho ricevuto questo errore:

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

Qualche idea?


1
Un termine è un'entità, quindi ...entity_create()
Clive

Ho provato a farlo con questo codice:, $term_create = entity_create('taxonomy_term', array('name' => 'test', 'vocabulary_name' => 'client'));ma ho ricevuto l'errore 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).- Qualche idea?
Samsquanch,

Prova vidal posto di vocabulary_name. Sembra che la colonna sia ancora vidin taxonomy_term_data, ma è il nome del vocabolario invece di id adesso
Clive

I dati dell'entità non devono essere derivati ​​dalle tabelle SQL, vedere di seguito.

Risposte:


42

Sai che vuoi qualcosa dal modulo di tassonomia, quindi prima devi cercare Drupal\taxonomy\Entity- o la directory corrispondente - troverai la Termclasse lì. Ora guarda l'annotazione, dice @ContentEntityTypee lì dentro:

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

Quindi, quello che vuoi è

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

perché la labelchiave entità è namee la bundlechiave entità è vid. Ho aggiunto una ->save()chiamata e presumo che anche tu volessi salvarla.


Altre opzioni sono disponibili su drupal8.ovh/it/tutoriels/55/… .
colan,

1
$term = \Drupal\taxonomy\Entity\Term::create(array( 'name' => 'whatever', 'vid' => 'tags', )); $term->save();mi dà Errore irreversibile: chiamata al metodo indefinito Drupal \ taxonomy \ Entity \ Term :: getType
alberto56

15

In questo momento dovresti aggiungere un termine in un altro modo (in confronto con questa risposta) Prima di tutto nel tuo file inizia a scrivere

usa Drupal \ tassonomia \ Entità \ Termine;

Perché classe di termine elencata in Drupal \ tassonomia \ Entità. E non è necessario passare il parametro taxonomy_term a

Term :: creare

perché è necessario un solo parametro (array con valori) (sotto il codice elencato per questo metodo nel modulo di tassonomia)

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

Quindi l'esempio finale è

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
Qualcosa che potresti voler sapere. $ term sarà uguale a 1 molto probabilmente perché Entity::save()restituisce un int. Costanti SAVED_NEWo SAVED_UPDATEDdipendenti dall'operazione eseguita. Tuttavia, se dovessi rimuovere ->save()e aggiungere $term->save();, vedrai che $termviene aggiornato con le informazioni salvate nel database. Esempio che ora puoi fare$tid = $term->tid->value;
generale Redneck il

7
Term::create([
 'name' => ''Lama',
 'vid' => $vocabulary_id,
]);

Le altre risposte usano entity_create(), che funziona, ma non è altrettanto carino.


6

Con entityTypeManager():

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

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

2

Potresti voler vedere come fa devel / devel_generate.

Da 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

Prima di creare un termine, è meglio verificare se esiste, ecco il codice:

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-programmatical-drupal-8

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.