1 book.module _book_update_outline(Node $node)

Handles additions and updates to the book outline.

This common helper function performs all additions and updates to the book outline through node addition, node editing, node deletion, or the outline tab.

Parameters

Node $node: The node that is being saved, added, deleted, or moved.

Return value

TRUE if the menu link was saved; FALSE otherwise.:

File

core/modules/book/book.module, line 613
Allows users to create and organize related content in an outline.

Code

function _book_update_outline(Node $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();
      // Reset the cache of stored books.
      backdrop_static_reset('book_get_books');
    }
    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);
        // Reset the cache of stored books.
        backdrop_static_reset('book_get_books');
      }
    }
    // Get all nodes that are part of this book and flush their caches.
    $affected_nids = db_query("SELECT nid FROM {book} WHERE bid = :bid", array(
      ':bid' => $node->book['bid'],
    ))->fetchAllAssoc('nid');
    entity_get_controller('node')->resetCache(array_keys($affected_nids));

    return TRUE;
  }

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