Điểm:1

Phương thức getTitle() trả về một giá trị không mong muốn. Điều gì gây ra điều này?

lá cờ kz

Trong một triển khai của hook_node_insert(), tôi có ba dòng mã sau:

dpm($thực thể, 'thực thể');
$title = $entity->getTitle();
dpm($title, 'title');

Từ đầu tiên dpm() Tôi có:

thực thể =>
Drupal\node\Entity\Node {#1632 â¼
  +in_preview: null
  #values: mảng:27 [â¼
    ...
    "tiêu đề" => mảng:1 [â¼
       "x-default" => mảng:1 [â¼
        0 => mảng:1 [â¼
          "giá trị" => "Tiêu đề dự kiến"
        ]
     ]
...

I E. đầu ra trường tiêu đề bởi trình kết xuất biến là trường tiêu đề mà tôi muốn thấy.

Thư hai dpm() sản xuất:

tiêu đề =>
"Tiêu đề trước"

I E. khi tôi trích xuất tiêu đề từ thực thể, sử dụng getTitle() phương pháp, tôi nhận được một khác biệt giá trị. Giá trị là từ một thực thể (nút) mà tôi tải trong bộ điều khiển liên kết hoạt động (ghi đè Cơ sở điều khiển), nhưng nó không được lưu bên trong bộ điều khiển và sẽ không kích hoạt hook_node_insert().

Tôi xây dựng và lưu một nút mới trong bộ điều khiển, sử dụng mã này:

$node = \Drupal::entityTypeManager()->getStorage('node')->create([
  'type' => 'my_type',
  'cơ thể' => 'Cơ thể',
]);
$node->setTitle('Tiêu đề dự kiến');
$node->save();

Tôi cho rằng đây là $node->save();lửa đó hook_node_insert.

Chuyện gì đang xảy ra ở đây?

Tại sao tiêu đề không có thật xuất hiện trong hook và làm cách nào để tôi nhận được kết quả như mong đợi?

Đối với bản ghi: Tôi không thay đổi nút trong hook_node_insert. Tôi sẽ xóa nó nếu tiêu đề đáp ứng các tiêu chí nhất định. Tôi không thể sử dụng một ràng buộc để ngăn nó được tạo vì những lý do không liên quan đến câu hỏi này.

4uk4 avatar
lá cờ cn
Điều này không dễ thực hiện vì nhiều lý do. Mảng giá trị được bảo vệ trong một thực thể nội dung không được mã tùy chỉnh đọc. Nó luôn chứa các giá trị gốc, x-default là hằng số cho ngôn ngữ mặc định. Vì vậy, việc getTitle() trả về một kết quả khác là điều bình thường. dpm() không phải là công cụ sửa lỗi thời gian thực. Nó đặt đầu ra trong một phiên mà đôi khi được hiển thị một hoặc hai yêu cầu sau đó, tùy thuộc vào thời điểm khối thông báo được hiển thị vào lần tiếp theo. Hãy thử Xdebug. Hơn nữa, hook_node_insert() đã quá muộn để thay đổi nút, hãy sử dụng hook lưu trước.
Free Radical avatar
lá cờ kz
@ 4uk4 Tôi nghĩ rằng các phương thức do lớp cung cấp để nhận các giá trị được bảo vệ phải trả về giá trị thực của trường. Tôi ngạc nhiên khi biết rằng điều này không phải lúc nào cũng đúng. Cảm ơn đã thúc đẩy tôi theo hướng Xdebug
Điểm:1
lá cờ cn

Trong một thực thể nội dung được bảo vệ giá trị $ mảng chứa các giá trị ban đầu của thực thể. Các giá trị trường thực tế được lưu trữ trong mảng được bảo vệ trường $, chứa một mảng các đối tượng FieldItemList. Chúng được xây dựng một cách lười biếng, vì vậy khi nút được tải, mảng này trống. Khi bạn lấy/đặt các trường thông qua các thuộc tính và phương thức thực thể công khai, các đối tượng trường có dữ liệu thực tế sẽ được tạo và lưu trữ trong mảng nội bộ này.

Đối với mục đích gỡ lỗi, bạn có thể buộc trường $ mảng được điền đầy đủ bởi

$values ​​= $node->toArray();

Điều này trả về các giá trị thực thể bằng cách tạo tất cả các đối tượng trường và xây dựng một mảng các giá trị trường thực tế.

Để kiểm tra các thuộc tính của đối tượng, không sử dụng dpm() vì bạn không biết liệu kết quả được hiển thị có phải từ cùng một yêu cầu hay không.

leymannx avatar
lá cờ ne
Sẽ thêm thông tin trên hook và Xdebug. Nhận xét của bạn là vàng.
Free Radical avatar
lá cờ kz
Cảm ơn bạn vì câu trả lời rất hữu ích về cách sử dụng các phương thức thực thể công khai để truy cập các trường được bảo vệ hoạt động ở hậu trường.

Đă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.