Làm thế nào để tôi lập trình đặt một thuật ngữ phân loại cho một nút?


9

Tôi gặp một số khó khăn khi thiết lập phân loại cho một nút. Hiện tại tôi đang sử dụng mã này.

$node = Node::create(array(
    'type' => 'detailseite',
    'title' => $data[$headlineIndex],
    'langcode' => 'de',
    'uid' => '1',
    'status' => 1,
    'field_headline' => $data[$headlineIndex],
    'field_intro' => $data[$introIndex] . $categories[$data[$categoryIndex]],
    'created' => $data[$dateIndex],
    'field_autor' => $data[$autorIndex],
    'field_teaser_text' => $data[$shortIndex],
    'field_fields' => array(),
));
$node->save();

Mà hoạt động tốt cho đến nay (dưới một hình ảnh của các lĩnh vực "chi tiết").

nhập mô tả hình ảnh ở đây

Mọi thứ được đặt chính xác và tôi có thể tìm thấy các nút mới được tạo trong khu vực quản trị hoạt động chính xác. Bây giờ tôi cần đặt 'field_meldungstyp' là một Tham chiếu thực thể cho phân loại:

nhập mô tả hình ảnh ở đây

trong đó đã có ba mục:

Tôi muốn nhận (các) nút mà tôi đã tạo lập trình để đặt "field_meldungstyp" thành "Artikel" của "Meldungstyp" -Vocellect.

Tôi đã thử thêm:

'field_meldungstyp' => array( 'tid' => 19 ),

trong đó 19 là câu chuyện "Artikel" của từ vựng đã đề cập trước đó. Và đó là nơi tôi bị mắc kẹt. Ngoài ra https: //www.drupal.org/node/2402811 không hoạt động với tôi. Cũng như

$node->field_meldungstyp[$node->language][]['tid'] = 19;

cũng không làm việc.

chỉ cần thêm

$node = Node::create(array(
    ...
    'field_meldungstyp' => 19,
    ...
));

dẫn đến sự cố với lỗi sau:

