You are here

book_made_simple.module in Book made simple 6.3

Same filename and directory in other branches
  1. 7.3 book_made_simple.module

File

book_made_simple.module
View source
<?php

// Author: M. Morin

/**
* Implementation of hook_help().
*/
function book_made_simple_help($path, $arg) {
  switch ($path) {
    case 'admin/settings/book_made_simple':
      $output = t('On this page you can define context-types allowed as children of book and those that will be automatically created as main book pages.<br/>You can also define child pages by content-type in !content-type-settings in the BookMadeSimple section', array(
        '!content-type-settings' => l(t('content type settings'), 'admin/content/types/list'),
      ));
      return $output;
      break;
  }
}
function book_made_simple_init() {
  if (!variable_get('book_made_simple_admin_use_css', false)) {
    drupal_add_css(drupal_get_path('module', 'book_made_simple') . '/book_made_simple.css');
  }
}
function book_made_simple_perm() {
  return array(
    'show book reorder tab',
    'show core Outline tab',
    'show core Outline form element',
    'administer books',
  );
}

/**
* Implementation of hook_menu().
*/
function book_made_simple_menu() {
  $items = array();
  $items['admin/settings/book_made_simple'] = array(
    'title' => t('BookMadeSimple settings'),
    'page callback' => 'drupal_get_form',
    'page arguments' => array(
      'book_made_simple_settings_form',
    ),
    'access arguments' => array(
      'administer site configuration',
    ),
    'description' => t('BookMadeSimple module settings.'),
    'type' => MENU_NORMAL_ITEM,
  );
  $items['node/%node/reorder'] = array(
    'title' => t('Reorder the book'),
    'page callback' => 'book_made_simple_reorder',
    'page arguments' => array(
      1,
    ),
    'access callback' => 'is_reorder_access',
    'access arguments' => array(
      1,
    ),
    'type' => MENU_LOCAL_TASK,
    'weight' => 2,
  );
  $items['node/%node/outline'] = array(
    'title' => 'Outline',
    'page callback' => 'book_outline',
    'page arguments' => array(
      1,
    ),
    'access callback' => 'is_outline_access',
    'access arguments' => array(
      1,
    ),
    'type' => MENU_LOCAL_TASK,
    'weight' => 10,
    'file' => 'book.pages.inc',
    'file path' => drupal_get_path('module', 'book'),
  );
  return $items;
}
function is_outline_access($node = NULL) {
  if (user_access('administer books')) {
    return true;
  }
  if (isset($node->nid) && !(user_access('add content to books') || user_access('administer book outlines'))) {
    return false;
  }
  $bookTypes = variable_get('book_made_simple_auto_main_page', array());
  $bookType = array_key_exists($node->type, $bookTypes) ? $bookTypes[$node->type] : null;
  $access = true;
  if (null != $bookType && $bookType != "0" && $node->book['plid'] == 0) {
    $access = false;
  }
  return $access && user_access("show core Outline form element") && book_made_simple_creator_only_access($node);
}

/**
* Return access rights for book
*/
function is_reorder_access($node = NULL) {
  if (user_access('administer books')) {
    return true;
  }
  if (isset($node->book) && $node->book['bid'] > 0) {
    if (!_book_outline_access($node) || !user_access('show book reorder tab') || !book_made_simple_creator_only_access($node)) {
      return false;
    }

    // Cheching permissions according to rules/
    $book = $node->book;
    $linkVisibilty = variable_get('book_made_simple_reorder_link', "0");
    $allowed = true;
    if ($linkVisibilty == "0") {
      $mainBook = $book;
      if ($book['nid'] != $book['bid']) {
        $mainBook = node_load($book['bid'])->book;
      }
      $allowed = count(book_toc($mainBook['bid'], array(), 9999)) > 2;
    }
    return $allowed;
  }
  return false;
}

/**
* Shortcut to reorder book page
*/
function book_made_simple_reorder($node) {
  drupal_goto("admin/content/book/" . $node->book['bid'], "destination=node/" . $node->nid);
}

