في hook_node_update () ، يمكنني بسهولة معرفة "حالة" العقدة (سواء تم نشرها أم لا) بعد تحديثها.
ومع ذلك ، هل هناك طريقة سهلة للتحقق لمعرفة ما إذا كانت العقدة المحدثة قد تم نشرها ، ولكن لم يتم نشرها الآن؟ (أو العكس)؟
أعتقد أن القواعد قد يكون لها بعض الشروط لـ "تغيرت قيمة العقدة" أو شيء من هذا القبيل ، لكني أرغب في القيام بذلك برمجيًا.
لقد وجدت هذه المشكلة من قِبل fago (مطور القواعد) على موقع drupal.org والذي يبدو أنه يتعامل مع هذا في Drupal 7 ، ولكننا نقدر شرحًا لطيفًا.
لا يهم. بعد قراءة المشكلة المرتبطة أعلاه (لا سيما التعليق # 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.
}
}
}
?>
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
.