it-swarm-eu.dev

Jak zjistím, kdy se uzel změní z „Zveřejněno“ na „Zveřejněno“?

V hook_node_update () mohu snadno zjistit „stav“ uzlu (ať už je publikován nebo ne) poté, co byl aktualizován.

Existuje však snadný způsob, jak zjistit, zda byl aktualizovaný uzel publikován , ale nyní není? (Nebo naopak)?

Myslím, že pravidla mohou mít nějakou podmínku pro 'hodnota uzlu se změnila' nebo něco v těchto liniích, ale rád bych to provedl programově.

Na drupal.org jsem našel tento problém od fago (vývojář pravidel), který se zdá, že se tím zabývá v Drupal 7), ale pěkné vysvětlení by se ocenilo.

17
geerlingguy

Nevadí. Po přečtení výše uvedeného problému (zejména komentář # 38 ) jsem zjistil, že objekt $ node (vlastně jakákoli entita) ukládá „původní“ kopii v mezipaměti do $ entity-> original.

Chtěl jsem tedy zjistit, zda se uzel změnil z 'status = 1' na 'status = 0' (k tomu dojde, když je uzel nezveřejněn) a následující kód to provede:

<?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() obsahuje následující kód.

  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() načte entitu (v tomto případě uzel) z databáze; vrátí objekt entity před změnami provedenými na spuštěných modulech.

Kód je spuštěn před jakýmkoli uložením a aktualizací.

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

V těchto háčcích je možné vidět vlastnosti uzlu před každou změnou v $node->original, Například pomocí $node->original->status.

1
kiamlaluno