book добавить страницу программно

вообще чтобы подшить книжку страницу в книжку - в общем случае следует указать два параметра =

  1. id книги к которой будет относится данная страница - это элемент $node->book[bid] (= "new" если страницу предполагается сделать "корнем" книги - или в терминах модуля book -книгой - книгой самой по себе - непосредственно )))
  2. указать родительскую страницу - и вот здесь всё сложнее - дело в том, что для создания подобного рода ссылки в друпал 7 моудль бук использует систему меню ,а именно - запись в таблице menu_links - именно там хранится информация о родительской странице

смотрим как реализован этот хук в самом модуле @бук@ =

/**
 * Implements hook_node_insert().
 */
function book_node_insert($node) {
  if (!empty($node->book['bid'])) {
    if ($node->book['bid'] == 'new') {
      // New nodes that are their own book.
      $node->book['bid'] = $node->nid;
    }
    $node->book['nid'] = $node->nid;
    $node->book['menu_name'] = book_menu_name($node->book['bid']);
    _book_update_outline($node);
  }
}

ну а во вторых следует обратить внимание на данную функцию =

/**
 * Common helper function to handles additions and updates to the book outline.
 *
 * Performs all additions and updates to the book outline through node addition,
 * node editing, node deletion, or the outline tab.
 */
function _book_update_outline($node) {
  if (empty($node->book['bid'])) {
    return FALSE;
  }
  $new = empty($node->book['mlid']);

  $node->book['link_path'] = 'node/' . $node->nid;
  $node->book['link_title'] = $node->title;
  $node->book['parent_mismatch'] = FALSE; // The normal case.

  if ($node->book['bid'] == $node->nid) {
    $node->book['plid'] = 0;
    $node->book['menu_name'] = book_menu_name($node->nid);
  }
  else {
    // Check in case the parent is not is this book; the book takes precedence.
    if (!empty($node->book['plid'])) {
      $parent = db_query("SELECT * FROM {book} WHERE mlid = :mlid", array(
        ':mlid' => $node->book['plid'],
      ))->fetchAssoc();
    }
    if (empty($node->book['plid']) || !$parent || $parent['bid'] != $node->book['bid']) {
      $node->book['plid'] = db_query("SELECT mlid FROM {book} WHERE nid = :nid", array(
        ':nid' => $node->book['bid'],
      ))->fetchField();
      $node->book['parent_mismatch'] = TRUE; // Likely when JS is disabled.
    }
  }

  if (menu_link_save($node->book)) {
    if ($new) {
      // Insert new.
      db_insert('book')
        ->fields(array(
          'nid' => $node->nid,
          'mlid' => $node->book['mlid'],
          'bid' => $node->book['bid'],
        ))
        ->execute();
    }
    else {
      if ($node->book['bid'] != db_query("SELECT bid FROM {book} WHERE nid = :nid", array(
          ':nid' => $node->nid,
        ))->fetchField()) {
        // Update the bid for this page and all children.
        book_update_bid($node->book);
      }
    }

    return TRUE;
  }

  // Failed to save the menu link.
  return FALSE;
}