สร้างคำโดยทางโปรแกรมหรือไม่


32

ฉันพยายามที่จะเพิ่มคำศัพท์จำนวนมาก (~ 200) กับคำศัพท์ แต่ฉันไม่พบโมดูลการนำเข้าที่อัปเดตสำหรับ Drupal 8 และดูเหมือนว่าฟังก์ชั่นสำหรับการทำเช่นนี้ใน Drupal 7 ไม่มีอยู่ใน Drupal 8. ดังนั้นใครสามารถชี้ให้ฉันเห็นทิศทางที่ถูกต้องสำหรับการทำสิ่งนี้?

ฉันพยายามที่จะทำด้วยentity_createตามที่แนะนำในความคิดเห็นด้วยรหัสนี้:

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

แต่ฉันได้รับข้อผิดพลาดนี้:

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

ความคิดใด ๆ


1
คำหนึ่งคือเอนทิตีดังนั้น ...entity_create()
38988 Clive

ฉันพยายามทำสิ่งนี้ด้วยรหัสนี้: $term_create = entity_create('taxonomy_term', array('name' => 'test', 'vocabulary_name' => 'client'));แต่ฉันได้รับข้อผิดพลาด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).- มีแนวคิดหรือไม่?
Samsquanch

ลองในสถานที่ของvid vocabulary_nameดูเหมือนว่าคอลัมน์จะยังคงvidอยู่taxonomy_term_dataแต่มันเป็นชื่อคำศัพท์แทน id ตอนนี้
ไคลฟ์

ข้อมูลเอนทิตีไม่ควรได้มาจากตาราง SQL ดูด้านล่าง

คำตอบ:


42

คุณรู้ว่าคุณต้องการบางสิ่งจากโมดูลอนุกรมวิธานดังนั้นก่อนอื่นคุณต้องมองหาDrupal\taxonomy\Entity- หรือไดเรกทอรีที่เกี่ยวข้อง - คุณจะพบTermคลาสที่นั่น ตอนนี้ดูที่คำอธิบายประกอบมันพูด@ContentEntityTypeและที่นั่น:

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

ดังนั้นสิ่งที่คุณต้องการคือ

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

เพราะlabelที่สำคัญเป็นนิติบุคคลnameและที่สำคัญเป็นนิติบุคคลbundle vidฉันได้เพิ่มการ->save()โทรและฉันคิดว่าคุณต้องการบันทึกด้วย


ตัวเลือกเพิ่มเติมมีอยู่มากกว่าที่drupal8.ovh/en/tutoriels/55/...
colan

1
$term = \Drupal\taxonomy\Entity\Term::create(array( 'name' => 'whatever', 'vid' => 'tags', )); $term->save();ให้ฉันมีข้อผิดพลาดร้ายแรง: โทรหาวิธีที่ไม่ได้กำหนด Drupal \ taxonomy \ Entity \ Term :: getType
alberto56

15

ในเวลานี้คุณควรเพิ่มคำด้วยวิธีอื่น (เทียบกับคำตอบนี้ ) ก่อนอื่นในไฟล์ของคุณเริ่มต้นคุณควรเขียน

ใช้ Drupal \ taxonomy \ Entity \ Term;

เนื่องจากคลาสคำศัพท์ที่ระบุไว้ใน Drupal \ taxonomy \ Entity และคุณไม่จำเป็นต้องส่ง taxonomy_term parametr ไปที่

ระยะเวลา :: สร้าง

เพราะต้องการเพียงพารามิเตอร์เดียว (อาร์เรย์ที่มีค่า) (ด้านล่างโค้ดที่แสดงรายการสำหรับวิธีนี้ในโมดูล taxonomy)

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

ดังนั้นตัวอย่างสุดท้ายคือ

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
สิ่งที่คุณอาจต้องการทราบ $ term จะเท่ากับ 1 ส่วนใหญ่เนื่องจากEntity::save()ส่งกลับ int อาจเป็นค่าคงที่SAVED_NEWหรือSAVED_UPDATEDขึ้นอยู่กับการดำเนินการ อย่างไรก็ตามหากคุณจะลบ->save()และเพิ่ม$term->save();คุณจะเห็นว่า$termมีการปรับปรุงด้วยข้อมูลที่บันทึกไว้ในฐานข้อมูล ตัวอย่างตอนนี้คุณสามารถทำได้$tid = $term->tid->value;
General Redneck

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

คำตอบอื่น ๆ ใช้entity_create()ซึ่งใช้งานได้ แต่ไม่ค่อยดีเท่าไหร่


6

ด้วยentityTypeManager():

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

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

2

คุณอาจต้องการดูว่า devel / devel_generate ทำสิ่งนี้ได้อย่างไร

จาก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

ก่อนที่จะสร้างคำจะเป็นการดีกว่าที่จะตรวจสอบว่ามีอยู่หรือไม่นี่คือรหัส:

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

ที่มา: https://www.btmash.com/article/2016-04-26/saving-and-retrieving-taxonomy-terms-programmatically-drupal-8

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.