it-swarm-vi.com

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'?

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 Nice sẽ được đánh giá cao.

16
geerlingguy

Đừ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ế, thực tế) 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.
    }
  }
}
?>
31
geerlingguy

node_save() chứa đoạn mã sau.

  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 bất kỳ thay đổi nào trong $node->original, Ví dụ với $node->original->status.

1
kiamlaluno