Làm cách nào tôi có thể phát hiện khi một nút được thay đổi từ 'Đã xuất bản' thành 'Chưa xuất bản'?


17

Trong hook_node_update () , tôi có thể dễ dàng nói 'trạng thái' của một nút (cho dù nó được xuất bản hay không) sau khi được cập nhật.

Tuy nhiên, có một cách dễ dàng để kiểm tra xem nút cập nhật đã được xuất bản chưa, nhưng bây giờ thì không? (Hoặc ngược lại)?

Tôi nghĩ rằng Quy tắc có thể có một số điều kiện cho 'giá trị nút đã thay đổi' hoặc một cái gì đó dọc theo các dòng đó, nhưng tôi muốn thực hiện việc này theo lập trình.

Tôi đã tìm thấy vấn đề này bởi fago (nhà phát triển Quy tắc) trên drupal.org dường như giải quyết vấn đề này trong Drupal 7, nhưng một lời giải thích hay sẽ được đánh giá cao.

Câu trả lời:


31

Đừng bận tâm. Sau khi đọc qua vấn đề được liên kết ở trên (đặc biệt là nhận xét # 38 ), tôi thấy rằng đối tượng nút $ (thực tế là bất kỳ thực thể nào) lưu trữ bản sao được lưu trong bộ nhớ cache 'gốc' trong $ entity-> gốc.

Vì vậy, tôi muốn phát hiện xem một nút có thay đổi từ 'status = 1' thành 'status = 0' hay không (điều này xảy ra khi nút không được công bố) và đoạn mã sau thực hiện điều này:

<?php
function custom_node_update($node) {
  if ($node->type == 'article') {
    // Act on the unpublishing of an article.
    if ($node->original->status == 1 && $node->status == 0) {
      // Do something here.
    }
    // Act on the publishing of an article.
    if ($node->original->status == 0 && $node->status == 1) {
      // Do something here.
    }
  }
}
?>

3
Tôi đã phải ngừng trả lời các câu hỏi của riêng mình ;-)
ge Muffguy

5
tại sao? Nó vẫn hữu ích với tôi, đáng giá +1 ;-)
uwe

Heh, đây là lần thứ 10 tôi đạt được câu trả lời của riêng mình trong kết quả của Google. Tương lai tôi cảm ơn tôi đã trả lời tôi :)
ge Muffguy

Mã ở trên sẽ không hoạt động nếu bạn đang sử dụng mô đun sửa đổi
Mohammad Anwar

Đối với bản ghi, điều này không thể không hoạt động đối với trạng thái + quy trình làm việc + bản dịch, tôi phải sử dụng$entity->original->getTranslation($lng)->status->value == 0 && $entity->getTranslation($lng)->status->value == 1
Thanh thiếu niên

1

node_save() chứa mã sau đây.

  try {
    // Load the stored entity, if any.
    if (!empty($node->nid) && !isset($node->original)) {
      $node->original = entity_load_unchanged('node', $node->nid);
    }
  }

entity_load_unchanged()tải thực thể (trong trường hợp này là nút) từ cơ sở dữ liệu; nó trả về đối tượng thực thể trước bất kỳ thay đổi nào được thực hiện từ các mô-đun đang chạy.

Mã được thực thi trước bất kỳ lưu trước và cập nhật hook.

module_invoke_all('node_presave', $node);
module_invoke_all('entity_presave', $node, 'node');

//... 

node_invoke($node, $op);

// Save fields.
$function = "field_attach_$op";
$function('node', $node);

module_invoke_all('node_' . $op, $node);
module_invoke_all('entity_' . $op, $node, 'node');

Trong các hook đó, có thể thấy các thuộc tính nút trước khi có bất kỳ thay đổi nào $node->original, ví dụ như với $node->original->status.

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.