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 == '') { // Not in a book. $value = ''; return TRUE; } else if ($value == '') { // 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( '' => '<'. t('create a new book') .'>', '' => '<'. 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' ? '' : ''), ); $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); } }