[development] &$node in nodeapi

Pierre Rineau pierre.rineau at makina-corpus.com
Mon Oct 4 15:41:12 UTC 2010


Le lundi 04 octobre 2010 à 16:50 +0200, luca capra a écrit :
> Good evening,
> 
> I'm writing a custom module, with a call to hook_nodeapi (on php 5.3, 
> latest drupal 6)
> I update some cck fields, but looking at the saved node page, these 
> fields are empty.
> 
> Seems that after the hook, cck fields lose their values.
> 
> function mymod_nodeapi(&$node, $op, $a3 = NULL, $a4 = NULL){
>      switch($op){
>         case "insert":
>         case "update":
> 
>              my_fill_cck( &$node );
> 
>              // here cck are populated
>              // krumo( $node );
>          break;
>          case "load":
>              // viewing node, cck are empty :(
>              // krumo( $node );
>              return array();
>          break;
>      }
> }
> 
> Any idea is really appreciated.
> Thank in advance.
> 
> Best regards,
> Luca

Spotted syntax error:
 my_fill_cck( &$node );

Forcing reference at call time is deprecated already with PHP 5 (if I
remember well), and using PHP 5.3 could lead the interpreter to ignore
the function call.

The same for the hook(), if your module is for PHP >=5.2, don't write
the & in the function signature, $node is an object therefore it's been
passed by reference anyway, using & in method signature makes it being a
pointer, which means that some module write $node = NULL will change the
pointer value (not the object itself) and it may break the execution
flow after.

Adam was right, use presave to ensure your data is being modified after
the real save. Or you also could ensure your module has a lower weight
than the content module, to ensure content_nodeapi() being called after
your own.

Pierre.




More information about the development mailing list