/**
* Implementation of hook_settings_form).
*/
function book_made_simple_settings_form() {
  $types = node_get_types("names");
  $form['book_made_simple'] = array(
    '#type' => 'fieldset',
    '#attributes' => array(
      'class' => 'allowed-child',
    ),
    '#title' => t('Select node types that can be included in a book'),
    '#collapsible' => TRUE,
    '#collapsed' => FALSE,
    '#description' => t('Check content-type that can be included as child in a book. This selection is overriden by selection in content-type settings.'),
  );
  $form['book_made_simple']['book_made_simple_add_types'] = array(
    '#type' => 'checkboxes',
    '#options' => $types,
    '#multiple' => true,
    '#default_value' => variable_get('book_made_simple_add_types', array()),
  );
  $form['book_made_simple2'] = array(
    '#type' => 'fieldset',
    '#attributes' => array(
      'class' => 'auto-main',
    ),
    '#title' => t('Select node types to auto-create main book page'),
    '#collapsible' => TRUE,
    '#collapsed' => FALSE,
    '#description' => t('Check content-types if you want they will automatically be created as main page of a book.'),
  );
  $form['book_made_simple2']['book_made_simple_auto_main_page'] = array(
    '#type' => 'checkboxes',
    '#options' => $types,
    '#multiple' => true,
    '#default_value' => variable_get('book_made_simple_auto_main_page', array()),
  );
  $form['book_made_simple3'] = array(
    '#type' => 'fieldset',
    '#attributes' => array(
      'class' => 'other-settings',
    ),
    '#title' => t('Other settings'),
    '#collapsible' => TRUE,
    '#collapsed' => FALSE,
  );
  $form['book_made_simple3']['book_made_simple_limit_depth'] = array(
    '#type' => 'textfield',
    '#title' => t('Default limit book depth'),
    '#default_value' => variable_get('book_made_simple_limit_depth', 99),
    '#description' => t('Maximum number of childs for a book'),
    '#maxlength' => 2,
    '#size' => 2,
  );
  $form['book_made_simple3']['book_made_simple_admin_use_css'] = array(
    '#type' => 'checkbox',
    '#title' => t('Disable BMS settings layout'),
    '#default_value' => variable_get('book_made_simple_admin_use_css', false),
    '#description' => t('Check to disable BMS layout (content types as columns).'),
  );
  $form['book_made_simple3']['book_made_simple_hide_default_add_child'] = array(
    '#type' => 'checkbox',
    '#title' => t('Hide default add child link'),
    '#default_value' => variable_get('book_made_simple_hide_default_add_child', true),
    '#description' => t('Check to hide default add child page link.'),
  );
  $form['book_made_simple3']['book_made_simple_child_list_style'] = array(
    '#type' => 'radios',
    '#title' => t('Style of child list'),
    '#options' => array(
      "DDLIST" => t("Dropdown listbox"),
      "LI" => t("Unordered list"),
      "THEME" => t("Themeable function"),
    ),
    '#default_value' => variable_get('book_made_simple_child_list_style', "DDLIST"),
    '#description' => t('Choose the style of the child list.'),
  );
  $form['book_made_simple3']['book_made_simple_child_list_style_position'] = array(
    '#type' => 'select',
    '#title' => t('Child list position in links area'),
    '#options' => array(
      "FIRST" => t("First"),
      "LAST" => t("Last"),
    ),
    '#default_value' => variable_get('book_made_simple_child_list_style_position', "FIRST"),
    '#description' => t('Choose where to print child list in the links area'),
  );
  $form['book_made_simple3']['book_made_simple_reorder_link'] = array(
    '#type' => 'radios',
    '#title' => t('Show reorder tab even if book is empty'),
    '#options' => array(
      "0" => t("No"),
      "1" => t("Yes"),
    ),
    '#default_value' => variable_get('book_made_simple_reorder_link', "0"),
    '#description' => t('Show reorder tab even if book is empty. A book is considered empty when it has less than 2 subpages. In this case, does reordering make sense ?'),
  );
  return system_settings_form($form);
}

