जब एक नोड को 'प्रकाशित' से 'अप्रकाशित' में बदला जाता है, तो मैं कैसे पता लगा सकता हूं?


17

में hook_node_update () , मैं आसानी से एक नोड के 'स्थिति' बता सकते हैं (चाहे वह या प्रकाशित होने के बाद नहीं) के बाद यह अद्यतन किया गया है।

हालांकि, यह देखने के लिए जांच करने का एक आसान तरीका है कि क्या अद्यतन नोड प्रकाशित किया गया था, लेकिन अब नहीं है? (या ठीक इसके विपरीत)?

मुझे लगता है कि नियमों में 'नोड मान बदल गया है' या उन रेखाओं के साथ कुछ स्थिति हो सकती है, लेकिन मैं यह प्रोग्रामेटिक रूप से करना चाहूंगा।

मैं drupal.org पर fago (नियमों के डेवलपर) द्वारा इस मुद्दे को पाया गया जो कि Drupal 7 में इसके साथ काम करता है, लेकिन एक अच्छी व्याख्या की सराहना की जाएगी।

जवाबों:


31

कोई बात नहीं। उपरोक्त लिंक (विशेषकर # 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.
    }
  }
}
?>

3
मुझे मेरे अपने सवालों का जवाब देना बंद हो जाएगा ;-)
जेरलिंग्लुगी

5
क्यों? यह मेरे लिए अभी भी मददगार था, जिसकी कीमत +1 ;-)
uwe

हे, यह लगभग 10 वीं बार है जब मैं Google परिणामों में अपने स्वयं के उत्तर पर उतरा था। भविष्य मुझे जवाब देने के लिए धन्यवाद अतीत :)
geerlingguy

यदि आप संशोधन मॉड्यूल का उपयोग कर रहे हैं तो उपरोक्त कोड काम नहीं करने वाला है
मोहम्मद अनवर

रिकॉर्ड के लिए, यह स्थिति + वर्कफ़्लो + अनुवाद के लिए काम नहीं कर सकता है, मुझे उपयोग करना था$entity->original->getTranslation($lng)->status->value == 0 && $entity->getTranslation($lng)->status->value == 1
किशोर

1

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.