summaryrefslogtreecommitdiff
path: root/modules/book
diff options
context:
space:
mode:
authorDavid Rothstein <drothstein@gmail.com>2012-06-23 15:34:14 -0400
committerDavid Rothstein <drothstein@gmail.com>2012-06-23 15:34:14 -0400
commite2bab36cd4bcf5e99a7eb84e5674c9b0e49fc32c (patch)
tree33fa0d5434e3ae92a0f394ae919088e2e1f577bf /modules/book
parentf7d5d808493e53f09ea536d429417a5ef14fddf0 (diff)
downloadbrdo-e2bab36cd4bcf5e99a7eb84e5674c9b0e49fc32c.tar.gz
brdo-e2bab36cd4bcf5e99a7eb84e5674c9b0e49fc32c.tar.bz2
Issue #283045 by mlncn, Albert Volkman, Jody Lynn, pwolanin, gpk, no_commit_credit | marcp: Fixed Allow top-level pages to be removed from books.
Diffstat (limited to 'modules/book')
-rw-r--r--modules/book/book.module12
-rw-r--r--modules/book/book.pages.inc5
-rw-r--r--modules/book/book.test27
3 files changed, 39 insertions, 5 deletions
diff --git a/modules/book/book.module b/modules/book/book.module
index 61061f011..20ce4fc86 100644
--- a/modules/book/book.module
+++ b/modules/book/book.module
@@ -213,7 +213,17 @@ function _book_outline_access($node) {
* @see book_menu()
*/
function _book_outline_remove_access($node) {
- return isset($node->book) && ($node->book['bid'] != $node->nid) && _book_outline_access($node);
+ return _book_node_is_removable($node) && _book_outline_access($node);
+}
+
+/**
+ * Determines if a node can be removed from the book.
+ *
+ * A node can be removed from a book if it is actually in a book and it either
+ * is not a top-level page or is a top-level page with no children.
+ */
+function _book_node_is_removable($node) {
+ return (!empty($node->book['bid']) && (($node->book['bid'] != $node->nid) || !$node->book['has_children']));
}
/**
diff --git a/modules/book/book.pages.inc b/modules/book/book.pages.inc
index 5a05c9f1d..583eb7a81 100644
--- a/modules/book/book.pages.inc
+++ b/modules/book/book.pages.inc
@@ -137,7 +137,7 @@ function book_outline_form($form, &$form_state, $node) {
$form['remove'] = array(
'#type' => 'submit',
'#value' => t('Remove from book outline'),
- '#access' => $node->nid != $node->book['bid'] && $node->book['bid'],
+ '#access' => _book_node_is_removable($node),
'#weight' => 20,
'#submit' => array('book_remove_button_submit'),
);
@@ -216,8 +216,7 @@ function book_remove_form($form, &$form_state, $node) {
*/
function book_remove_form_submit($form, &$form_state) {
$node = $form['#node'];
- if ($node->nid != $node->book['bid']) {
- // Only allowed when this is not a book (top-level page).
+ if (_book_node_is_removable($node)) {
menu_link_delete($node->book['mlid']);
db_delete('book')
->condition('nid', $node->nid)
diff --git a/modules/book/book.test b/modules/book/book.test
index 1ec1fe92f..d1f527387 100644
--- a/modules/book/book.test
+++ b/modules/book/book.test
@@ -32,7 +32,7 @@ class BookTestCase extends DrupalWebTestCase {
// Create users.
$this->book_author = $this->drupalCreateUser(array('create new books', 'create book content', 'edit own book content', 'add content to books'));
$this->web_user = $this->drupalCreateUser(array('access printer-friendly version', 'node test view'));
- $this->admin_user = $this->drupalCreateUser(array('create new books', 'create book content', 'edit own book content', 'add content to books', 'administer blocks', 'administer permissions'));
+ $this->admin_user = $this->drupalCreateUser(array('create new books', 'create book content', 'edit own book content', 'add content to books', 'administer blocks', 'administer permissions', 'administer book outlines', 'node test view'));
}
/**
@@ -332,4 +332,29 @@ class BookTestCase extends DrupalWebTestCase {
$this->drupalGet('node/' . $this->book->nid);
$this->assertText($block_title, t('Book navigation block is displayed to anonymous users.'));
}
+
+ /**
+ * Tests the access for deleting top-level book nodes.
+ */
+ function testBookDelete() {
+ $nodes = $this->createBook();
+ $this->drupalLogin($this->admin_user);
+ $edit = array();
+
+ // Test access to delete top-level and child book nodes.
+ $this->drupalGet('node/' . $this->book->nid . '/outline/remove');
+ $this->assertResponse('403', t('Deleting top-level book node properly forbidden.'));
+ $this->drupalPost('node/' . $nodes[4]->nid . '/outline/remove', $edit, t('Remove'));
+ $node4 = node_load($nodes[4]->nid, NULL, TRUE);
+ $this->assertTrue(empty($node4->book), t('Deleting child book node properly allowed.'));
+
+ // Delete all child book nodes and retest top-level node deletion.
+ foreach ($nodes as $node) {
+ $nids[] = $node->nid;
+ }
+ node_delete_multiple($nids);
+ $this->drupalPost('node/' . $this->book->nid . '/outline/remove', $edit, t('Remove'));
+ $node = node_load($this->book->nid, NULL, TRUE);
+ $this->assertTrue(empty($node->book), t('Deleting childless top-level book node properly allowed.'));
+ }
}