/**
* Implementation of hook_form_alter().
*/
function book_made_simple_form_alter(&$form, $form_state, $form_id) {
  if (isset($form['type']) && isset($form['#node']) && $form['type']['#value'] . '_node_form' == $form_id) {
    $node = $form['#node'];
    $type = $form['type']['#value'];

    // Not a book => Nothing to do
    if (!isset($node->book)) {
      return;
    }

    // 1 : Main page book. Verify if not forbidden
    $isMainForbidden = array_key_exists($type, variable_get('book_made_simple_forbid_main_page_creation', array()));
    $isForbidden = $isMainForbidden && $node->book['bid'] == 0;
    if ($isMainForbidden && $user->uid != 1) {

      //$form['book']['bid']['#default_value'] = 0;
      $nid = isset($node->nid) ? $node->nid : 'new';
      unset($form['book']['bid']['#options'][$nid]);
      $form['#node']->nid = isset($form['#node']->nid) ? $form['#node']->nid : '0';
      $form['#node']->book['original_bid'] = $form['#node']->nid;
    }
    if (arg(1) == "add" && !array_key_exists("parent", $_GET)) {
      $isOnlyForBook = array_key_exists($type, variable_get("book_made_simple_only_on_books", array()));
      if ($isOnlyForBook) {
        $form = _book_made_simple_print_error("This type can't be created outside a book", $form['#id']);
        $form_state['process_input'] = FALSE;
        return;
      }
    }

    // 2 : Add child page : Verify if parent allowed or creator only
    if (arg(1) == "add" && array_key_exists("parent", $_GET)) {
      $parent = book_link_load($_GET['parent']);
      if (isset($parent)) {
        $parentNode = node_load($parent['nid']);
        $parentType = $parentNode->type;
        $allowedChilds = variable_get('book_made_simple_for_type_' . $parentType, array());
        if (count($allowedChilds) > 0 && !in_array($type, $allowedChilds)) {
          $form = _book_made_simple_print_error("This type is not allowed as child for type {$parentType}", $form['#id']);
          $form_state['process_input'] = FALSE;
          return;
        }
      }
      if (!book_made_simple_creator_only_access($parentNode)) {
        $form = _book_made_simple_print_error("Only book creator can add child pages", $form['#id']);
        $form_state['process_input'] = FALSE;
        return;
      }
    }

    //3 : show/hide Outline section
    $book = $node->book;
    if (is_outline_access($node)) {
      if (isset($node->nid) && is_reorder_access($node)) {
        $form['book']['reorder'] = array(
          '#type' => 'item',
          '#value' => l(t("Reorder the book"), "admin/content/book/" . $book['bid'], array(
            'query' => array(
              "destination" => "node/" . $node->nid,
            ),
          )),
          '#description' => t("Shortcut to reorder the entire book"),
          '#weight' => 10,
        );
      }
    }
    else {
      $form['book']['#type'] = 'hidden';

      //			$form['book']['bid']['#default_value'] = 0;
    }
    if ($node->status == 0) {
      $form['book']['bid']['#options'][$node->nid] = $node->title;
    }
    return $form;
  }
  switch ($form["#id"]) {
    case "node-type-form":

      // $type . '_node_settings':
      $type = $form["#node_type"]->type;
      $default = array_key_exists($type, variable_get('book_made_simple_auto_main_page', array()));
      $form['book_made_simple'] = array(
        '#type' => 'fieldset',
        '#attributes' => array(
          'class' => 'bms-fieldset',
        ),
        '#title' => t('BookMadeSimple'),
        '#collapsible' => TRUE,
        '#collapsed' => TRUE,
      );
      $form['book_made_simple']['1'] = array(
        '#attributes' => array(
          'class' => 'allowed-child',
        ),
        '#type' => 'fieldset',
        '#title' => t('Select content-types allowed as child.'),
        '#collapsible' => TRUE,
        '#collapsed' => FALSE,
      );
      $types = node_get_types("names");
      $form['book_made_simple']['1']['book_made_simple_for_type'] = array(
        '#type' => 'checkboxes',
        '#options' => $types,
        '#multiple' => true,
        '#default_value' => variable_get('book_made_simple_for_type_' . $type, array()),
      );
      $aa = array();
      unset($types[$type]);
      foreach ($types as $ctype => $name) {
        $a = variable_get('book_made_simple_for_type_' . $ctype, array());
        if (array_search($type, $a) !== FALSE) {
          array_push($aa, $ctype);
        }
      }
      $form['book_made_simple']['2'] = array(
        '#attributes' => array(
          'class' => 'allowed-child',
        ),
        '#title' => t('Select content-types allowed as parent'),
        '#type' => 'fieldset',
        '#collapsible' => TRUE,
        '#collapsed' => FALSE,
      );
      $form['book_made_simple']['2']['book_made_simple_for_book'] = array(
        '#type' => 'checkboxes',
        '#options' => $types,
        '#multiple' => true,
        '#default_value' => $aa,
      );
      $form['book_made_simple']['3'] = array(
        '#attributes' => array(
          'class' => 'bms-other-settings',
        ),
        '#type' => 'fieldset',
        '#collapsible' => TRUE,
        '#collapsed' => FALSE,
      );
      $varTypes = variable_get('book_made_simple_auto_main_page', array());
      $default = array_key_exists($type, $varTypes) && $varTypes[$type] != "0";
      $form['book_made_simple']['3']['book_made_simple_auto_main_page'] = array(
        '#attributes' => array(
          'style' => 'float:none;clear:both',
        ),
        '#type' => 'checkbox',
        '#title' => t('Auto create book main page'),
        '#default_value' => $default,
        '#description' => t('Checked will create a new book main page when adding.'),
      );
      $varTypes = variable_get('book_made_simple_forbid_main_page_creation', array());
      $default = array_key_exists($type, $varTypes) && $varTypes[$type] != "0";
      $form['book_made_simple']['3']['book_made_simple_forbid_main_page_creation'] = array(
        '#type' => 'checkbox',
        '#title' => t('Forbid creation of book main page'),
        '#default_value' => $default,
        '#description' => t('Checked will prevent books from being manually created with this content type as main page type.'),
      );
      $varTypes = variable_get('book_made_simple_only_on_books', array());
      $default = array_key_exists($type, $varTypes) && $varTypes[$type] != "0";
      $form['book_made_simple']['3']['book_made_simple_only_on_books'] = array(
        '#type' => 'checkbox',
        '#title' => t('Content type can only be created inside a book'),
        '#default_value' => $default,
        '#description' => t('Checked will prevent this content type be created outside a book.'),
      );
      $varTypes = variable_get('book_made_simple_only_creator', array());
      $default = array_key_exists($type, $varTypes) && $varTypes[$type] != "0";
      $form['book_made_simple']['3']['book_made_simple_only_creator'] = array(
        '#type' => 'checkbox',
        '#title' => t('Only creator can add child pages'),
        '#default_value' => $default,
        '#description' => t('Checked will prevent other users than creator to add child pages.'),
      );
      $varTypes = variable_get('book_made_simple_add_types', array());
      $default = array_key_exists($type, $varTypes) && $varTypes[$type] != "0";
      $form['book_made_simple']['3']['book_made_simple_add_types'] = array(
        '#type' => 'checkbox',
        '#title' => t('Allow content type as child of default book.'),
        '#default_value' => $default,
        '#description' => t('Checked will add this content-type to books where no content-types has been selected.'),
      );
      array_push($form['#submit'], "book_made_simple_form_submit");
      break;
  }

  // endswitch $form_id
}

