You are here

book.inc in Node import 6

Same filename and directory in other branches
  1. 5 supported/book.inc

Support file for the core book module.

File

supported/book.inc
View source
<?php

/**
 * @file
 * Support file for the core book module.
 */

/**
 * Implementation of hook_node_import_fields().
 */
function book_node_import_fields($type) {
  $fields = array();
  if (($node_type = node_import_type_is_node($type)) !== FALSE && book_type_is_allowed($node_type) && (user_access('administer book outlines') || user_access('add content to books'))) {
    $fields['book:book'] = array(
      'title' => t('Book'),
      'group' => t('Book outline'),
      'module' => 'book',
      'input_format' => 'book_reference',
    );
    $fields['book:parent'] = array(
      'title' => t('Parent item'),
      'group' => t('Book outline'),
      'module' => 'book',
      'input_format' => 'book_page_reference',
    );
    $fields['book:weight'] = array(
      'title' => t('Weight'),
      'group' => t('Book outline'),
      'module' => 'book',
      'input_format' => 'weight',
      'delta' => 15,
    );
  }
  return $fields;
}

/**
 * Implementation of hook_node_import_fields_alter().
 */
function book_node_import_fields_alter(&$fields, $type) {
  foreach ($fields as $fieldname => $fieldinfo) {
    switch ($fieldinfo['input_format']) {
      case 'book_reference':
        $fields[$fieldname]['preprocess'][] = 'node_import_check_book_reference';
        break;
      case 'book_page_reference':

        // Because the book page reference needs to know what book we are
        // adding the page to, we can't preprocess here, but need to do
        // it in book_node_import_values_alter().
        break;
    }
  }
}

/**
 * Check whether the value is a book (by NID or Title).
 *
 * Uses: nothing.
 *
 * @ingroup node_import_preprocess
 */
function node_import_check_book_reference(&$value, $field, $options, $preview) {
  static $first_run = TRUE;
  if ($first_run) {
    foreach (node_import_extract_property(book_get_books()) as $nid => $title) {
      node_import_set_object('book', $title, $nid);
      node_import_set_object('book', $nid, $nid);
      node_import_set_object('book:title', $nid, $title);
    }
    $first_run = FALSE;
  }
  if ($value == '<none>') {

    // Not in a book.
    $value = '';
    return TRUE;
  }
  else {
    if ($value == '<new>') {

      // A new top-level book.
      $value = 'new';
      return TRUE;
    }
    else {
      if (($bid = node_import_get_object('book', $value)) !== NULL) {

        // An existing book.
        $value = $bid;
        return TRUE;
      }
    }
  }
  node_import_input_error(t('Input error: %value is not allowed for %name (not a book).', array(
    '%value' => $value,
    '%name' => $field['title'],
  )));
  return FALSE;
}

/**
 * Implementation of hook_node_import_defaults().
 */
function book_node_import_defaults($type, $defaults, $fields, $map) {
  $form = array();
  if (($node_type = node_import_type_is_node($type)) !== FALSE && book_type_is_allowed($node_type) && (user_access('administer book outlines') || user_access('add content to books'))) {
    $book_options = array(
      '<new>' => '<' . t('create a new book') . '>',
      '<none>' => '<' . t('none') . '>',
    ) + node_import_extract_property(book_get_books());
    $form['book:book'] = array(
      '#title' => t('Book'),
      '#type' => 'select',
      '#options' => $book_options,
      '#default_value' => isset($defaults['book:book']) ? $defaults['book:book'] : ($type == 'node:book' ? '<new>' : '<none>'),
    );
    $form['book:weight'] = array(
      '#title' => t('Weight'),
      '#type' => 'weight',
      '#delta' => 15,
      '#default_value' => isset($defaults['book:weight']) ? $defaults['book:weight'] : '0',
    );
  }
  return $form;
}

/**
 * Implementation of hook_node_import_values_alter().
 */
