Secara terprogram membuat istilah?

32

Saya mencoba untuk menambahkan banyak istilah (~ 200) ke kosakata, tetapi saya tidak dapat menemukan modul impor yang diperbarui untuk Drupal 8, dan sepertinya fungsi untuk melakukan ini di Drupal 7 tidak ada di Drupal 8. Jadi, adakah yang bisa mengarahkan saya ke arah yang benar untuk melakukan ini?

Saya berusaha melakukannya dengan entity_create, seperti yang disarankan dalam komentar, dengan kode ini:

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

tapi saya mendapat kesalahan ini:

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

Ada ide?

Samsquanch
sumber
1
Suatu istilah adalah suatu entitas, jadi ...entity_create()
Clive
Saya mencoba melakukan ini dengan kode ini:, $term_create = entity_create('taxonomy_term', array('name' => 'test', 'vocabulary_name' => 'client'));tetapi saya mendapatkan kesalahan 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).- Ada ide?
Samsquanch
Cobalah viddi tempat vocabulary_name. Tampak seperti kolom masih viddi taxonomy_term_data, tapi itu nama vocab bukan id sekarang
Clive
Data entitas tidak boleh diturunkan dari tabel SQL, lihat di bawah.

Jawaban:

42

Anda tahu bahwa Anda menginginkan sesuatu dari modul taksonomi jadi pertama-tama Anda perlu melihat Drupal\taxonomy\Entity- atau direktori yang sesuai - Anda akan menemukan Termkelas di sana. Sekarang lihat anotasi, katanya @ContentEntityTypedan di sana:

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

Jadi, yang Anda inginkan adalah

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

karena labelkunci entitas adalah namedan bundlekunci entitas adalah vid. Saya menambahkan ->save()panggilan dan saya kira Anda ingin menyimpannya juga.

Leksat
sumber
Opsi lainnya tersedia di drupal8.ovh/en/tutoriels/55/… .
colan
1
$term = \Drupal\taxonomy\Entity\Term::create(array( 'name' => 'whatever', 'vid' => 'tags', )); $term->save();beri saya kesalahan fatal: Panggilan ke metode yang tidak ditentukan Drupal \ taxonomy \ Entity \ Term :: getType
alberto56
15

Pada saat ini Anda harus menambahkan istilah sedikit dengan cara lain (dibandingkan dengan jawaban ini ) Pertama-tama dalam file Anda mulai Anda harus menulis

gunakan Drupal \ taxonomy \ Entity \ Term;

Karena Term term terdaftar di Drupal \ taxonomy \ Entity. Dan Anda tidak perlu meneruskan parametr taxonomy_term ke

Term :: create

karena hanya satu parametr yang diperlukan (array dengan nilai) (di bawah ini kode yang tercantum untuk metode ini dalam modul taksonomi)

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

Jadi contoh terakhir adalah

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();
}
Сергей Пустынных
sumber
3
Sesuatu yang mungkin ingin Anda ketahui. $ term akan sama dengan 1 kemungkinan besar karena Entity::save()mengembalikan int. Entah konstanta SAVED_NEWatau SAVED_UPDATEDtergantung pada operasi yang dilakukan. Namun, jika Anda menghapus ->save()dan menambahkan $term->save();, Anda akan melihat bahwa $termitu diperbarui dengan informasi yang disimpan ke database. Contoh yang sekarang dapat Anda lakukan$tid = $term->tid->value;
Jenderal Redneck
7
Term::create([
 'name' => ''Lama',
 'vid' => $vocabulary_id,
]);

Jawaban lain menggunakan entity_create(), yang berfungsi, tetapi tidak begitu baik.

Wim Leers
sumber
6

Dengan entityTypeManager():

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

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

Anda mungkin ingin melihat bagaimana devel / devel_generate melakukan ini.

Dari 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
sumber
2

Sebelum membuat istilah, lebih baik memeriksa apakah itu ada, berikut kodenya:

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

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

ah bagus
sumber