// endfunction book_made_simple_form_alter()

/**
* Implementation of hook_form_submit().
*/
function book_made_simple_form_submit($form, &$form_state) {
  $values = $form_state["values"];
  $text = $values["book_made_simple_auto_main_page"];
  $type = $values["type"];
  variable_del("book_made_simple_add_types_" . $type);
  variable_del("book_made_simple_auto_main_page_" . $type);
  $types = variable_get('book_made_simple_auto_main_page', array());
  if ($text != "0") {
    $types[$type] = $type;
  }
  else {
    unset($types[$type]);
  }
  variable_set('book_made_simple_auto_main_page', $types);
  $text = $values["book_made_simple_only_on_books"];
  $type = $values["type"];
  $types = variable_get('book_made_simple_only_on_books', array());
  if ($text != "0") {
    $types[$type] = $type;
  }
  else {
    unset($types[$type]);
  }
  variable_set('book_made_simple_only_on_books', $types);
  $text = $values["book_made_simple_only_creator"];
  $type = $values["type"];
  $types = variable_get('book_made_simple_only_creator', array());
  if ($text != "0") {
    $types[$type] = $type;
  }
  else {
    unset($types[$type]);
  }
  variable_set('book_made_simple_only_creator', $types);
  $text = $values["book_made_simple_forbid_main_page_creation"];
  $type = $values["type"];
  variable_del("book_made_simple_forbid_main_page_creation_" . $type);
  $types = variable_get('book_made_simple_forbid_main_page_creation', array());
  if ($text != "0") {
    $types[$type] = $type;
  }
  else {
    unset($types[$type]);
  }
  variable_set('book_made_simple_forbid_main_page_creation', $types);
  $text = $values["book_made_simple_add_types"];
  $types = variable_get('book_made_simple_add_types', array());
  if ($text != "0") {
    $types[$type] = $type;
  }
  else {
    unset($types[$type]);
  }
  variable_set('book_made_simple_add_types', $types);
  $text = $values["book_made_simple_for_type"];
  if (count($text) == 0) {
    variable_del("book_made_simple_for_type_" . $type);
  }
  $types = node_get_types("names");
  $saved = $values["book_made_simple_for_book"];
  $a2 = array();
  foreach ($types as $ctype => $name) {
    if ($ctype != $type) {
      $a = variable_get('book_made_simple_for_type_' . $ctype, array());
      $ind = array_search($type, $a);
      if ($ind !== FALSE) {
        unset($a[$ind]);
      }
      variable_set('book_made_simple_for_type_' . $ctype, $a);
    }
  }
  foreach ($saved as $ctype => $name) {
    if ($name != "0") {
      $a = variable_get('book_made_simple_for_type_' . $ctype, array());
      $a[$type] = $type;
      variable_set('book_made_simple_for_type_' . $ctype, $a);
    }
  }
  variable_del("book_made_simple_for_book_" . $type);
}
function book_made_simple_creator_only_access($node) {
  global $user;
  if (user_access('administer books')) {
    return true;
  }
  $main_node = $node;
  if ($node->nid != $node->book['bid']) {
    $main = book_link_load($node->book["p1"]);
    if (isset($main)) {
      $main_node = node_load($main['nid']);
    }
  }
  $creator_only = array_key_exists($main_node->type, variable_get("book_made_simple_only_creator", array()));
  if ($creator_only && $user->uid != 1 && $user->uid != $main_node->uid) {
    return false;
  }
  return true;
}

