Definition
hook_nodeapi(&$node, $op, $a3 = NULL, $a4 = NULL)
contributions/docs/developer/hooks/core.php, line 1296
Description
Act on nodes defined by other modules.
Despite what its name might make you think, hook_nodeapi() is not
reserved for node modules. On the contrary, it allows modules to react
to actions affecting all kinds of nodes, regardless of whether that
module defined the node.
It is common to find hook_nodeapi() used in conjunction with
hook_form_alter(). Modules use hook_form_alter() to place additional form
elements onto the node edit form, and hook_nodeapi() is used to read and
write those values to and from the database.
If you are writing a node module, do not use this hook to perform
actions on your type of node alone. Instead, use the hooks set aside
for node modules, such as hook_insert() and hook_form(). That said, for
some operations, such as "delete revision" or "rss item" there is no
corresponding hook so even the module defining the node will need to
implement hook_nodeapi().
Parameters
&$node
The node the action is being performed on.
$op
What kind of action is being performed. Possible values:
- "alter": the $node->content array has been rendered, so the node body or
teaser is filtered and now contains HTML. This op should only be used when
text substitution, filtering, or other raw text operations are necessary.
- "delete": The node is being deleted.
- "delete revision": The revision of the node is deleted. You can delete data
associated with that revision.
- "insert": The node is being created (inserted in the database).
- "load": The node is about to be loaded from the database. This hook
can be used to load additional data at this time.
- "prepare": The node is about to be shown on the add/edit form.
- "prepare translation": The node is being cloned for translation. Load
additional data or copy values from $node->translation_source.
- "print": Prepare a node view for printing. Used for printer-friendly
view in book_module
- "rss item": An RSS feed is generated. The module can return properties
to be added to the RSS item generated for this node. See comment_nodeapi()
and upload_nodeapi() for examples. The $node passed can also be modified
to add or remove contents to the feed item.
- "search result": The node is displayed as a search result. If you
want to display extra information with the result, return it.
- "presave": The node passed validation and is about to be saved. Modules may
use this to make changes to the node before it is saved to the database.
- "update": The node is being updated.
- "update index": The node is being indexed. If you want additional
information to be indexed which is not already visible through
nodeapi "view", then you should return it here.
- "validate": The user has just finished editing the node and is
trying to preview or submit it. This hook can be used to check
the node data. Errors should be set with form_set_error().
- "view": The node content is being assembled before rendering. The module
may add elements $node->content prior to rendering. This hook will be
called after hook_view(). The format of $node->content is the same as
used by Forms API.
$a3
- For "view", passes in the $teaser parameter from node_view().
- For "validate", passes in the $form parameter from node_validate().
$a4
- For "view", passes in the $page parameter from node_view().
Return value
This varies depending on the operation.
- The "presave", "insert", "update", "delete", "print" and "view"
operations have no return value.
- The "load" operation should return an array containing pairs
of fields => values to be merged into the node object.
Related topics
Name | Description |
| Hooks | Allow modules to interact with the Drupal core. |
Code
function hook_nodeapi(&$node, $op, $a3 = NULL, $a4 = NULL) {
switch ($op) {
case 'presave':
if ($node->nid && $node->moderate) {
$node->score = 0;
$node->users = '';
$node->votes = 0;
}
break;
case 'insert':
case 'update':
if ($node->moderate && user_access('access submission queue')) {
drupal_set_message(t('The post is queued for approval'));
}
elseif ($node->moderate) {
drupal_set_message(t('The post is queued for approval. The editors will decide whether it should be published.'));
}
break;
case 'view':
$node->content['my_additional_field'] = array(
'#value' => theme('mymodule_my_additional_field', $additional_field),
'#weight' => 10,
);
break;
}
}