Waarde voor een node veld opslaan zonder een extra revisie aan te maken of de node op te slaan

Ingediend door Donny op za, 10/01/2015 - 09:30

Wanneer men nodes gaat bewerken via custom of contrib Drupal modules maakt men in veel gevallen gebruik van node_save().  Dit kan bijvoorbeeld zijn na het opslaan van een formulier of na het indienen van nodes.

Voorbeeld van hoe node_save() veel wordt toegepast. (Na het indienen van een nieuwe node van het type 'news' verzet men de status naar 0)

<?php 
    
function myModule_node_insert ( $node ) { 
  switch ( $node -> type ) { 
      case 'news' : 
        $node -> status = 0 ; 
        node_save ( $node ); 
      break 
  } 

?>

Het voordeel hiervan is dat alle modules opnieuw kunnen inhaken tijdens het node_save() gebeuren, wannneer je echter werkt met revisies zal er ook nu een nieuwe revisie voorzien worden wat misschien niet de bedoeling was.

Voor dit te voorkomen kan je gebruik maken van de functie field_attach_update(). Via deze functie kan je veldwaardes voor een entity opslaan.

Zie aangepaste code van het eerste voorbeeld:

<?php 
    
function myModule_node_insert ( $node ) { 
  switch ( $node -> type ) { 
      case 'news' : 
        $node -> status = 0 ; 
        field_attach_update ( 'node' , $node ); 
      break 
  } 

?>

Met deze aanpassing zal dus ook de status verzet worden maar zonder een nieuwe revisie aan te maken.

Toen ik recent bezig was op een project waar verschillende rules waren voorzien om e-mails te versturen bij het aanmaken van nieuwe nodes en andere bij het updaten van nodes bleek dit plots niet meer te werken. Bij het toevoegen van nieuwe nodes werd telkens ook de update rule getriggerd. Bleek dus dat er na het opslaan van de node onmiddellijk een extra revisie aanwezig was.

Na de recente wijzigingen van code in het project te doorlopen zag ik dat er gebruik gemaakt werd van node_save() om een veld op de achtergrond in te vullen. Na het toepassen van field_attach_update() was het probleem van de baan.

Labels