Commit c0cb68ab authored by Dries's avatar Dries

- Patch #319356 by recidive: clean up hook_nodeapi_ fucntion signatures and...

- Patch #319356 by recidive: clean up hook_nodeapi_ fucntion signatures and documentation because of previous node API clean-ups.
parent 7c30a1ba
......@@ -72,7 +72,7 @@ function blog_help($path, $arg) {
/**
* Implementation of hook_form().
*/
function blog_form(&$node) {
function blog_form($node, $form_state) {
global $nid;
$type = node_get_types('type', $node);
......@@ -84,7 +84,7 @@ function blog_form(&$node) {
/**
* Implementation of hook_view().
*/
function blog_view($node, $teaser = FALSE, $page = FALSE) {
function blog_view($node, $teaser, $page) {
if ($page) {
// Breadcrumb navigation.
drupal_set_breadcrumb(array(l(t('Home'), NULL), l(t('Blogs'), 'blog'), l(t("!name's blog", array('!name' => $node->name)), 'blog/' . $node->uid)));
......
......@@ -718,7 +718,7 @@ function book_nodeapi_load($nodes, $types) {
/**
* Implementation of hook_nodeapi_view().
*/
function book_nodeapi_view(&$node, $teaser, $page) {
function book_nodeapi_view($node, $teaser, $page) {
if (!$teaser) {
if (!empty($node->book['bid']) && $node->build_mode == NODE_BUILD_NORMAL) {
$node->content['book_navigation'] = array(
......@@ -737,7 +737,7 @@ function book_nodeapi_view(&$node, $teaser, $page) {
/**
* Implementation of hook_nodeapi_presave().
*/
function book_nodeapi_presave(&$node, $teaser, $page) {
function book_nodeapi_presave($node) {
// Always save a revision for non-administrators.
if (!empty($node->book['bid']) && !user_access('administer nodes')) {
$node->revision = 1;
......@@ -751,7 +751,7 @@ function book_nodeapi_presave(&$node, $teaser, $page) {
/**
* Implementation of hook_nodeapi_insert().
*/
function book_nodeapi_insert(&$node, $teaser, $page) {
function book_nodeapi_insert($node) {
if (!empty($node->book['bid'])) {
if ($node->book['bid'] == 'new') {
// New nodes that are their own book.
......@@ -766,7 +766,7 @@ function book_nodeapi_insert(&$node, $teaser, $page) {
/**
* Implementation of hook_nodeapi_update().
*/
function book_nodeapi_update(&$node, $teaser, $page) {
function book_nodeapi_update($node) {
if (!empty($node->book['bid'])) {
if ($node->book['bid'] == 'new') {
// New nodes that are their own book.
......@@ -781,7 +781,7 @@ function book_nodeapi_update(&$node, $teaser, $page) {
/**
* Implementation of hook_nodeapi_delete().
*/
function book_nodeapi_delete(&$node, $teaser, $page) {
function book_nodeapi_delete($node) {
if (!empty($node->book['bid'])) {
if ($node->nid == $node->book['bid']) {
// Handle deletion of a top-level post.
......@@ -804,7 +804,7 @@ function book_nodeapi_delete(&$node, $teaser, $page) {
/**
* Implementation of hook_nodeapi_prepare().
*/
function book_nodeapi_prepare(&$node, $teaser, $page) {
function book_nodeapi_prepare($node) {
// Prepare defaults for the add/edit form.
if (empty($node->book) && (user_access('add content to books') || user_access('administer book outlines'))) {
$node->book = array();
......
......@@ -610,7 +610,7 @@ function comment_nodeapi_load($nodes, $types) {
/**
* Implementation of hook_nodeapi_prepare().
*/
function comment_nodeapi_prepare(&$node, $arg = 0) {
function comment_nodeapi_prepare($node) {
if (!isset($node->comment)) {
$node->comment = variable_get("comment_$node->type", COMMENT_NODE_READ_WRITE);
}
......@@ -619,7 +619,7 @@ function comment_nodeapi_prepare(&$node, $arg = 0) {
/**
* Implementation of hook_nodeapi_insert().
*/
function comment_nodeapi_insert(&$node, $arg = 0) {
function comment_nodeapi_insert($node) {
db_insert('node_comment_statistics')
->fields(array(
'nid' => $node->nid,
......@@ -633,7 +633,7 @@ function comment_nodeapi_insert(&$node, $arg = 0) {
/**
* Implementation of hook_nodeapi_delete().
*/
function comment_nodeapi_delete(&$node, $arg = 0) {
function comment_nodeapi_delete($node) {
db_delete('comment')
->condition('nid', $node->nid)
->execute();
......@@ -645,7 +645,7 @@ function comment_nodeapi_delete(&$node, $arg = 0) {
/**
* Implementation of hook_nodeapi_update_index().
*/
function comment_nodeapi_update_index(&$node, $arg = 0) {
function comment_nodeapi_update_index($node) {
$text = '';
$comments = db_query('SELECT subject, comment, format FROM {comment} WHERE nid = :nid AND status = :status', array(':nid' => $node->nid, ':status' => COMMENT_PUBLISHED));
foreach ($comments as $comment) {
......@@ -657,7 +657,7 @@ function comment_nodeapi_update_index(&$node, $arg = 0) {
/**
* Implementation of hook_nodeapi_search_result().
*/
function comment_nodeapi_search_result(&$node, $arg = 0) {
function comment_nodeapi_search_result($node) {
$comments = db_query('SELECT comment_count FROM {node_comment_statistics} WHERE nid = :nid', array('nid' => $node->nid))->fetchField();
return format_plural($comments, '1 comment', '@count comments');
}
......@@ -665,7 +665,7 @@ function comment_nodeapi_search_result(&$node, $arg = 0) {
/**
* Implementation of hook_nodeapi_rss_item().
*/
function comment_nodeapi_rss_item(&$node, $arg = 0) {
function comment_nodeapi_rss_item($node) {
if ($node->comment != COMMENT_NODE_DISABLED) {
return array(array('key' => 'comments', 'value' => url('node/' . $node->nid, array('fragment' => 'comments', 'absolute' => TRUE))));
}
......
......@@ -183,7 +183,7 @@ function _forum_nodeapi_check_node_type($node, $vocabulary) {
/**
* Implementation of hook_nodeapi_view().
*/
function forum_nodeapi_view(&$node, $teaser, $page) {
function forum_nodeapi_view($node, $teaser, $page) {
$vid = variable_get('forum_nav_vocabulary', '');
$vocabulary = taxonomy_vocabulary_load($vid);
if (_forum_nodeapi_check_node_type($node, $vocabulary)) {
......@@ -221,7 +221,7 @@ function forum_nodeapi_view(&$node, $teaser, $page) {
/**
* Implementation of hook_nodeapi_prepare().
*/
function forum_nodeapi_prepare(&$node, $teaser, $page) {
function forum_nodeapi_prepare($node) {
$vid = variable_get('forum_nav_vocabulary', '');
$vocabulary = taxonomy_vocabulary_load($vid);
if (_forum_nodeapi_check_node_type($node, $vocabulary)) {
......@@ -238,7 +238,7 @@ function forum_nodeapi_prepare(&$node, $teaser, $page) {
*
* Check in particular that only a "leaf" term in the associated taxonomy.
*/
function forum_nodeapi_validate(&$node, $teaser, $page) {
function forum_nodeapi_validate($node, $form) {
$vid = variable_get('forum_nav_vocabulary', '');
$vocabulary = taxonomy_vocabulary_load($vid);
if (_forum_nodeapi_check_node_type($node, $vocabulary)) {
......@@ -264,7 +264,7 @@ function forum_nodeapi_validate(&$node, $teaser, $page) {
*
* Assign forum taxonomy when adding a topic from within a forum.
*/
function forum_nodeapi_presave(&$node, $teaser, $page) {
function forum_nodeapi_presave($node) {
$vid = variable_get('forum_nav_vocabulary', '');
$vocabulary = taxonomy_vocabulary_load($vid);
if (_forum_nodeapi_check_node_type($node, $vocabulary)) {
......@@ -293,7 +293,7 @@ function forum_nodeapi_presave(&$node, $teaser, $page) {
/**
* Implementation of hook_nodeapi_update().
*/
function forum_nodeapi_update(&$node, $teaser, $page) {
function forum_nodeapi_update($node) {
$vid = variable_get('forum_nav_vocabulary', '');
$vocabulary = taxonomy_vocabulary_load($vid);
if (_forum_nodeapi_check_node_type($node, $vocabulary)) {
......@@ -317,7 +317,7 @@ function forum_nodeapi_update(&$node, $teaser, $page) {
/**
* Implementation of hook_nodeapi_insert().
*/
function forum_nodeapi_insert(&$node, $teaser, $page) {
function forum_nodeapi_insert($node) {
$vid = variable_get('forum_nav_vocabulary', '');
$vocabulary = taxonomy_vocabulary_load($vid);
if (_forum_nodeapi_check_node_type($node, $vocabulary)) {
......@@ -330,7 +330,7 @@ function forum_nodeapi_insert(&$node, $teaser, $page) {
/**
* Implementation of hook_nodeapi_delete().
*/
function forum_nodeapi_delete(&$node, $teaser, $page) {
function forum_nodeapi_delete($node) {
$vid = variable_get('forum_nav_vocabulary', '');
$vocabulary = taxonomy_vocabulary_load($vid);
if (_forum_nodeapi_check_node_type($node, $vocabulary)) {
......
......@@ -154,6 +154,70 @@ function hook_node_operations() {
return $operations;
}
/**
* Fiter, substitute or otherwise alter the $node's raw text.
*
* The $node->content array has been rendered, so the node body or
* teaser is filtered and now contains HTML. This hook should only be
* used when text substitution, filtering, or other raw text operations
* are necessary.
*
* @param $node
* The node the action is being performed on.
* @param $teaser
* The $teaser parameter from node_view().
* @param $page
* The $page parameter from node_view().
* @return
* None.
*/
function hook_nodeapi_alter($node, $teaser, $page) {
}
/**
* Act on node deletion.
*
* @param $node
* The node that is being deleted.
* @return
* None.
*/
function hook_nodeapi_delete($node) {
db_query('DELETE FROM {mytable} WHERE nid = %d', $node->nid);
}
/**
* A revision of the node is deleted.
*
* You can delete data associated with that revision.
*
* @param $node
* The node the action is being performed on.
* @return
* None.
*/
function hook_nodeapi_delete_revision($node) {
db_delete('upload')->condition('vid', $node->vid)->execute();
if (!is_array($node->files)) {
return;
}
foreach ($node->files as $file) {
file_delete($file);
}
}
/**
* The node being created (inserted in the database).
*
* @param $node
* The node the action is being performed on.
* @return
* None.
*/
function hook_nodeapi_insert($node) {
db_query("INSERT INTO {mytable} (nid, extra) VALUES (%d, '%s')", $node->nid, $node->extra);
}
/**
* Act on node objects when loaded.
*
......@@ -188,100 +252,163 @@ function hook_nodeapi_load($nodes, $types) {
}
/**
* Act on nodes defined by other modules.
* The node is about to be shown on the add/edit form.
*
* 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.
* @param $node
* The node the action is being performed on.
* @return
* None.
*/
function hook_nodeapi_prepare($node) {
if (!isset($node->comment)) {
$node->comment = variable_get("comment_$node->type", COMMENT_NODE_READ_WRITE);
}
}
/**
* The node is being cloned for translation.
*
* 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.
* This hook can be used to load additional data or copy values from
* $node->translation_source.
*
* @param &$node
* @param $node
* The node the action is being performed on.
* @param $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.
* @param $a3
* - For "view", passes in the $teaser parameter from node_view().
* - For "validate", passes in the $form parameter from node_validate().
* @param $a4
* - For "view", passes in the $page parameter from node_view().
* @return
* 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.
*
* 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().
* None.
*/
function hook_nodeapi(&$node, $op, $a3 = NULL, $a4 = NULL) {
switch ($op) {
case 'presave':
if ($node->nid && $node->moderate) {
// Reset votes when node is updated:
$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;
function hook_nodeapi_prepare_translation($node) {
}
/**
* An RSS feed is being generated.
*
* The module can return properties to be added to the RSS item generated for
* this node. See comment_nodeapi_rss_item() and upload_nodeapi_rss_item() for
* examples. The $node passed can also be modified to add or remove contents to
* the feed item.
*
* @param $node
* The node the action is being performed on.
* @return
* Extra information to be added to the RSS item.
*/
function hook_nodeapi_rss_item($node) {
if ($node->comment != COMMENT_NODE_DISABLED) {
return array(array('key' => 'comments', 'value' => url('node/' . $node->nid, array('fragment' => 'comments', 'absolute' => TRUE))));
}
else {
return array();
}
}
/**
* The node is being displayed as a search result.
*
* If you want to display extra information with the result, return it.
*
* @param $node
* The node the action is being performed on.
* @return
* Extra information to be displayed with search result.
*/
function hook_nodeapi_search_result($node) {
$comments = db_query('SELECT comment_count FROM {node_comment_statistics} WHERE nid = :nid', array('nid' => $node->nid))->fetchField();
return format_plural($comments, '1 comment', '@count comments');
}
/**
* The node passed validation and is about to be saved.
*
* Modules may make changes to the node before it is saved to the database.
*
* @param $node
* The node the action is being performed on.
* @return
* None.
*/
function hook_nodeapi_presave($node) {
if ($node->nid && $node->moderate) {
// Reset votes when node is updated:
$node->score = 0;
$node->users = '';
$node->votes = 0;
}
}
/**
* The node being updated.
*
* @param $node
* The node the action is being performed on.
* @return
* None.
*/
function hook_nodeapi_update($node) {
db_query("UPDATE {mytable} SET extra = '%s' WHERE nid = %d", $node->extra, $node->nid);
}
/**
* 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.
*
* @param $node
* The node the action is being performed on.
* @return
* Array of additional information to be indexed.
*/
function hook_nodeapi_update_index($node) {
$text = '';
$comments = db_query('SELECT subject, comment, format FROM {comment} WHERE nid = :nid AND status = :status', array(':nid' => $node->nid, ':status' => COMMENT_PUBLISHED));
foreach ($comments as $comment) {
$text .= '<h2>' . check_plain($comment->subject) . '</h2>' . check_markup($comment->comment, $comment->format, FALSE);
}
return $text;
}
/**
* The user has 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().
*
* @param $node
* The node the action is being performed on.
* @param $form
* The $form parameter from node_validate().
* @return
* None.
*/
function hook_nodeapi_validate($node, $form) {
if (isset($node->end) && isset($node->start)) {
if ($node->start > $node->end) {
form_set_error('time', t('An event may not end before it starts.'));
}
}
}
/**
* 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.
*
* @param $node
* The node the action is being performed on.
* @param $teaser
* The $teaser parameter from node_view().
* @param $page
* The $page parameter from node_view().
* @return
* None.
*/
function hook_nodeapi_view($node, $teaser, $page) {
$node->content['my_additional_field'] = array(
'#value' => theme('mymodule_my_additional_field', $additional_field),
'#weight' => 10,
);
}
/**
......
......@@ -120,7 +120,7 @@ function path_set_alias($path = NULL, $alias = NULL, $pid = NULL, $language = ''
/**
* Implementation of hook_nodeapi_validate().
*/
function path_nodeapi_validate(&$node, $arg) {
function path_nodeapi_validate($node, $form) {
if (user_access('create url aliases') || user_access('administer url aliases')) {
if (isset($node->path)) {
$language = isset($node->language) ? $node->language : '';
......@@ -149,7 +149,7 @@ function path_nodeapi_load($nodes, $types) {
/**
* Implementation of hook_nodeapi_insert().
*/
function path_nodeapi_insert(&$node, $arg) {
function path_nodeapi_insert($node) {
if (user_access('create url aliases') || user_access('administer url aliases')) {
$language = isset($node->language) ? $node->language : '';
// Don't try to insert if path is NULL. We may have already set
......@@ -163,7 +163,7 @@ function path_nodeapi_insert(&$node, $arg) {
/**
* Implementation of hook_nodeapi_update().
*/
function path_nodeapi_update(&$node, $arg) {
function path_nodeapi_update($node) {
if (user_access('create url aliases') || user_access('administer url aliases')) {
$language = isset($node->language) ? $node->language : '';
path_set_alias('node/' . $node->nid, isset($node->path) ? $node->path : NULL, isset($node->pid) ? $node->pid : NULL, $language);
......@@ -173,7 +173,7 @@ function path_nodeapi_update(&$node, $arg) {
/**
* Implementation of hook_nodeapi_delete().
*/
function path_nodeapi_delete(&$node, $arg) {
function path_nodeapi_delete($node) {
if (user_access('create url aliases') || user_access('administer url aliases')) {
$language = isset($node->language) ? $node->language : '';
$path = 'node/' . $node->nid;
......
......@@ -425,7 +425,7 @@ function poll_node_form_submit(&$form, &$form_state) {
/**
* Implementation of hook_validate().
*/
function poll_validate($node) {
function poll_validate($node, $form) {
if (isset($node->title)) {
// Check for at least two options and validate amount of votes:
$realchoices = 0;
......
......@@ -638,7 +638,7 @@ function search_touch_node($nid) {
/**
* Implementation of hook_nodeapi_update_index().
*/
function search_nodeapi_update_index(&$node, $teaser = NULL, $page = NULL) {
function search_nodeapi_update_index($node) {
// Transplant links to a node into the target node.
$result = db_query("SELECT caption FROM {search_node_links} WHERE nid = %d", $node->nid);
$output = array();
......@@ -651,7 +651,7 @@ function search_nodeapi_update_index(&$node, $teaser = NULL, $page = NULL) {
/**
* Implementation of hook_nodeapi_update().
*/
function search_nodeapi_update(&$node, $teaser = NULL, $page = NULL) {
function search_nodeapi_update($node) {
// Reindex the node when it is updated. The node is automatically indexed
// when it is added, simply by being added to the node table.
search_touch_node($node->nid);
......
......@@ -325,7 +325,7 @@ function _statistics_format_item($title, $path) {
/**
* Implementation of hook_nodeapi_delete().
*/
function statistics_nodeapi_delete(&$node, $arg = 0) {
function statistics_nodeapi_delete($node) {
// clean up statistics table when node is deleted
db_query('DELETE FROM {node_counter} WHERE nid = %d', $node->nid);
}
......
......@@ -1367,7 +1367,7 @@ function taxonomy_nodeapi_load($nodes) {
/**
* Implementation of hook_nodeapi_insert().
*/
function taxonomy_nodeapi_insert($node, $arg = 0) {
function taxonomy_nodeapi_insert($node) {
if (!empty($node->taxonomy)) {
taxonomy_node_save($node, $node->taxonomy);
}
......@@ -1376,7 +1376,7 @@ function taxonomy_nodeapi_insert($node, $arg = 0) {
/**
* Implementation of hook_nodeapi_update().
*/
function taxonomy_nodeapi_update($node, $arg = 0) {
function taxonomy_nodeapi_update($node) {
if (!empty($node->taxonomy)) {
taxonomy_node_save($node, $node->taxonomy);
}
......@@ -1385,42 +1385,42 @@ function taxonomy_nodeapi_update($node, $arg = 0) {
/**
* Implementation of hook_nodeapi_delete().
*/
function taxonomy_nodeapi_delete($node, $arg = 0) {
function taxonomy_nodeapi_delete($node) {
taxonomy_node_delete($node);
}
/**
* Implementation of hook_nodeapi_delete_revision().
*/
function taxonomy_nodeapi_delete_revision($node, $arg = 0) {
function taxonomy_nodeapi_delete_revision($node) {
taxonomy_node_delete_revision($node);
}
/**
* Implementation of hook_nodeapi_validate().
*/
function taxonomy_nodeapi_validate($node, $arg = 0) {
function taxonomy_nodeapi_validate($node, $form) {
taxonomy_node_validate($node);
}
/**
* Implementation of hook_nodeapi_rss_item().
*/
function taxonomy_nodeapi_rss_item($node, $arg = 0) {
function taxonomy_nodeapi_rss_item($node) {
return taxonomy_rss_item($node);
}
/**
* Implementation of hook_nodeapi_update_index().
*/
function taxonomy_nodeapi_update_index($node, $arg = 0) {
function taxonomy_nodeapi_update_index($node) {
return taxonomy_node_update_index($node);
}
/**
* Implementation of hook_nodeapi('update_index').
*/
function taxonomy_node_update_index(&$node) {
function taxonomy_node_update_index($node) {
$output = array();
foreach ($node->taxonomy as $term) {
$output[] = $term->name;
......