/**
* Implementation of hook_link(). Add dropdown listbox to links
*/
function book_made_simple_link($type, $node = null, $teaser = false) {
  $links = array();
  $max_depth = variable_get('book_made_simple_limit_depth', 99);
  if ($type == 'node' && !$teaser && isset($node->book["bid"]) && user_access('add content to books') && $node->book['depth'] < $max_depth) {
    if (!book_made_simple_creator_only_access($node)) {
      return $links;
    }
    $html = "";
    $allowedTypes = array();

    // Search for content-type for this one
    $aTypes = variable_get('book_made_simple_for_type_' . $node->type, array());
    $style = variable_get('book_made_simple_child_list_style', "DDLIST");

    // No content-type, so print all
    if (count($aTypes) == 0) {
      $aTypes = variable_get('book_made_simple_add_types', array());
    }
    foreach ($aTypes as $allowedType => $allowedName) {
      $type = node_get_types("type", $allowedName);
      if (node_access('create', $type->type)) {
        $allowedTypes[str_replace("_", "-", $type->type)] = $type->name;
      }
    }
    $book_link = $node->book;
    if (count($allowedTypes) > 0) {
      asort($allowedTypes, SORT_STRING);
      if ($style == "LI") {
        foreach ($allowedTypes as $type => $name) {
          $query = array(
            "parent" => $node->book['mlid'],
          );
          if (module_exists('og')) {
            $group_node = og_get_group_context();
            if ($group_node && og_is_group_member($group_node)) {
              $query['gids[]'] = $group_node->nid;
            }
          }
          $links['book_made_simple_' . $type] = array(
            'title' => t('Add !content-type', array(
              '!content-type' => t($name),
            )),
            'href' => "node/add/" . $type,
            'query' => $query,
          );
        }
      }
      elseif ($style == "DDLIST") {
        $links['book_made_simple'] = array(
          'title' => "<span id='book_made_simple'>" . book_made_simple_add_child_book_content_types_ddlist($allowedTypes, $node) . "</span>",
          'html' => true,
        );
      }
      else {
        $links['book_made_simple'] = array(
          'title' => theme('add_child_book_content_types', $allowedTypes, $node),
          'html' => true,
        );
      }
    }
  }

  //$links["book_add_child"] = array();
  return $links;
}

