diff --git a/core/modules/book/src/Form/BookAdminEditForm.php b/core/modules/book/src/Form/BookAdminEditForm.php index fb1e3e8451896722b2751517ac612bac20e10b46..2cf7a18fb9eb2ec6c458d9efa9da1ed1591884da 100644 --- a/core/modules/book/src/Form/BookAdminEditForm.php +++ b/core/modules/book/src/Form/BookAdminEditForm.php @@ -97,31 +97,33 @@ public function submitForm(array &$form, FormStateInterface $form_state) { // Save elements in the same order as defined in post rather than the form. // This ensures parents are updated before their children, preventing orphans. $user_input = $form_state->getUserInput(); - $order = array_flip(array_keys($user_input['table'])); - $form['table'] = array_merge($order, $form['table']); - - foreach (Element::children($form['table']) as $key) { - if ($form['table'][$key]['#item']) { - $row = $form['table'][$key]; - $values = $form_state->getValue(array('table', $key)); - - // Update menu item if moved. - if ($row['pid']['#default_value'] != $values['pid'] || $row['weight']['#default_value'] != $values['weight']) { - $link = $this->bookManager->loadBookLink($values['nid'], FALSE); - $link['weight'] = $values['weight']; - $link['pid'] = $values['pid']; - $this->bookManager->saveBookLink($link, FALSE); - } - - // Update the title if changed. - if ($row['title']['#default_value'] != $values['title']) { - $node = $this->nodeStorage->load($values['nid']); - $node->revision_log = $this->t('Title changed from %original to %current.', array('%original' => $node->label(), '%current' => $values['title'])); - $node->title = $values['title']; - $node->book['link_title'] = $values['title']; - $node->setNewRevision(); - $node->save(); - $this->logger('content')->notice('book: updated %title.', array('%title' => $node->label(), 'link' => $node->link($this->t('View')))); + if (isset($user_input['table'])) { + $order = array_flip(array_keys($user_input['table'])); + $form['table'] = array_merge($order, $form['table']); + + foreach (Element::children($form['table']) as $key) { + if ($form['table'][$key]['#item']) { + $row = $form['table'][$key]; + $values = $form_state->getValue(array('table', $key)); + + // Update menu item if moved. + if ($row['pid']['#default_value'] != $values['pid'] || $row['weight']['#default_value'] != $values['weight']) { + $link = $this->bookManager->loadBookLink($values['nid'], FALSE); + $link['weight'] = $values['weight']; + $link['pid'] = $values['pid']; + $this->bookManager->saveBookLink($link, FALSE); + } + + // Update the title if changed. + if ($row['title']['#default_value'] != $values['title']) { + $node = $this->nodeStorage->load($values['nid']); + $node->revision_log = $this->t('Title changed from %original to %current.', array('%original' => $node->label(), '%current' => $values['title'])); + $node->title = $values['title']; + $node->book['link_title'] = $values['title']; + $node->setNewRevision(); + $node->save(); + $this->logger('content')->notice('book: updated %title.', array('%title' => $node->label(), 'link' => $node->link($this->t('View')))); + } } } } diff --git a/core/modules/book/src/Tests/BookTest.php b/core/modules/book/src/Tests/BookTest.php index 591ac380457e4ea2119d2aeabcc4839d0c8e456d..b229104d10f18801ad130902d8a3e37296872f76 100644 --- a/core/modules/book/src/Tests/BookTest.php +++ b/core/modules/book/src/Tests/BookTest.php @@ -95,6 +95,21 @@ function createBook() { return $nodes; } + /** + * Tests saving the book outline on an empty book. + */ + function testEmptyBook() { + // Create a new empty book. + $this->drupalLogin($this->book_author); + $book = $this->createBookNode('new'); + $this->drupalLogout(); + + // Log in as a user with access to the book outline and save the form. + $this->drupalLogin($this->admin_user); + $this->drupalPostForm('admin/structure/book/' . $book->id(), array(), t('Save book pages')); + $this->assertText(t('Updated book @book.', array('@book' => $book->label()))); + } + /** * Tests book functionality through node interfaces. */