diff --git a/modules/book/book.module b/modules/book/book.module index f93d3017878..b8fd87b1020 100644 --- a/modules/book/book.module +++ b/modules/book/book.module @@ -187,18 +187,15 @@ function book_load($node) { return db_fetch_object(db_query('SELECT * FROM {book} WHERE vid = %d', $node->vid)); } -/** - * Implementation of hook_insert(). - */ -function book_insert($node) { - db_query("INSERT INTO {book} (nid, vid, parent, weight) VALUES (%d, %d, %d, %d)", $node->nid, $node->vid, $node->parent, $node->weight); +function book_form_alter($form_id, &$form) { + if ($form_id == 'node_delete_confirm') { + $form['#submit']['book_node_delete_confirm_submit'] = array(); + } } -/** - * Implementation of hook_update(). - */ -function book_update($node) { - if ($node->revision) { +function book_node_submit($form_id, $node) { + $node = (object)$node; + if ($node->is_new || $node->revision) { db_query("INSERT INTO {book} (nid, vid, parent, weight) VALUES (%d, %d, %d, %d)", $node->nid, $node->vid, $node->parent, $node->weight); } else { @@ -206,30 +203,16 @@ function book_update($node) { } } -/** - * Implementation of hook_delete(). - */ -function book_delete(&$node) { - db_query('DELETE FROM {book} WHERE nid = %d', $node->nid); -} - -/** - * Implementation of hook_submit(). - */ -function book_submit(&$node) { - global $user; - // Set default values for non-administrators. - if (!user_access('administer nodes')) { - $node->revision = 1; - $book->uid = $user->uid; - $book->name = $user->uid ? $user->name : ''; - } +function book_node_delete_confirm_submit($form_id, $form_values) { + db_query('DELETE FROM {book} WHERE nid = %d OR parent = %d', $form_values['node']->nid, $form_values['node']->nid); } /** * Implementation of hook_form(). */ function book_form(&$node) { + global $user; + $type = node_get_types('type', $node); if ($node->nid && !$node->parent && !user_access('create new books')) { $form['parent'] = array('#type' => 'value', '#value' => $node->parent); @@ -265,22 +248,23 @@ function book_form(&$node) { '#description' => t('An explanation of the additions or updates being made to help other authors understand your motivations.'), ); - if (user_access('administer nodes')) { - $form['weight'] = array('#type' => 'weight', - '#title' => t('Weight'), - '#default_value' => $node->weight, - '#delta' => 15, - '#weight' => 5, - '#description' => t('Pages at a given level are ordered first by weight and then by title.'), - ); - } - else { + $form['weight'] = array('#type' => 'weight', + '#title' => t('Weight'), + '#access' => user_access('administer nodes'), + '#default_value' => $node->weight, + '#delta' => 15, + '#weight' => 5, + '#description' => t('Pages at a given level are ordered first by weight and then by title.'), + ); + + if (!user_access('administer nodes')) { // If a regular user updates a book page, we preserve the node weight; otherwise // we use 0 as the default for new pages $form['weight'] = array( '#type' => 'value', '#value' => isset($node->weight) ? $node->weight : 0, ); + $form['name'] = array('#type' => 'value', '#value' => $user->uid ? $user->name : ''); } return $form; @@ -481,9 +465,6 @@ function book_nodeapi(&$node, $op, $teaser, $page) { case 'delete revision': db_query('DELETE FROM {book} WHERE vid = %d', $node->vid); break; - case 'delete': - db_query('DELETE FROM {book} WHERE nid = %d', $node->nid); - break; } } diff --git a/modules/comment/comment.module b/modules/comment/comment.module index 80802d8d955..06aaeec89f0 100644 --- a/modules/comment/comment.module +++ b/modules/comment/comment.module @@ -280,6 +280,7 @@ function comment_form_alter($form_id, &$form) { } elseif (isset($form['type'])) { if ($form['type']['#value'] .'_node_form' == $form_id) { + $form['#submit']['comment_node_submit'] = array(); $node = $form['#node']; $form['comment_settings'] = array( '#type' => 'fieldset', @@ -297,6 +298,10 @@ function comment_form_alter($form_id, &$form) { ); } } + + if ($form_id == 'node_delete_confirm') { + $form['#submit']['comment_node_delete_confirm_submit'] = array(); + } } /** @@ -315,15 +320,6 @@ function comment_nodeapi(&$node, $op, $arg = 0) { } break; - case 'insert': - db_query('INSERT INTO {node_comment_statistics} (nid, last_comment_timestamp, last_comment_name, last_comment_uid, comment_count) VALUES (%d, %d, NULL, %d, 0)', $node->nid, $node->created, $node->uid); - break; - - case 'delete': - db_query('DELETE FROM {comments} WHERE nid = %d', $node->nid); - db_query('DELETE FROM {node_comment_statistics} WHERE nid = %d', $node->nid); - break; - case 'update index': $text = ''; $comments = db_query('SELECT subject, comment, format FROM {comments} WHERE nid = %d AND status = %d', $node->nid, COMMENT_PUBLISHED); @@ -346,6 +342,17 @@ function comment_nodeapi(&$node, $op, $arg = 0) { } } +function comment_node_delete_confirm_submit($form_id, $form_values) { + db_query('DELETE FROM {comments} WHERE nid = %d', $form_values['node']->nid); + db_query('DELETE FROM {node_comment_statistics} WHERE nid = %d', $form_values['node']->nid); +} + +function comment_node_submit($form_id, $node) { + if ($node->is_new) { + db_query('INSERT INTO {node_comment_statistics} (nid, last_comment_timestamp, last_comment_name, last_comment_uid, comment_count) VALUES (%d, %d, NULL, %d, 0)', $node->nid, $node->created, $node->uid); + } +} + /** * Implementation of hook_user(). * diff --git a/modules/forum/forum.module b/modules/forum/forum.module index fdc06eb1720..5ee5fa3dcde 100644 --- a/modules/forum/forum.module +++ b/modules/forum/forum.module @@ -233,6 +233,31 @@ function forum_form_alter($form_id, &$form) { unset($form['nodes']['forum']); } } + + if ($form_id == 'node_delete_confirm' && $form['node']['#value']->type == 'forum') { + $form['#submit']['forum_node_delete_confirm_submit'] = array(); + } +} + +/** + * Check in particular that only a "leaf" term in the associated taxonomy + * vocabulary is selected, not a "container" term. + */ +function forum_node_validate($form_id, $node) { + $node = (object)$node; + if ($node->taxonomy) { + // Extract the node's proper topic ID. + $vocabulary = variable_get('forum_nav_vocabulary', ''); + $containers = variable_get('forum_containers', array()); + foreach ($node->taxonomy as $term) { + if (db_result(db_query('SELECT COUNT(*) FROM {term_data} WHERE tid = %d AND vid = %d', $term, $vocabulary))) { + if (in_array($term, $containers)) { + $term = taxonomy_get_term($term); + form_set_error('taxonomy', t('The item %forum is only a container for forums. Please select one of the forums below it.', array('%forum' => $term->name))); + } + } + } + } } /** @@ -327,16 +352,15 @@ function forum_view(&$node, $teaser = FALSE, $page = FALSE) { } /** - * Implementation of hook_submit(). - * - * Check in particular that only a "leaf" term in the associated taxonomy - * vocabulary is selected, not a "container" term. + * An early submit handler of the forum_node_form. Runs before the node is saved. */ -function forum_submit(&$node) { +function forum_node_submit_early($form_id, &$node) { + $node = (object)$node; + // Make sure all fields are set properly: $node->icon = $node->icon ? $node->icon : ''; - if ($node->taxonomy) { + if (!empty($node->taxonomy)) { // Get the forum terms from the (cached) tree $tree = taxonomy_get_tree(_forum_get_vid()); if ($tree) { @@ -357,35 +381,13 @@ function forum_submit(&$node) { } } } + + $node = (array)$node; } -/** - * Implementation of hook_validate(). - * - * Check in particular that only a "leaf" term in the associated taxonomy - * vocabulary is selected, not a "container" term. - */ -function forum_validate($node) { - if ($node->taxonomy) { - // Extract the node's proper topic ID. - $vocabulary = variable_get('forum_nav_vocabulary', ''); - $containers = variable_get('forum_containers', array()); - foreach ($node->taxonomy as $term) { - if (db_result(db_query('SELECT COUNT(*) FROM {term_data} WHERE tid = %d AND vid = %d', $term, $vocabulary))) { - if (in_array($term, $containers)) { - $term = taxonomy_get_term($term); - form_set_error('taxonomy', t('The item %forum is only a container for forums. Please select one of the forums below it.', array('%forum' => $term->name))); - } - } - } - } -} - -/** - * Implementation of hook_update(). - */ -function forum_update($node) { - if ($node->revision) { +function forum_node_submit($form_id, $node) { + $node = (object)$node; + if ($node->is_new) { db_query("INSERT INTO {forum} (nid, vid, tid) VALUES (%d, %d, %d)", $node->nid, $node->vid, $node->tid); } else { @@ -424,18 +426,8 @@ function forum_prepare(&$node) { } } -/** - * Implementation of hook_insert(). - */ -function forum_insert($node) { - db_query('INSERT INTO {forum} (nid, vid, tid) VALUES (%d, %d, %d)', $node->nid, $node->vid, $node->tid); -} - -/** - * Implementation of hook_delete(). - */ -function forum_delete(&$node) { - db_query('DELETE FROM {forum} WHERE nid = %d', $node->nid); +function forum_node_delete_confirm_submit($form_id, $form_values) { + db_query('DELETE FROM {forum} WHERE nid = %d', $form_values['node']->nid); } /** diff --git a/modules/menu/menu.module b/modules/menu/menu.module index 936bdbd625b..9bb693e0187 100644 --- a/modules/menu/menu.module +++ b/modules/menu/menu.module @@ -147,31 +147,20 @@ function menu_block($op = 'list', $delta = 0) { } } -/** - * Implementation of hook_nodeapi(). - */ -function menu_nodeapi(&$node, $op) { +function menu_node_delete_confirm_submit($form_id, $form_values) { + menu_node_form_delete($form_values['node']); + menu_rebuild(); +} - if (user_access('administer menu')) { - switch ($op) { - case 'insert': - case 'update': - if ($node->menu['delete']) { - menu_node_form_delete($node); - menu_rebuild(); - } - elseif ($node->menu['title']) { - $node->menu['path'] = ($node->menu['path']) ? $node->menu['path'] : "node/$node->nid"; - menu_edit_item_save($node->menu); - menu_rebuild(); - } - break; - - case 'delete': - menu_node_form_delete($node); - menu_rebuild(); - break; - } +function menu_node_submit($form_id, $node) { + if ($node->menu['delete']) { + menu_node_form_delete($node); + menu_rebuild(); + } + elseif ($node->menu['title']) { + $node->menu['path'] = ($node->menu['path']) ? $node->menu['path'] : "node/$node->nid"; + menu_edit_item_save($node->menu); + menu_rebuild(); } } @@ -199,6 +188,8 @@ function menu_form_alter($form_id, &$form) { } } + $form['#submit']['menu_node_submit'] = array(); + $form['menu'] = array('#type' => 'fieldset', '#title' => t('Menu settings'), '#access' => user_access('administer menu'), @@ -259,6 +250,10 @@ function menu_form_alter($form_id, &$form) { ); } } + + if ($form_id == 'node_delete_confirm') { + $form['#submit']['menu_node_delete_confirm_submit'] = array(); + } } /** diff --git a/modules/node/node.module b/modules/node/node.module index 8d5ad794c18..3364aa3a293 100644 --- a/modules/node/node.module +++ b/modules/node/node.module @@ -3,7 +3,27 @@ /** * @file - * The core that allows content to be submitted to the site. + * The core that allows content to be submitted to the site. Modules and scripts may + * programmatically submit nodes using the usual form API pattern. + + * CREATE/EDIT NODE EXAMPLE + * $type = 'story'; + * $node = array('type' => $type); + * $form = drupal_retrieve_form($type. '_node_form', $node); + * $form['#post']['edit']['nid'] = 112; // send this if performing an edit + * $form['#post']['edit']['name'] = 'amy'; + * $form['#post']['edit']['title'] = 'robotitle'; + * $form['#post']['edit']['body'] = 'hello world'; + * $goto = drupal_process_form($type. '_node_form', $form); + * + * DELETE SINGLE NODE EXAMPLE + * $node = node_load(112); + * $form = drupal_retrieve_form('node_delete_confirm', $node); + * $form['#post']['op'] = t('Delete'); + * $goto = drupal_process_form('node_delete_confirm', $form); + * + * Calling form_get_errors() will list any validation errors that prevented the + * form from being submitted. */ define('NODE_NEW_LIMIT', time() - 30 * 24 * 60 * 60); @@ -601,16 +621,6 @@ function node_save(&$node) { db_query($node_query, $node_table_values); db_query($revisions_query, $revisions_table_values); - // Call the node specific callback (if any): - if ($node->is_new) { - node_invoke($node, 'insert'); - node_invoke_nodeapi($node, 'insert'); - } - else { - node_invoke($node, 'update'); - node_invoke_nodeapi($node, 'update'); - } - // Update the node access table for this node. node_access_acquire_grants($node); @@ -1072,6 +1082,8 @@ function node_menu($may_cache) { 'path' => 'node/add/'. $type_url_str, 'title' => t($name), 'access' => node_access('create', $type->type), + 'callback' => 'drupal_get_form', + 'callback arguments' => array($type->type. '_node_form', array('type' => $type->type)) ); } } @@ -1100,7 +1112,7 @@ function node_menu($may_cache) { 'type' => MENU_LOCAL_TASK); $items[] = array('path' => 'node/'. arg(1) .'/delete', 'title' => t('delete'), 'callback' => 'drupal_get_form', - 'callback arguments' => array('node_delete_confirm'), + 'callback arguments' => array('node_delete_confirm', $node), 'access' => node_access('delete', $node), 'weight' => 1, 'type' => MENU_CALLBACK); @@ -1757,53 +1769,9 @@ function node_feed($nodes = 0, $channel = array()) { } /** - * Prepare node for save and allow modules to make changes. + * A form validate handler. Perform checks on the given node. */ -function node_submit($node) { - global $user; - - // Convert the node to an object, if necessary. - $node = (object)$node; - - // Auto-generate the teaser, but only if it hasn't been set (e.g. by a - // module-provided 'teaser' form item). - if (!isset($node->teaser)) { - $node->teaser = isset($node->body) ? node_teaser($node->body, isset($node->format) ? $node->format : NULL) : ''; - } - - $access = user_access('administer nodes'); - if ($access) { - // Populate the "authored by" field. - if ($account = user_load(array('name' => $node->name))) { - $node->uid = $account->uid; - } - else { - $node->uid = 0; - } - - $node->created = $node->date ? strtotime($node->date) : NULL; - } - // Force defaults in case people modify the form: - $node_options = variable_get('node_options_'. $node->type, array('status', 'promote')); - foreach (array('status', 'promote', 'sticky', 'revision') as $key) { - if (!$access || !isset($node->$key)) { - $node->$key = in_array($key, $node_options); - } - } - - // Do node-type-specific validation checks. - node_invoke($node, 'submit'); - node_invoke_nodeapi($node, 'submit'); - - $node->validated = TRUE; - - return $node; -} - -/** - * Perform validation checks on the given node. - */ -function node_validate($node, $form = array()) { +function node_form_validate($form_id, $node) { // Convert the node to an object, if necessary. $node = (object)$node; $type = node_get_types('type', $node); @@ -1832,14 +1800,6 @@ function node_validate($node, $form = array()) { form_set_error('date', t('You have to specify a valid date.')); } } - - // Do node-type-specific validation checks. - node_invoke($node, 'validate', $form); - node_invoke_nodeapi($node, 'validate', $form); -} - -function node_form_validate($form_id, $form_values, $form) { - node_validate($form_values, $form); } function node_object_prepare(&$node) { @@ -1858,9 +1818,11 @@ function node_object_prepare(&$node) { } /** - * Generate the node editing form array + * Generate the node add/edit form array. */ function node_form($node) { + global $user; + $node = (object)$node; node_object_prepare($node); @@ -1884,14 +1846,13 @@ function node_form($node) { $form['title']['#weight'] = -5; } + // Populate $node so we can assign it to $form['#node]. $node_options = variable_get('node_options_'. $node->type, array('status', 'promote')); // If this is a new node, fill in the default values. if (!isset($node->nid)) { foreach (array('status', 'promote', 'sticky', 'revision') as $key) { $node->$key = in_array($key, $node_options); } - global $user; - $node->uid = $user->uid; } else { // Nodes being edited should always be preset with the default revision setting. @@ -1899,39 +1860,17 @@ function node_form($node) { } $form['#node'] = $node; - // Node author information for administrators - $form['author'] = array( - '#type' => 'fieldset', - '#access' => user_access('administer nodes'), - '#title' => t('Authoring information'), - '#collapsible' => TRUE, - '#collapsed' => TRUE, - '#weight' => 20, - ); - $form['author']['name'] = array('#type' => 'textfield', '#title' => t('Authored by'), '#maxlength' => 60, '#autocomplete_path' => 'user/autocomplete', '#default_value' => $node->name ? $node->name : '', '#weight' => -1, '#description' => t('Leave blank for %anonymous.', array('%anonymous' => variable_get('anonymous', 'Anonymous')))); - $form['author']['date'] = array('#type' => 'textfield', '#title' => t('Authored on'), '#maxlength' => 25, '#description' => t('Format: %time. Leave blank to use the time of form submission.', array('%time' => $node->date))); + // Node author information is editable only by administrators. + $form['author'] = array('#type' => 'fieldset', '#title' => t('Authoring information'), '#access' => user_access('administer nodes'), '#collapsible' => TRUE, '#collapsed' => TRUE, '#weight' => 20); + $form['author']['name'] = array('#type' => 'textfield', '#title' => t('Authored by'), '#maxlength' => 60, '#autocomplete_path' => 'user/autocomplete', '#default_value' => $node->nid ? $node->name : $user->name, '#weight' => -1, '#description' => t('Leave blank for %anonymous.', array('%anonymous' => variable_get('anonymous', 'Anonymous')))); + $form['author']['date'] = array('#type' => 'textfield', '#title' => t('Authored on'), '#maxlength' => 25, '#default_value' => $node->date, '#description' => t('Format: %time. Leave blank to use the time of form submission.', array('%time' => $node->date))); - if (isset($node->nid)) { - $form['author']['date']['#default_value'] = $node->date; - } - - // Node options for administrators - $form['options'] = array( - '#type' => 'fieldset', - '#access' => user_access('administer nodes'), - '#title' => t('Publishing options'), - '#collapsible' => TRUE, - '#collapsed' => TRUE, - '#weight' => 25, - ); + // Node options are editable only by administrators. + $form['options'] = array('#type' => 'fieldset', '#title' => t('Publishing options'), '#access' => user_access('administer nodes'), '#collapsible' => TRUE, '#collapsed' => TRUE, '#weight' => 25); $form['options']['status'] = array('#type' => 'checkbox', '#title' => t('Published'), '#default_value' => $node->status); $form['options']['promote'] = array('#type' => 'checkbox', '#title' => t('Promoted to front page'), '#default_value' => $node->promote); $form['options']['sticky'] = array('#type' => 'checkbox', '#title' => t('Sticky at top of lists'), '#default_value' => $node->sticky); $form['options']['revision'] = array('#type' => 'checkbox', '#title' => t('Create new revision'), '#default_value' => $node->revision); - // These values are used when the user has no administrator accesss. - foreach (array('uid', 'created') as $key) { - $form[$key] = array('#type' => 'value', '#value' => $node->$key); - } // Add the buttons. $form['preview'] = array('#type' => 'button', '#value' => t('Preview'), '#weight' => 40); @@ -1940,6 +1879,15 @@ function node_form($node) { $form['delete'] = array('#type' => 'button', '#value' => t('Delete'), '#weight' => 50); } $form['#after_build'] = array('node_form_add_preview'); + $form['#validate'] = array( + 'node_form_validate' => array(), + $node->type .'_node_validate' => array(), + ); + $form['#submit'] = array( + $node->type .'_node_submit_early' => array(), + 'node_form_submit' => array(), + $node->type .'_node_submit' => array(), + ); $form['#base'] = 'node_form'; return $form; } @@ -2003,40 +1951,30 @@ function theme_node_form($form) { } /** - * Present a node submission form or a set of links to such forms. + * Present set of list of node creation links */ -function node_add($type = NULL) { +function node_add() { global $user; $types = node_get_types(); $type = isset($type) ? str_replace('-', '_', $type) : NULL; - // If a node type has been specified, validate its existence. - if (isset($types[$type]) && node_access('create', $type)) { - // Initialize settings: - $node = array('uid' => $user->uid, 'name' => $user->name, 'type' => $type); - $output = drupal_get_form($type .'_node_form', $node); - drupal_set_title(t('Submit @name', array('@name' => $types[$type]->name))); + foreach ($types as $type) { + if (function_exists($type->module .'_form') && node_access('create', $type->type)) { + $type_url_str = str_replace('_', '-', $type->type); + $title = t('Add a new @s.', array('@s' => $type->name)); + $out = '
?q=
". If unsure, specify nothing.')
+ '#description' => t('This page is displayed when a 403 error occurs. If you are not using clean URLs, specify the part after "?q=
". If unsure, leave blank.'),
);
-
- $form['site_404'] = array(
+ $form['403']['site_403_message_show'] = array(
+ '#type' => 'checkbox',
+ '#title' => t('Enable error message'),
+ '#description' => t('Displays the message below.'),
+ '#default_value' => variable_get('site_403_message_show', TRUE),
+ );
+ $form['403']['site_403_message'] = array(
+ '#type' => 'textarea',
+ '#title' => t('Message'),
+ '#description' => t('This message is shown when a 403 error occurs, if enabled. "%path" will be replaced with the path of the requested document.'),
+ '#default_value' => variable_get('site_403_message', t('We are sorry, the requested page (%path) was not found on this webserver. Either the URL does not exist or the page you were looking has been deleted.')),
+ );
+ $form['404'] = array(
+ '#type' => 'fieldset',
+ '#title' => t('File not found page (404)'),
+ '#description' => t('These settings apply when the requested document could not be found, i.e. a 404 error.'),
+ );
+ $form['404']['site_404'] = array(
'#type' => 'textfield',
- '#title' => t('Default 404 (not found) page'),
+ '#title' => t('Page to display'),
'#default_value' => variable_get('site_404', ''),
- '#description' => t('This page is displayed when no other content matches the requested document. If you are not using clean URLs, specify the part after "?q=
". If unsure, specify nothing.')
+ '#description' => t('This page is displayed when a 404 error occurs. If you are not using clean URLs, specify the part after "?q=
". If unsure, leave blank.'),
);
-
- $form['error_level'] = array(
+ $form['404']['site_404_message_show'] = array(
+ '#type' => 'checkbox',
+ '#title' => t('Enable error message'),
+ '#description' => t('Displays the message below.'),
+ '#default_value' => variable_get('site_404_message_show', TRUE),
+ );
+ $form['404']['site_404_message'] = array(
+ '#type' => 'textarea',
+ '#title' => t('Message'),
+ '#description' => t('This message is shown when a 404 error occurs, if enabled. "%path" will be replaced with the path of the requested document.'),
+ '#default_value' => variable_get('site_404_message', t('We are sorry, %path could not be found. Please check the spelling and punctuation. This website is case sensitive, so also make sure that the address has the correct case.')),
+ );
+ $form['error'] = array(
+ '#type' => 'fieldset',
+ '#title' => t('Other error handling'),
+ );
+ $form['error']['error_level'] = array(
'#type' => 'select', '#title' => t('Error reporting'), '#default_value' => variable_get('error_level', 1),
'#options' => array(t('Write errors to the log'), t('Write errors to the log and to the screen')),
- '#description' => t('Where Drupal, PHP and SQL errors are logged. On a production server it is recommended that errors are only written to the error log. On a test server it can be helpful to write logs to the screen.')
+ '#description' => t('Where Drupal, PHP and SQL errors are logged. On a production server it is recommended that errors are only written to the error log. On a test server it can be helpful to write logs to the screen.'),
);
-
$period = drupal_map_assoc(array(3600, 10800, 21600, 32400, 43200, 86400, 172800, 259200, 604800, 1209600, 2419200), 'format_interval');
$period['1000000000'] = t('Never');
- $form['watchdog_clear'] = array(
+ $form['error']['watchdog_clear'] = array(
'#type' => 'select',
'#title' => t('Discard log entries older than'),
'#default_value' => variable_get('watchdog_clear', 604800),
'#options' => $period,
- '#description' => t('The time log entries should be kept. Older entries will be automatically discarded. Requires crontab.')
+ '#description' => t('The time log entries should be kept. Older entries will be automatically discarded. Requires crontab.'),
);
return system_settings_form($form);
diff --git a/modules/taxonomy/taxonomy.module b/modules/taxonomy/taxonomy.module
index 32d38435bef..317bd063678 100644
--- a/modules/taxonomy/taxonomy.module
+++ b/modules/taxonomy/taxonomy.module
@@ -606,6 +606,10 @@ function taxonomy_get_vocabularies($type = NULL) {
*/
function taxonomy_form_alter($form_id, &$form) {
if (isset($form['type']) && $form['type']['#value'] .'_node_form' == $form_id) {
+ // inject custom validate and submit handlers
+ $form['#validate']['taxonomy_node_validate'] = array();
+ $form['#submit']['taxonomy_node_submit'] = array();
+
$node = $form['#node'];
if (!isset($node->taxonomy)) {
@@ -672,6 +676,10 @@ function taxonomy_form_alter($form_id, &$form) {
$form['taxonomy'] += array('#type' => 'fieldset', '#title' => t('Categories'), '#collapsible' => TRUE, '#collapsed' => FALSE, '#tree' => TRUE, '#weight' => -3);
}
}
+
+ if ($form_id == 'node_delete_confirm') {
+ $form['#submit']['taxonomy_node_delete_confirm_submit'] = array();
+ }
}
/**
@@ -705,9 +713,9 @@ function taxonomy_node_get_terms($nid, $key = 'tid') {
/**
* Make sure incoming vids are free tagging enabled.
*/
-function taxonomy_node_validate(&$node) {
- if ($node->taxonomy) {
- $terms = $node->taxonomy;
+function taxonomy_node_validate($form_id, $node) {
+ if ($node['taxonomy']) {
+ $terms = $node['taxonomy'];
if ($terms['tags']) {
foreach ($terms['tags'] as $vid => $vid_value) {
$vocabulary = taxonomy_get_vocabulary($vid);
@@ -724,14 +732,14 @@ function taxonomy_node_validate(&$node) {
/**
* Save term associations for a given node.
*/
-function taxonomy_node_save($nid, $terms) {
- taxonomy_node_delete($nid);
+function taxonomy_node_submit($form_id, $node) {
+ taxonomy_node_delete($node->nid);
// Free tagging vocabularies do not send their tids in the form,
// so we'll detect them here and process them independently.
- if (isset($terms['tags'])) {
- $typed_input = $terms['tags'];
- unset($terms['tags']);
+ if (isset($node->taxonomy['tags'])) {
+ $typed_input = $node->taxonomy['tags'];
+ unset($node->taxonomy['tags']);
foreach ($typed_input as $vid => $vid_value) {
// This regexp allows the following types of user input:
@@ -767,27 +775,27 @@ function taxonomy_node_save($nid, $terms) {
// Defend against duplicate, different cased tags
if (!isset($inserted[$typed_term_tid])) {
- db_query('INSERT INTO {term_node} (nid, tid) VALUES (%d, %d)', $nid, $typed_term_tid);
+ db_query('INSERT INTO {term_node} (nid, tid) VALUES (%d, %d)', $node->nid, $typed_term_tid);
$inserted[$typed_term_tid] = TRUE;
}
}
}
}
- if (is_array($terms)) {
- foreach ($terms as $term) {
+ if (is_array($node->taxonomy)) {
+ foreach ($node->taxonomy as $term) {
if (is_array($term)) {
foreach ($term as $tid) {
if ($tid) {
- db_query('INSERT INTO {term_node} (nid, tid) VALUES (%d, %d)', $nid, $tid);
+ db_query('INSERT INTO {term_node} (nid, tid) VALUES (%d, %d)', $node->nid, $tid);
}
}
}
else if (is_object($term)) {
- db_query('INSERT INTO {term_node} (nid, tid) VALUES (%d, %d)', $nid, $term->tid);
+ db_query('INSERT INTO {term_node} (nid, tid) VALUES (%d, %d)', $node->nid, $term->tid);
}
else if ($term) {
- db_query('INSERT INTO {term_node} (nid, tid) VALUES (%d, %d)', $nid, $term);
+ db_query('INSERT INTO {term_node} (nid, tid) VALUES (%d, %d)', $node->nid, $term);
}
}
}
@@ -1157,18 +1165,6 @@ function taxonomy_nodeapi($node, $op, $arg = 0) {
case 'load':
$output['taxonomy'] = taxonomy_node_get_terms($node->nid);
return $output;
- case 'insert':
- taxonomy_node_save($node->nid, $node->taxonomy);
- break;
- case 'update':
- taxonomy_node_save($node->nid, $node->taxonomy);
- break;
- case 'delete':
- taxonomy_node_delete($node->nid);
- break;
- case 'validate':
- taxonomy_node_validate($node);
- break;
case 'rss item':
return taxonomy_rss_item($node);
case 'update index':
@@ -1176,6 +1172,10 @@ function taxonomy_nodeapi($node, $op, $arg = 0) {
}
}
+function taxonomy_node_confirm_delete_submit($form_id, $form_values) {
+ taxonomy_node_delete($form_values['node']->nid);
+}
+
/**
* Implementation of hook_nodeapi('update_index').
*/
diff --git a/modules/upload/upload.module b/modules/upload/upload.module
index 9db67c4a30e..481e177dcdc 100644
--- a/modules/upload/upload.module
+++ b/modules/upload/upload.module
@@ -363,7 +363,13 @@ function upload_form_alter($form_id, &$form) {
if (isset($form['type'])) {
$node = $form['#node'];
+
if ($form['type']['#value'] .'_node_form' == $form_id && variable_get("upload_$node->type", TRUE)) {
+ if (user_access('upload files')) {
+ $form['#validate']['upload_node_validate'] = array();
+ $form['#submit']['upload_node_submit'] = array();
+ }
+
drupal_add_js('misc/progress.js');
drupal_add_js('misc/upload.js');
@@ -389,9 +395,14 @@ function upload_form_alter($form_id, &$form) {
$form['#attributes']['enctype'] = 'multipart/form-data';
}
}
+
+ if ($form_id == 'node_delete_confirm') {
+ $form['#submit']['upload_node_delete_confirm_submit'] = array();
+ }
}
-function _upload_validate(&$node) {
+function upload_node_validate($form_id, $node) {
+ $node = (object)$node;
// Accumulator for disk space quotas.
$filesize = 0;
@@ -483,10 +494,6 @@ function upload_nodeapi(&$node, $op, $teaser) {
_upload_prepare($node);
break;
- case 'validate':
- _upload_validate($node);
- break;
-
case 'view':
if (isset($node->files) && user_access('view uploaded files')) {
// Add the attachments list to node body with a heavy
@@ -521,18 +528,6 @@ function upload_nodeapi(&$node, $op, $teaser) {
}
}
break;
-
- case 'insert':
- case 'update':
- if (user_access('upload files')) {
- upload_save($node);
- }
- break;
-
- case 'delete':
- upload_delete($node);
- break;
-
case 'delete revision':
upload_delete_revision($node);
break;
@@ -579,6 +574,12 @@ function upload_fix_preview_urls($elements, &$content) {
}
}
+function upload_node_submit($form_id, $node) {
+ if (user_access('upload files')) {
+ upload_save($node);
+ }
+}
+
/**
* Displays file attachments in table
*/
@@ -730,9 +731,9 @@ function upload_save($node) {
}
}
-function upload_delete($node) {
+function upload_node_delete_confirm_submit($form_id, $form_values) {
$files = array();
- $result = db_query('SELECT * FROM {files} WHERE nid = %d', $node->nid);
+ $result = db_query('SELECT * FROM {files} WHERE nid = %d', $form_values['node']->nid);
while ($file = db_fetch_object($result)) {
$files[$file->fid] = $file;
}
@@ -744,7 +745,7 @@ function upload_delete($node) {
}
// Delete all files associated with the node
- db_query('DELETE FROM {files} WHERE nid = %d', $node->nid);
+ db_query('DELETE FROM {files} WHERE nid = %d', $form_values['node']->nid);
}
function upload_delete_revision($node) {
@@ -884,7 +885,7 @@ function upload_js() {
// Handle new uploads, and merge tmp files into node-files.
_upload_prepare($node);
- _upload_validate($node);
+ upload_node_validate(NULL, $node);
$form = _upload_form($node);
foreach (module_implements('form_alter') as $module) {