Điểm:2

Không hook_update để thêm một trường mới vào một thực thể sử dụng định nghĩa trường từ lớp thực thể?

lá cờ hk

Tôi đang viết một hook cập nhật để thêm một trường mới vào một thực thể tùy chỉnh và đang làm theo mẫu được hiển thị ở đây

https://www.drupal.org/node/2554097

/**
 * Thêm trường 'revision_translation_affected' vào các thực thể 'nút'.
 */
hàm node_update_8001() {
  // Cài đặt định nghĩa mà trường này có trong
  // \Drupal\node\Entity\Node::baseFieldDefinitions()
  // tại thời điểm chức năng cập nhật này được viết. Nếu/khi mã là
  // triển khai thay đổi định nghĩa đó, mô-đun tương ứng phải
  // thực hiện một chức năng cập nhật gọi
  // \Drupal::entityDefinitionUpdateManager()->updateFieldStorageDefinition()
  // với định nghĩa mới.
  $storage_definition = BaseFieldDefinition::create('boolean')
      ->setLabel(t('Bản dịch sửa đổi bị ảnh hưởng'))
      ->setDescription(t('Cho biết bản chỉnh sửa cuối cùng của bản dịch có thuộc bản sửa đổi hiện tại hay không.'))
      ->setReadOnly(TRUE)
      ->đặtCó thể xem lại(TRUE)
      -> setTranslatable(TRUE);

  \Drupal::entityDefinitionUpdateManager()
    ->installFieldStorageDefinition('revision_translation_affected', 'node', 'node', $storage_definition);
}

Tôi cảm thấy mình đang sao chép BaseFieldDefinition trong cả lớp thực thể tùy chỉnh cũng như trong tệp cài đặt. Tôi không thể sử dụng chức năng tĩnh

hàm tĩnh công khai baseFieldDefinitions(EntityTypeInterface $entity_type) 

từ lớp thực thể để tải định nghĩa trường và cài đặt nó?

No Sssweat avatar
lá cờ ua
Đối với các mục đích lịch sử, tôi nghĩ rằng tốt nhất là không nên làm vậy.
4uk4 avatar
lá cờ cn
Vâng, lịch sử theo nghĩa sửa đổi mã. Bản cập nhật mã có thể chứa nhiều thay đổi cùng một lúc trong khi móc cập nhật cần xử lý các thay đổi từng bước.
lá cờ hk
Cảm ơn. Hiểu rồi.
Điểm:3
lá cờ us

Sử dụng đối tượng được trả về bởi Drupal::entityDefinitionUpdateManager() là cách phù hợp để cập nhật các trường thực thể, vì lý do tương tự hook_update_N() thực hiện sẽ không gọi bất kỳ hook_schema() thực hiện để cập nhật một trường cơ sở dữ liệu.

Hãy tưởng tượng rằng sau đó bạn thay đổi thực thể và đổi tên trường đó từ bản sửa đổi_bản dịch_bị ảnh hưởng đến dịch_bị ảnh hưởng. Nếu móc cập nhật bạn đã viết bây giờ sử dụng mảng được trả về từ cơ sởFieldDefinitions() và lưu trữ nó trong trường $, nó sẽ không tìm thấy bất kỳ giá trị nào cho các trường['revision_translation_affected'], từ cơ sởFieldDefinitions() đã được cập nhật để trả lại trường đã đổi tên.

Việc triển khai hook cập nhật phải hoạt động độc lập với hook cập nhật cuối cùng được thêm vào hay không.
Hơn nữa, mã được sử dụng từ hook cập nhật không thể thay đổi sau khi hook đó đã được thêm vào. Nếu móc cập nhật tạo trường thực thể mà sau này bị xóa (ví dụ), thì phải thêm móc cập nhật mới để xóa trường thực thể đó; không thể thay đổi hook cập nhật hiện tại để không thêm trường thực thể đó nữa hoặc các trang web đã chạy hook cập nhật đó sẽ không thấy trường thực thể bị xóa. (Drupal chỉ chạy móc cập nhật một lần.)

lá cờ hk
Cảm ơn lời giải thích chi tiết @apaderno. Điều đó hoàn toàn có ý nghĩa.

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.