annotate modules/book/book.admin.inc @ 13:8b6c45761e01 6.6

Drupal 6.6
author Franck Deroche <webmaster@defr.org>
date Tue, 23 Dec 2008 14:32:33 +0100
parents fff6d4c8c043
children
rev   line source
webmaster@1 1 <?php
webmaster@13 2 // $Id: book.admin.inc,v 1.8.2.3 2008/10/22 19:26:01 goba Exp $
webmaster@1 3
webmaster@1 4 /**
webmaster@1 5 * @file
webmaster@1 6 * Admin page callbacks for the book module.
webmaster@1 7 */
webmaster@1 8
webmaster@1 9 /**
webmaster@1 10 * Returns an administrative overview of all books.
webmaster@1 11 */
webmaster@1 12 function book_admin_overview() {
webmaster@1 13 $rows = array();
webmaster@1 14 foreach (book_get_books() as $book) {
webmaster@1 15 $rows[] = array(l($book['title'], $book['href'], $book['options']), l(t('edit order and titles'), "admin/content/book/". $book['nid']));
webmaster@1 16 }
webmaster@1 17 $headers = array(t('Book'), t('Operations'));
webmaster@1 18
webmaster@1 19 return theme('table', $headers, $rows);
webmaster@1 20 }
webmaster@1 21
webmaster@1 22 /**
webmaster@1 23 * Builds and returns the book settings form.
webmaster@1 24 *
webmaster@1 25 * @see book_admin_settings_validate()
webmaster@1 26 *
webmaster@1 27 * @ingroup forms
webmaster@1 28 */
webmaster@1 29 function book_admin_settings() {
webmaster@1 30 $types = node_get_types('names');
webmaster@1 31 $form['book_allowed_types'] = array(
webmaster@1 32 '#type' => 'checkboxes',
webmaster@1 33 '#title' => t('Allowed book outline types'),
webmaster@1 34 '#default_value' => variable_get('book_allowed_types', array('book')),
webmaster@1 35 '#options' => $types,
webmaster@1 36 '#description' => t('Select content types which users with the %add-perm permission will be allowed to add to the book hierarchy. Users with the %outline-perm permission can add all content types.', array('%add-perm' => t('add content to books'), '%outline-perm' => t('administer book outlines'))),
webmaster@1 37 '#required' => TRUE,
webmaster@1 38 );
webmaster@1 39 $form['book_child_type'] = array(
webmaster@1 40 '#type' => 'radios',
webmaster@1 41 '#title' => t('Default child page type'),
webmaster@1 42 '#default_value' => variable_get('book_child_type', 'book'),
webmaster@1 43 '#options' => $types,
webmaster@1 44 '#description' => t('The content type for the %add-child link must be one of those selected as an allowed book outline type.', array('%add-child' => t('Add child page'))),
webmaster@1 45 '#required' => TRUE,
webmaster@1 46 );
webmaster@1 47 $form['array_filter'] = array('#type' => 'value', '#value' => TRUE);
webmaster@1 48 $form['#validate'][] = 'book_admin_settings_validate';
webmaster@1 49 return system_settings_form($form);
webmaster@1 50 }
webmaster@1 51
webmaster@1 52 /**
webmaster@1 53 * Validate the book settings form.
webmaster@1 54 *
webmaster@1 55 * @see book_admin_settings()
webmaster@1 56 */
webmaster@1 57 function book_admin_settings_validate($form, &$form_state) {
webmaster@1 58 $child_type = $form_state['values']['book_child_type'];
webmaster@1 59 if (empty($form_state['values']['book_allowed_types'][$child_type])) {
webmaster@1 60 form_set_error('book_child_type', t('The content type for the %add-child link must be one of those selected as an allowed book outline type.', array('%add-child' => t('Add child page'))));
webmaster@1 61 }
webmaster@1 62 }
webmaster@1 63
webmaster@1 64 /**
webmaster@1 65 * Build the form to administrate the hierarchy of a single book.
webmaster@1 66 *
webmaster@1 67 * @see book_admin_edit_submit()
webmaster@1 68 *
webmaster@1 69 * @ingroup forms.
webmaster@1 70 */
webmaster@1 71 function book_admin_edit($form_state, $node) {
webmaster@1 72 drupal_set_title(check_plain($node->title));
webmaster@1 73 $form = array();
webmaster@1 74 $form['#node'] = $node;
webmaster@7 75 _book_admin_table($node, $form);
webmaster@1 76 $form['save'] = array(
webmaster@1 77 '#type' => 'submit',
webmaster@1 78 '#value' => t('Save book pages'),
webmaster@1 79 );
webmaster@1 80 return $form;
webmaster@1 81 }
webmaster@1 82
webmaster@1 83 /**
webmaster@7 84 * Check that the book has not been changed while using the form.
webmaster@7 85 *
webmaster@7 86 * @see book_admin_edit()
webmaster@7 87 */
webmaster@7 88 function book_admin_edit_validate($form, &$form_state) {
webmaster@7 89 if ($form_state['values']['tree_hash'] != $form_state['values']['tree_current_hash']) {
webmaster@7 90 form_set_error('', t('This book has been modified by another user, the changes could not be saved.'));
webmaster@7 91 $form_state['rebuild'] = TRUE;
webmaster@7 92 }
webmaster@7 93 }
webmaster@7 94
webmaster@7 95 /**
webmaster@1 96 * Handle submission of the book administrative page form.
webmaster@1 97 *
webmaster@1 98 * This function takes care to save parent menu items before their children.
webmaster@1 99 * Saving menu items in the incorrect order can break the menu tree.
webmaster@1 100 *
webmaster@1 101 * @see book_admin_edit()
webmaster@1 102 * @see menu_overview_form_submit()
webmaster@1 103 */
webmaster@1 104 function book_admin_edit_submit($form, &$form_state) {
webmaster@1 105 // Save elements in the same order as defined in post rather than the form.
webmaster@1 106 // This ensures parents are updated before their children, preventing orphans.
webmaster@1 107 $order = array_flip(array_keys($form['#post']['table']));
webmaster@1 108 $form['table'] = array_merge($order, $form['table']);
webmaster@1 109
webmaster@1 110 foreach (element_children($form['table']) as $key) {
webmaster@1 111 if ($form['table'][$key]['#item']) {
webmaster@1 112 $row = $form['table'][$key];
webmaster@1 113 $values = $form_state['values']['table'][$key];
webmaster@1 114
webmaster@1 115 // Update menu item if moved.
webmaster@1 116 if ($row['plid']['#default_value'] != $values['plid'] || $row['weight']['#default_value'] != $values['weight']) {
webmaster@1 117 $row['#item']['plid'] = $values['plid'];
webmaster@1 118 $row['#item']['weight'] = $values['weight'];
webmaster@1 119 menu_link_save($row['#item']);
webmaster@1 120 }
webmaster@1 121
webmaster@1 122 // Update the title if changed.
webmaster@1 123 if ($row['title']['#default_value'] != $values['title']) {
webmaster@1 124 $node = node_load($values['nid'], FALSE);
webmaster@1 125 $node->title = $values['title'];
webmaster@1 126 $node->book['link_title'] = $values['title'];
webmaster@1 127 $node->revision = 1;
webmaster@1 128 $node->log = t('Title changed from %original to %current.', array('%original' => $node->title, '%current' => $values['title']));
webmaster@1 129 node_save($node);
webmaster@1 130 watchdog('content', 'book: updated %title.', array('%title' => $node->title), WATCHDOG_NOTICE, l(t('view'), 'node/'. $node->nid));
webmaster@1 131 }
webmaster@1 132 }
webmaster@1 133 }
webmaster@1 134
webmaster@1 135 drupal_set_message(t('Updated book %title.', array('%title' => $form['#node']->title)));
webmaster@1 136 }
webmaster@1 137
webmaster@1 138 /**
webmaster@1 139 * Build the table portion of the form for the book administration page.
webmaster@1 140 *
webmaster@1 141 * @see book_admin_edit()
webmaster@1 142 */
webmaster@7 143 function _book_admin_table($node, &$form) {
webmaster@7 144 $form['table'] = array(
webmaster@1 145 '#theme' => 'book_admin_table',
webmaster@1 146 '#tree' => TRUE,
webmaster@1 147 );
webmaster@1 148
webmaster@1 149 $tree = book_menu_subtree_data($node->book);
webmaster@1 150 $tree = array_shift($tree); // Do not include the book item itself.
webmaster@1 151 if ($tree['below']) {
webmaster@7 152 $hash = sha1(serialize($tree['below']));
webmaster@7 153 // Store the hash value as a hidden form element so that we can detect
webmaster@7 154 // if another user changed the book hierarchy.
webmaster@7 155 $form['tree_hash'] = array(
webmaster@7 156 '#type' => 'hidden',
webmaster@7 157 '#default_value' => $hash,
webmaster@7 158 );
webmaster@7 159 $form['tree_current_hash'] = array(
webmaster@7 160 '#type' => 'value',
webmaster@7 161 '#value' => $hash,
webmaster@7 162 );
webmaster@7 163 _book_admin_table_tree($tree['below'], $form['table']);
webmaster@1 164 }
webmaster@1 165 }
webmaster@1 166
webmaster@1 167 /**
webmaster@1 168 * Recursive helper to build the main table in the book administration page form.
webmaster@1 169 *
webmaster@1 170 * @see book_admin_edit()
webmaster@1 171 */
webmaster@1 172 function _book_admin_table_tree($tree, &$form) {
webmaster@13 173 foreach ($tree as $data) {
webmaster@13 174 $form['book-admin-'. $data['link']['nid']] = array(
webmaster@1 175 '#item' => $data['link'],
webmaster@1 176 'nid' => array('#type' => 'value', '#value' => $data['link']['nid']),
webmaster@1 177 'depth' => array('#type' => 'value', '#value' => $data['link']['depth']),
webmaster@1 178 'href' => array('#type' => 'value', '#value' => $data['link']['href']),
webmaster@1 179 'title' => array(
webmaster@1 180 '#type' => 'textfield',
webmaster@1 181 '#default_value' => $data['link']['link_title'],
webmaster@1 182 '#maxlength' => 255,
webmaster@1 183 '#size' => 40,
webmaster@1 184 ),
webmaster@1 185 'weight' => array(
webmaster@1 186 '#type' => 'weight',
webmaster@1 187 '#default_value' => $data['link']['weight'],
webmaster@1 188 '#delta' => 15,
webmaster@1 189 ),
webmaster@1 190 'plid' => array(
webmaster@1 191 '#type' => 'textfield',
webmaster@1 192 '#default_value' => $data['link']['plid'],
webmaster@1 193 '#size' => 6,
webmaster@1 194 ),
webmaster@1 195 'mlid' => array(
webmaster@1 196 '#type' => 'hidden',
webmaster@1 197 '#default_value' => $data['link']['mlid'],
webmaster@1 198 ),
webmaster@1 199 );
webmaster@1 200 if ($data['below']) {
webmaster@1 201 _book_admin_table_tree($data['below'], $form);
webmaster@1 202 }
webmaster@1 203 }
webmaster@1 204
webmaster@1 205 return $form;
webmaster@1 206 }
webmaster@1 207
webmaster@1 208 /**
webmaster@1 209 * Theme function for the book administration page form.
webmaster@1 210 *
webmaster@1 211 * @ingroup themeable
webmaster@1 212 * @see book_admin_table()
webmaster@1 213 */
webmaster@1 214 function theme_book_admin_table($form) {
webmaster@1 215 drupal_add_tabledrag('book-outline', 'match', 'parent', 'book-plid', 'book-plid', 'book-mlid', TRUE, MENU_MAX_DEPTH - 2);
webmaster@1 216 drupal_add_tabledrag('book-outline', 'order', 'sibling', 'book-weight');
webmaster@1 217
webmaster@1 218 $header = array(t('Title'), t('Weight'), t('Parent'), array('data' => t('Operations'), 'colspan' => '3'));
webmaster@1 219
webmaster@1 220 $rows = array();
webmaster@1 221 $destination = drupal_get_destination();
webmaster@1 222 $access = user_access('administer nodes');
webmaster@1 223 foreach (element_children($form) as $key) {
webmaster@1 224 $nid = $form[$key]['nid']['#value'];
webmaster@1 225 $href = $form[$key]['href']['#value'];
webmaster@1 226
webmaster@1 227 // Add special classes to be used with tabledrag.js.
webmaster@1 228 $form[$key]['plid']['#attributes']['class'] = 'book-plid';
webmaster@1 229 $form[$key]['mlid']['#attributes']['class'] = 'book-mlid';
webmaster@1 230 $form[$key]['weight']['#attributes']['class'] = 'book-weight';
webmaster@1 231
webmaster@1 232 $data = array(
webmaster@1 233 theme('indentation', $form[$key]['depth']['#value'] - 2) . drupal_render($form[$key]['title']),
webmaster@1 234 drupal_render($form[$key]['weight']),
webmaster@1 235 drupal_render($form[$key]['plid']) . drupal_render($form[$key]['mlid']),
webmaster@1 236 l(t('view'), $href),
webmaster@1 237 $access ? l(t('edit'), 'node/'. $nid .'/edit', array('query' => $destination)) : '&nbsp',
webmaster@1 238 $access ? l(t('delete'), 'node/'. $nid .'/delete', array('query' => $destination) ) : '&nbsp',
webmaster@1 239 );
webmaster@1 240 $row = array('data' => $data);
webmaster@1 241 if (isset($form[$key]['#attributes'])) {
webmaster@1 242 $row = array_merge($row, $form[$key]['#attributes']);
webmaster@1 243 }
webmaster@1 244 $row['class'] = empty($row['class']) ? 'draggable' : $row['class'] .' draggable';
webmaster@1 245 $rows[] = $row;
webmaster@1 246 }
webmaster@1 247
webmaster@1 248 return theme('table', $header, $rows, array('id' => 'book-outline'));
webmaster@1 249 }
webmaster@1 250