Lập trình tạo ra một thuật ngữ?


32

Tôi đang cố gắng thêm nhiều thuật ngữ (~ 200) vào từ vựng, nhưng tôi không thể tìm thấy bất kỳ mô-đun nhập nào được cập nhật cho Drupal 8 và có vẻ như các chức năng để thực hiện điều này trong Drupal 7 không tồn tại trong Drupal 8. Vì vậy, bất cứ ai có thể chỉ cho tôi đi đúng hướng để làm điều này?

Tôi đã cố gắng làm điều đó với entity_create, như được đề xuất trong các bình luận, với mã này:

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

nhưng tôi đã gặp lỗi này:

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

Có ý kiến ​​gì không?


1
Một thuật ngữ là một thực thể, vì vậy ...entity_create()
Clive

Tôi đã cố gắng làm điều này với mã này: $term_create = entity_create('taxonomy_term', array('name' => 'test', 'vocabulary_name' => 'client'));nhưng tôi đã gặp lỗi 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).- Có ý tưởng nào không?
Samsquanch

Hãy thử vidtại chỗ vocabulary_name. Trông giống như cột vẫn là vidtrong taxonomy_term_data, nhưng đó là tên vocab thay vì id nay
Clive

Dữ liệu thực thể không nên được lấy từ các bảng SQL, xem bên dưới.

Câu trả lời:


42

Bạn biết rằng bạn muốn một cái gì đó từ mô-đun phân loại vì vậy trước tiên bạn cần tìm trong Drupal\taxonomy\Entity- hoặc thư mục tương ứng - bạn sẽ tìm thấy Termlớp ở đó. Bây giờ hãy nhìn vào chú thích, nó nói @ContentEntityTypevà trong đó:

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

Vì vậy, những gì bạn muốn là

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

bởi vì labelkhóa thực thể là namebundlekhóa thực thể là vid. Tôi đã thêm một ->save()cuộc gọi cũng như tôi cho rằng bạn cũng muốn lưu nó.


Nhiều tùy chọn có sẵn hơn tại drupal8.ovh/en/tutoriels/55/ .
colan

1
$term = \Drupal\taxonomy\Entity\Term::create(array( 'name' => 'whatever', 'vid' => 'tags', )); $term->save();mang đến cho tôi lỗi nghiêm trọng: Gọi đến phương thức không xác định Drupal \ taxonomy \ Entity \ Term :: getType
alberto56

15

Tại thời điểm này, bạn nên thêm thuật ngữ theo cách khác một chút (so với câu trả lời này ) Trước hết trong tệp của bạn bắt đầu, bạn nên viết

sử dụng Drupal \ taxonomy \ Entity \ Term;

Bởi vì lớp Thuật ngữ được liệt kê trong Drupal \ taxonomy \ Entity. Và bạn không cần phải vượt qua taxonomy_term parametr để

Thuật ngữ :: tạo

bởi vì chỉ cần một parametr (mảng có giá trị) (bên dưới mã được liệt kê cho phương thức này trong mô đun phân loại)

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

Vì vậy, ví dụ cuối cùng là

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
Một cái gì đó bạn có thể muốn biết. $ hạn sẽ bằng 1 rất có thể vì Entity::save()trả về một int. Các hằng số SAVED_NEWhoặc SAVED_UPDATEDtùy thuộc vào hoạt động được thực hiện. Tuy nhiên, nếu bạn đã xóa ->save()và thêm $term->save();, thì bạn sẽ thấy $termthông tin đó được cập nhật với thông tin đã được lưu vào cơ sở dữ liệu. Ví dụ bạn có thể làm bây giờ$tid = $term->tid->value;
General Redneck

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

Các câu trả lời khác sử dụng entity_create(), hoạt động, nhưng không hoàn toàn tốt đẹp.


6

Với entityTypeManager():

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

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

2

Bạn có thể muốn xem làm thế nào devel / devel_generate làm điều này.

Từ 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

Trước khi tạo một thuật ngữ, tốt hơn là kiểm tra xem nó có tồn tại không, đây là mã:

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

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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.