/**
* Implementation of hook_theme().
*/
function book_made_simple_theme() {
  return array(
    'add_child_book_content_types' => array(
      'arguments' => array(
        'allowedTypes' => NULL,
        "node" => null,
      ),
    ),
  );
}

/**
* Themeable function to display alloawed child types of book().
* @param $allowedTypes
*   Array of allowed child type.
* @param $node
*   Source node
* @return 
*   Html code to display allowed child type
*/
function theme_add_child_book_content_types($allowedTypes, $node) {
  return "";
}

/**
* Display alloawed child type as dropdown listbox.
*/
function book_made_simple_add_child_book_content_types_ddlist($allowedTypes, $node) {
  $child_type = variable_get('book_child_type', 'book');
  $html = "<option value='" . str_replace('_', '-', $child_type) . "'>" . t("Add child page") . "</option>";
  foreach ($allowedTypes as $type => $name) {
    $html .= "<option value='" . $type . "'>" . t($name) . "</option>";
  }
  $isCleanUrl = variable_get('clean_url', 0);
  $url = url("node/add/");
  $op = "&";
  if ($isCleanUrl) {
    $op = "?";
  }
  $newUrl = $url . "\" + this.value + \"" . $op . "parent=" . $node->book["mlid"];
  if (module_exists('og')) {
    $group_node = og_get_group_context();
    if ($group_node && og_is_group_member($group_node)) {
      $newUrl .= '&gids[]=' . $group_node->nid;
    }
  }
  return "<select onchange='location.href=\"" . $newUrl . "\"'>{$html}</select>";
}