function book_node_import_values_alter(&$values, $type, $defaults, $options, $fields, $preview) {
  static $virtual_book = 0;
  static $virtual_book_page = 0;
  if (($node_type = node_import_type_is_node($type)) !== FALSE && book_type_is_allowed($node_type) && (user_access('administer book outlines') || user_access('add content to books'))) {
    $book = $values['book:book'];
    $parent = $values['book:parent'];
    $weight = $values['book:weight'];
    unset($values['book:book']);
    unset($values['book:parent']);
    unset($values['book:weight']);

    // Not in a book.
    if (drupal_strlen($book) == 0) {
      $values['book'] = array(
        'bid' => 0,
        'weight' => $weight,
      );
      return;
    }

    // A new top-level book.
    if ($book == 'new') {
      if ($preview) {
        drupal_set_message(t('A new book %title will be created.', array(
          '%title' => $values['title'],
        )));
        $virtual_book--;
        node_import_set_object('book', $values['title'], $virtual_book);
        node_import_set_object('book:title', $virtual_book, $values['title']);
      }
      else {

        // When a new book is created, the form will no longer validate
        // as book_get_books() is cached.
        global $node_import_can_continue;
        $node_import_can_continue = FALSE;
      }
      $values['book'] = array(
        'bid' => $book,
        'weight' => $weight,
      );
      return;
    }

    // A new page in an existing book.
    $plid = node_import_get_object('book:' . $book, $parent);
    if ($plid === NULL && $book > 0 && drupal_strlen($parent) > 0) {
      if ($plid = db_result(db_query("SELECT mlid FROM {menu_links} WHERE menu_name = '%s' AND module = 'book' AND (LOWER(link_title) = '%s' OR link_path = '%s')", book_menu_name($book), drupal_strtolower($parent), 'node/' . (is_numeric($parent) && intval($parent) > 0 ? $parent : '')))) {
        node_import_set_object('book:' . $book, $parent, $plid);
      }
    }
    if ($book > 0 && isset($plid) && $plid > 0) {
      $values['book'] = array(
        'plid' => $plid,
        'weight' => $weight,
        'bid' => $book,
      );
      return;
    }
    else {
      if ($book > 0 && drupal_strlen($parent) == 0) {
        $values['book'] = array(
          'bid' => $book,
          'weight' => $weight,
        );
        return;
      }
    }
    if ($preview) {
      $virtual_book_page--;
      node_import_set_object('book:' . $book, $values['title'], $virtual_book_page);
      node_import_set_object('book:' . $book . ':title', $virtual_book_page, $values['title']);
      if ($book < 0) {
        drupal_set_message(t('This will be a page in %title.', array(
          '%title' => node_import_get_object('book:title', $book),
        )));
      }
      else {
        $values['book'] = array(
          'bid' => $book,
          'weight' => $weight,
        );
      }
      if ($plid < 0) {
        drupal_set_message(t('This will be a child page of %title.', array(
          '%title' => node_import_get_object('book:' . $book . ':title', $plid),
        )));
        return;
      }
      else {
        if (drupal_strlen($parent) == 0) {
          drupal_set_message(t('This will be the top-level page in this book.'));
          return;
        }
      }
    }
    node_import_input_error(t('Input error: %value is not allowed for %name (not a book page in %book).', array(
      '%value' => $parent,
      '%name' => t('Parent item'),
      '%book' => node_import_get_object('book:title', $book),
    )));
  }
}

/**
 * Implementation of hook_node_import_postprocess().
 */
function book_node_import_postprocess($type, $values, $options, $preview) {
  if (!$preview && isset($values['nid']) && ($node_type = node_import_type_is_node($type)) !== FALSE && book_type_is_allowed($node_type) && (user_access('administer book outlines') || user_access('add content to books')) && isset($values['book']['plid']) && $values['book']['plid'] > 0 && ($mlid = db_result(db_query("SELECT mlid FROM {menu_links} WHERE module = 'book' AND link_path = '%s'", 'node/' . $values['nid'])))) {
    $menu_link = array(
      'menu_name' => book_menu_name($values['book']['bid']),
      'weight' => $values['book']['weight'],
      'mlid' => $mlid,
      'plid' => $values['book']['plid'],
      'router_path' => 'node/%',
      'link_path' => 'node/' . $values['nid'],
      'link_title' => $values['title'],
      'module' => 'book',
    );
    menu_link_save($menu_link);
  }
}