Drupal \ Core \ Entity \ EntityStorageException: SQLSTATE [HY000]: Lỗi chung: 1366 Giá trị nguyên không chính xác: 'datetime' cho cột 'được tạo' ở hàng 1: INSERT INTO {taxonomy_index} (nid, tid, status, stick) (: db_insert_placeholder_0 ,: db_insert_placeholder_1 ,: db_insert_placeholder_2 ,: db_insert_placeholder_3 ,: db_insert_placeholder_4); Mảng ([: db_insert_placeholder_0] => 343 [: db_insert_placeholder_1] => 19 [: db_insert_placeholder_1] => 19 [: db_insert_placeholder_2] => 1 [: db_insert_placeholder_2] => 1 [: db_insert_placeholder_3] => 0 [: db_insert_placeholder_3] => 0 [: db_insert_placeholder_3] = save () (dòng 770 của core / lib / Drupal / Core / Entity / Sql / SqlContentEntityStorage.php). Drupal \ Core \ Database \ Statement-> exec (Array, Array) (Line: 610) Truy vấn Drupal \ Core \ Database \ Connection-> ('INSERT INTO {taxonomy_index} (nid, tid,

Câu trả lời:


9

Nó cần phải là một mảng lồng nhau.

'field_meldungstyp'  => [
      ['target_id' => 12345]
    ]

Thử cái này:

$node = Node::create(array(
    'type' => 'detailseite',
    'title' => $data[$headlineIndex],
    'langcode' => 'de',
    'uid' => '1',
    'status' => 1,
    'field_headline' => $data[$headlineIndex],
    'field_intro' => $data[$introIndex] . $categories[$data[$categoryIndex]],
    'created' => $data[$dateIndex],
    'field_autor' => $data[$autorIndex],
    'field_teaser_text' => $data[$shortIndex],
    'field_meldungstyp'  => [
      ['target_id' => 12345]
    ]
));
$node->save();

Đó là phần nào bị treo quá với (tôi đã trao đổi 12345để 19phù hợp;))Drupal\Core\Entity\EntityStorageException: SQLSTATE[HY000]: General error: 1366 Incorrect integer value: 'datetime' for column 'created' at row 1: INSERT INTO {taxonomy_index} (nid, tid, status, sticky, created) VALUES (:db_insert_placeholder_0, :db_insert_placeholder_1, :db_insert_placeholder_2, :db_insert_placeholder_3, :db_insert_placeholder_4); Array ( [:db_insert_placeholder_0] => 188 [:db_insert_placeholder_1] => 19 [:db_insert_placeholder_2] => ... in Drupal\Core\Entity\Sql\SqlContentEntityStorage->save()
Eternal Đen

bạn có lỗi với trường "đã tạo" của mình, nó cần phải là dấu thời gian unix. Nếu bạn loại bỏ được tạo ra từ mảng của bạn, lỗi sẽ biến mất. Thử nó.
oknate

12

Trong Drupal 7, các trường tham chiếu phân loại đã tồn tại sử dụng mẫu này ['tid' => NUMBER]. Đây là các trường tham chiếu thực thể. Các EntityReferenceItem có các định nghĩa tài sản: target_identity. Cái trước là số nguyên hoặc chuỗi tùy thuộc vào cài đặt của mục tham chiếu thực thể (về cơ bản là loại thực thể cấu hình / nội dung).

Đây cũng là một câu hỏi tương tự với Cách đặt giá trị cho trường đa giá trị trong drupal 8 theo lập trình

Vì vậy, hãy thử sử dụng mô hình

Là một phần của Entity :: tạo

Node::create([
  'field_meldungstyp' => [['target_id' => 19]]
]);

Sử dụng FieldableEntityInterface :: set

$entity->set('field_meldungstyp', ['target_id' => 19]);

Sử dụng TypedDataInterface :: setValue trên mục trường trực tiếp.

$entity->field_meldungstyp->setValue(['target_id' => 19]);

Với phương pháp kỳ diệu

$entity->field_meldungstyp->target_id = 19;

Lưu ý rằng điều này ghi đè lên bất kỳ giá trị hiện tại của trường.


Tôi thấy tài liệu Thực thể Nội dung hơi không đầy đủ vì không rõ cách đặt mục trường ngoài phương thức ma thuật giá trị. Đối với các trường cơ sở, đó là một chuỗi hoặc số nguyên, nhưng các mục trường cần bao gồm các giá trị danh sách mục trường đầy đủ?
mradcliffe

Thật không may, vẫn xảy ra lỗi -syntax, không mong đợi '=', mong đợi ']' - đối với tôi khi tôi thêm bất kỳ lỗi nào trước $ node-> save. Ngay cả khi tôi thay đổi toàn bộ thành một thứ như "entity_create ('nút', $ nút)" và loại bỏ Node :: tạo, dòng sẽ dẫn đến sự cố. Có lẽ có điều gì đó không ổn với bản cài đặt Drupal của tôi vì tôi đang thiếu thứ gì đó.
Đen vĩnh cửu

Bạn có thấy lỗi cú pháp trong câu trả lời của tôi không? Sửa lỗi nó. Nó phải là =>không =. :-)
mradcliffe

Tôi đoán tôi thực sự cần nghỉ ngơi; D (làm việc cả ngày rồi), =>vẫn cho tôi syntax error, unexpected '=>' (T_DOUBLE_ARROW).
Đen vĩnh cửu

1
"$ entity-> field_meldungstyp-> value = [['target_id' => 19]];". Điều đó không đúng. Những gì bạn muốn là $ entity-> field_meldungstyp-> target_id = 19. Lưu ý rằng chỉ cung cấp 19 mà không có mảng hoạt động cho set (), setValue () và thậm chí $ node-> field-meldungstyp = 19 sẽ hoạt động với một giá trị duy nhất cánh đồng. Loại trường sẽ cố gắng tự động chuyển đổi nó thành cấu trúc chính xác.
Berdir

4

Đây là cách tôi đã làm cho D8.

use Drupal\node\Entity\Node;

//To create new node
$node = Node::create(['type' => 'YOUR_CONTENT_TYPE_HERE']);

//To load a node by its ID
//$node = \Drupal\node\Entity\Node::load(NODE_ID);

$nodeTerms = [1,2,3...]; // 1,2,3 = terms IDs
$node->set('YOUR_FIELD_OF_TERMS', $nodeTerms);
$node->save();

// Để tạo thuế mới

use Drupal\taxonomy\Entity\Term;

$new_term = Term::create([
    'vid' => "YOUR_VOCABULARY_MACHINE_NAME",
    'name' => "NAME_OF_YOUR_TERM",
]);
$new_term->save();

0

Một cách tiếp cận khác là cập nhật nút sau khi tạo, như thế này:

$node = Node::create(array(
    ...
));
$node->save();
$node->field_meldungstyp->target_id = 19;
$node->save();

Đã thử điều đó quá ban đầu và nó đã sụp đổ. Tôi sẽ thêm đầu ra vào đầu.
Đen vĩnh cửu

okey - vì vậy hãy thử target_id
rémy

Thật không may, kết quả / thông báo lỗi tương tự. :(
Đen vĩnh cửu

Sau đó, tôi sẽ cập nhật trường sau khi tạo (lưu) - cập nhật câu trả lời của tôi. Bạn đã thử mảng lồng nhau với khóa target_id chưa?
rémy

Vâng, đã thử nó, không may là lỗi tương tự như ở đây [link [( drupal.stackexchange.com/questions/217394/iêu )
Eternal Black
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.