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