You are here

function book_helper_admin_edit_submit in Book helper 6

Same name and namespace in other branches
  1. 7 book_helper.admin.inc \book_helper_admin_edit_submit()

Handle submission of the book administrative page form.

This function takes care to save parent menu items before their children. Saving menu items in the incorrect order can break the menu tree.

See also

book_admin_edit()

menu_overview_form_submit()

File

./book_helper.admin.inc, line 166
Administration page for the 'Book helper' module.

Code

function book_helper_admin_edit_submit($form, &$form_state) {

  // Custom code: Allow top-level pages to be removed from books. http://drupal.org/node/283045
  if ($form_state['values']['op'] == t('Revert')) {
    $node = $form['#node'];
    menu_link_delete($node->book['mlid']);
    db_query('DELETE FROM {book} WHERE bid = %d', $node->nid);
    db_query("DELETE FROM {menu_links} WHERE menu_name='book-toc-%d'", $node->nid);
    drupal_set_message(t('The post has been reverted from the book.'));
    $form_state['redirect'] = 'node/' . $node->nid;
    return;
  }

  // Save elements in the same order as defined in post rather than the form.
  // This ensures parents are updated before their children, preventing orphans.
  $order = array_flip(array_keys($form['#post']['table']));
  $form['table'] = array_merge($order, $form['table']);
  foreach (element_children($form['table']) as $key) {
    if ($form['table'][$key]['#item']) {
      $row = $form['table'][$key];
      $values = $form_state['values']['table'][$key];

      /* Over-ridden code: Do not delete.
         // Update menu item if moved.
         if ($row['plid']['#default_value'] != $values['plid'] || $row['weight']['#default_value'] != $values['weight']) {
           $row['#item']['plid'] = $values['plid'];
           $row['#item']['weight'] = $values['weight'];
           menu_link_save($row['#item']);
         }
         */

      // Updated code: Add hidden and collapsed to update menu item if moved.
      if ($row['plid']['#default_value'] != $values['plid'] || $row['weight']['#default_value'] != $values['weight'] || $row['hidden']['#default_value'] != $values['hidden']) {
        $row['#item']['plid'] = $values['plid'];
        $row['#item']['weight'] = $values['weight'];
        $row['#item']['hidden'] = $values['hidden'] ? 0 : 1;

        // Hidden is a special case, the value needs to be reversed.
        menu_link_save($row['#item']);
      }

      // Update the title if changed.
      if ($row['title']['#default_value'] != $values['title'] || $row['node_title']['#default_value'] != $values['node_title']) {
        $node = node_load($values['nid']);

        /* Over-ridden code: Do not delete.
           $node->title = $values['title'];
           $node->book['link_title'] = $values['title'];
           $node->revision = 1;
           */

        // New code: This is where the custom book link title is set.
        $node->title = $values['node_title'];
        $node->book['link_title'] = $values['node_title'];
        $node->book['book_helper_link_title_custom'] = $values['title'];
        $node->book['book_helper_link_title_sync'] = $values['sync'];

        // Modified code: Allow admin to decide if new revisions should be disabled.
        $node->revision = variable_get('book_helper_order_disable_revisions', 1) == 1 ? 0 : 1;
        $node->log = t('Title changed from %original to %current.', array(
          '%original' => $node->title,
          '%current' => $values['title'],
        ));
        node_save($node);
        watchdog('content', 'book: updated %title.', array(
          '%title' => $node->title,
        ), WATCHDOG_NOTICE, l(t('view'), 'node/' . $node->nid));
      }
    }
  }
  drupal_set_message(t('Updated book %title.', array(
    '%title' => $form['#node']->title,
  )));
}