it-swarm.asia

كيف يمكنني اكتشاف وقت تغيير العقدة من "منشورة" إلى "غير منشورة"؟

في hook_node_update () ، يمكنني بسهولة معرفة "حالة" العقدة (سواء تم نشرها أم لا) بعد تحديثها.

ومع ذلك ، هل هناك طريقة سهلة للتحقق لمعرفة ما إذا كانت العقدة المحدثة قد تم نشرها ، ولكن لم يتم نشرها الآن؟ (أو العكس)؟

أعتقد أن القواعد قد يكون لها بعض الشروط لـ "تغيرت قيمة العقدة" أو شيء من هذا القبيل ، لكني أرغب في القيام بذلك برمجيًا.

لقد وجدت هذه المشكلة من قِبل fago (مطور القواعد) على موقع drupal.org والذي يبدو أنه يتعامل مع هذا في Drupal 7 ، ولكننا نقدر شرحًا لطيفًا.

16
geerlingguy

لا يهم. بعد قراءة المشكلة المرتبطة أعلاه (لا سيما التعليق # 38 ) ، وجدت أن كائن العقدة $ (أي كيان ، في الواقع) يخزن النسخة المخبأة "الأصلية" في $ الكيان -> الأصلي.

لذلك ، أردت اكتشاف ما إذا كانت العقدة قد تغيرت من "الحالة = 1" إلى "الحالة = 0" (يحدث هذا عندما تكون العقدة غير منشورة) ، والشفرة التالية تفعل ذلك:

<?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() تحتوي على الكود التالي.

  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() تحميل الكيان (في هذه الحالة العقدة) من قاعدة البيانات ؛ تقوم بإرجاع كائن الكيان قبل أي تغييرات تم إجراؤها من الوحدات النمطية قيد التشغيل.

يتم تنفيذ الكود قبل أي حفظ مسبق وتحديث الخطافات.

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');

في تلك الخطافات ، من الممكن رؤية خصائص العقدة قبل أي تغيير في $node->original ، على سبيل المثال مع $node->original->status.

1
kiamlaluno