Programmatisch einen Begriff erstellen?


32

Ich versuche, einem Vokabular viele Begriffe (~ 200) hinzuzufügen, aber ich kann keine Importmodule finden, die für Drupal 8 aktualisiert wurden, und es scheint, dass die Funktionen dafür in Drupal 7 nicht vorhanden sind Drupal 8. Kann mich jemand in die richtige Richtung weisen, um dies zu tun?

Ich habe versucht, dies entity_create, wie in den Kommentaren vorgeschlagen, mit folgendem Code zu tun :

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

aber ich habe diesen Fehler bekommen:

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

Irgendwelche Ideen?


1
Ein Begriff ist eine Entität, also ...entity_create()
Clive

Ich habe versucht, dies mit diesem Code zu tun:, $term_create = entity_create('taxonomy_term', array('name' => 'test', 'vocabulary_name' => 'client'));aber ich habe den Fehler erhalten 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).- Irgendwelche Ideen?
Samsquanch

Versuchen Sie es vidanstelle von vocabulary_name. Sieht so aus, als wäre die Spalte noch vidin taxonomy_term_data, aber es ist jetzt der Vokabelname anstelle von id
Clive

Die Entitätsdaten sollten nicht aus den SQL-Tabellen abgeleitet werden, siehe unten.

Antworten:


42

Sie wissen, dass Sie etwas aus dem Taxonomiemodul wollen, also müssen Sie zuerst nachsehen Drupal\taxonomy\Entity- oder in das entsprechende Verzeichnis - Sie werden die TermKlasse dort finden. Nun sieh dir die Anmerkung an, heißt es @ContentEntityTypeund dort drin :

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

Also, was Sie wollen, ist

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

weil der labelEntitätsschlüssel nameund der bundleEntitätsschlüssel ist vid. Ich habe einen ->save()Anruf hinzugefügt und ich nehme an, dass Sie ihn auch speichern wollten.


Weitere Optionen finden Sie unter drupal8.ovh/en/tutoriels/55/… .
Colan

1
$term = \Drupal\taxonomy\Entity\Term::create(array( 'name' => 'whatever', 'vid' => 'tags', )); $term->save();gibt mir schwerwiegenden Fehler: Aufruf der undefinierten Methode Drupal \ taxonomy \ Entity \ Term :: getType
alberto56

15

Zu diesem Zeitpunkt sollten Sie den Begriff auf eine andere Art und Weise hinzufügen (im Vergleich zu dieser Antwort). Zunächst müssen Sie in Ihre Datei schreiben

Verwenden Sie Drupal \ Taxonomy \ Entity \ Term.

Weil die Termklasse unter Drupal \ Taxonomy \ Entity aufgeführt ist. Und Sie müssen taxonomy_term parametr nicht an übergeben

Begriff :: erstellen

da nur ein Parameter benötigt wird (Array mit Werten) (unten stehender Code für diese Methode im Taxonomiemodul)

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

Das letzte Beispiel ist also

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
Etwas, das Sie vielleicht wissen möchten. $ term ist höchstwahrscheinlich gleich 1, da Entity::save()ein int zurückgegeben wird. Entweder die Konstanten SAVED_NEWoder SAVED_UPDATEDabhängig von der ausgeführten Operation. Wenn Sie jedoch das entfernen ->save()und hinzufügen $term->save();, werden Sie sehen, dass $termes mit den Informationen aktualisiert wird, die in der Datenbank gespeichert wurden. Beispiel, das Sie jetzt tun können$tid = $term->tid->value;
General Redneck

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

Die anderen Antworten verwenden entity_create(), was funktioniert, aber nicht ganz so schön ist.


6

Mit entityTypeManager():

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

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

2

Vielleicht möchten Sie sich ansehen, wie devel / devel_generate dies tut.

Aus 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

Bevor Sie einen Begriff erstellen, sollten Sie überprüfen, ob er existiert. Hier ist der 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();

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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.