/**
* Implementation of hook_nodeapi().
*/
function book_made_simple_nodeapi(&$node, $op, $teaser, $page) {
  if (empty($node->book["bid"])) {
    $type = $node->type;
    switch ($op) {

      // Node creation
      case 'insert':
        $max_depth = variable_get('book_made_simple_limit_depth', 99);
        if ((user_access('add content to books') || user_access('administer book outlines')) && node_access('create', $type) && $node->book['depth'] < $max_depth) {
          $bookTypes = variable_get('book_made_simple_auto_main_page', array());
          $bookType = $bookTypes[$type];
          $toCreate = false;
          if (null != $bookType && $bookType != "0") {
            $toCreate = true;
          }
          if ($toCreate && !isset($_GET['parent'])) {
            $node->book["bid"] = $node->nid;
            $node->book['nid'] = $node->nid;
            $node->book['module'] = 'book';
            $node->book['menu_name'] = book_menu_name($node->book['bid']);
            $node->book['options'] = array(
              'type' => $node->type,
            );
            _book_update_outline($node);
          }
        }
        break;

      // Hack for translation module. Adding parent property to automatically select parent book.
      case "prepare translation":
        $translation = $node->translation_source;
        if (isset($translation->book) && !isset($_GET["parent"])) {

          // get parent menu link for the node + language
          $plid = $translation->book['plid'];
          $parentPage = book_link_load($plid);
          if (isset($parentPage) && $parentPage > 0) {
            $pnid = $parentPage['nid'];
            if (isset($pnid) && $pnid != "") {
              $query = "SELECT bid, mlid FROM {node} n left join {book} b on b.nid = n.nid where tnid= {$pnid} and language='" . $node->language . "'";
              $translatedParent = db_fetch_object(db_query($query));
              if ($translatedParent) {
                $mlid = $translatedParent->mlid;
                $params = array();
                $params[] = "parent={$mlid}";
                foreach ($_GET as $key => $value) {
                  if ($key == "q") {
                    $path = $value;
                  }
                  else {
                    $params[] = $key . "=" . $value;
                  }
                }
                $queryString = implode("&", $params);
                drupal_goto($path, $queryString);
                $ok = true;
              }
              else {
                drupal_set_message(t("This node has no translated parent, so no book selected"), "warning");
              }
            }
          }
        }
        break;
    }
  }
  else {
    switch ($op) {

      // Hide standard add Child link
      case 'alter':
        if ($node->links) {
          if (variable_get('book_made_simple_hide_default_add_child', true)) {
            if (array_key_exists("book_add_child", $node->links)) {
              unset($node->links["book_add_child"]);
            }
          }
          $position = variable_get("book_made_simple_child_list_style_position", "FIRST");
          if ($position == "FIRST") {
            if (array_key_exists("book_made_simple", $node->links)) {
              $a = $node->links["book_made_simple"];
              unset($node->links["book_made_simple"]);
              array_unshift($node->links, $a);
            }
          }
          break;
        }
    }
  }
}
function book_made_simple_theme_registry_alter(&$theme_registry) {
  global $theme;
  $theme_registry['BMS']['menu_item_link'] = $theme_registry['menu_item_link'];

  // Replace them with our own. These will "preprocess" and call the real functions.
  $theme_registry['menu_item_link']['function'] = 'book_made_simple_theme_menu_item_link';
}

/**
* Preprocessor for menu_item_link.
* Adds an ID attribute to menu links and helps the module
* follow the recursion of menu_tree_output().
*/
function book_made_simple_theme_menu_item_link($link) {

  // Find out which theme function to dispatch to after preprocessing.
  $registry = theme_get_registry();
  if (isset($link['path']) && $link['path'] == 'node/%/outline' && !user_access("show core Outline tab")) {
    return null;
  }
  $function = $registry['BMS']['menu_item_link']['function'];
  if ($function) {
    return $function($link);
  }
  return theme_menu_item_link($link);
}
function _book_made_simple_print_error($message, $formid) {
  $form = array();
  $form['#id'] = $formid . '-node-form';
  $form['#tree'] = "";
  $form['nid'] = array(
    '#type' => "value",
    '#value' => '',
  );
  $form['title'] = array(
    '#type' => 'item',
    '#title' => '',
    '#value' => t($message),
  );
  return $form;
}

Functions

Namesort descending Description
book_made_simple_add_child_book_content_types_ddlist Display alloawed child type as dropdown listbox.
book_made_simple_creator_only_access
book_made_simple_form_alter Implementation of hook_form_alter().
book_made_simple_form_submit Implementation of hook_form_submit().
book_made_simple_help Implementation of hook_help().
book_made_simple_init
book_made_simple_link Implementation of hook_link(). Add dropdown listbox to links
book_made_simple_menu Implementation of hook_menu().
book_made_simple_nodeapi Implementation of hook_nodeapi().
book_made_simple_perm
book_made_simple_reorder Shortcut to reorder book page
book_made_simple_settings_form Implementation of hook_settings_form).
book_made_simple_theme Implementation of hook_theme().
book_made_simple_theme_menu_item_link Preprocessor for menu_item_link. Adds an ID attribute to menu links and helps the module follow the recursion of menu_tree_output().
book_made_simple_theme_registry_alter
is_outline_access
is_reorder_access Return access rights for book
theme_add_child_book_content_types Themeable function to display alloawed child types of book().
_book_made_simple_print_error