| [ Index ] |
PHP Cross Reference of Drupal 6 (gatewave) |
[Summary view] [Print] [Text view]
1 <?php 2 // $Id: book.install,v 1.20.2.1 2009/01/06 15:46:36 goba Exp $ 3 4 /** 5 * Implementation of hook_install(). 6 */ 7 function book_install() { 8 // Create tables. 9 drupal_install_schema('book'); 10 // Add the node type. 11 _book_install_type_create(); 12 } 13 14 /** 15 * Implementation of hook_uninstall(). 16 */ 17 function book_uninstall() { 18 // Delete menu links. 19 db_query("DELETE FROM {menu_links} WHERE module = 'book'"); 20 menu_cache_clear_all(); 21 // Remove tables. 22 drupal_uninstall_schema('book'); 23 } 24 25 function _book_install_type_create() { 26 // Create an additional node type 27 $book_node_type = array( 28 'type' => 'book', 29 'name' => t('Book page'), 30 'module' => 'node', 31 'description' => t('A <em>book page</em> is a page of content, organized into a collection of related entries collectively known as a <em>book</em>. A <em>book page</em> automatically displays links to adjacent pages, providing a simple navigation system for organizing and reviewing structured content.'), 32 'custom' => TRUE, 33 'modified' => TRUE, 34 'locked' => FALSE, 35 ); 36 37 $book_node_type = (object)_node_type_set_defaults($book_node_type); 38 node_type_save($book_node_type); 39 // Default to not promoted. 40 variable_set('node_options_book', array('status')); 41 // Use this default type for adding content to books. 42 variable_set('book_allowed_types', array('book')); 43 variable_set('book_child_type', 'book'); 44 } 45 46 /** 47 * Drupal 5.x to 6.x update. 48 * 49 * This function moves any existing book hierarchy into the new structure used 50 * in the 6.x module. Rather than storing the hierarchy in the {book} table, 51 * the menu API is used to store the hierarchy in the {menu_links} table and the 52 * {book} table serves to uniquely connect a node to a menu link. 53 * 54 * In order to accomplish this, the current hierarchy is processed using a stack. 55 * The stack insures that each parent is processed before any of its children 56 * in the book hierarchy, and is compatible with batched update processing. 57 * 58 */ 59 function book_update_6000() { 60 $ret = array(); 61 62 // Set up for a multi-part update. 63 if (!isset($_SESSION['book_update_6000'])) { 64 65 $schema['book'] = array( 66 'fields' => array( 67 'mlid' => array('type' => 'int', 'unsigned' => TRUE, 'not null' => TRUE, 'default' => 0), 68 'nid' => array('type' => 'int', 'unsigned' => TRUE, 'not null' => TRUE, 'default' => 0), 69 'bid' => array('type' => 'int', 'unsigned' => TRUE, 'not null' => TRUE, 'default' => 0), 70 ), 71 'primary key' => array('mlid'), 72 'unique keys' => array( 73 'nid' => array('nid'), 74 ), 75 'indexes' => array( 76 'bid' => array('bid'), 77 ), 78 ); 79 // Add the node type. 80 _book_install_type_create(); 81 82 // Fix role permissions to account for the changed names 83 // Setup the array holding strings to match and the corresponding 84 // strings to replace them with. 85 $replace = array( 86 'outline posts in books' => 'administer book outlines', 87 'create book pages' => 'create book content', 88 'edit book pages' => 'edit any book content', 89 'edit own book pages' => 'edit own book content', 90 'see printer-friendly version' => 'access printer-friendly version', 91 ); 92 93 // Loop over all the roles, and do the necessary transformations. 94 $query = db_query("SELECT rid, perm FROM {permission} ORDER BY rid"); 95 while ($role = db_fetch_object($query)) { 96 // Replace all the old permissions with the corresponding new permissions. 97 $fixed_perm = strtr($role->perm, $replace); 98 // If the user could previously create book pages, they should get the new 99 // 'add content to books' permission. 100 if (strpos($role->perm, 'create book pages') !== FALSE) { 101 $fixed_perm .= ', add content to books'; 102 } 103 // Only save if the permissions have changed. 104 if ($fixed_perm != $role->perm) { 105 $ret[] = update_sql("UPDATE {permission} SET perm = '$fixed_perm' WHERE rid = $role->rid"); 106 } 107 } 108 109 // Determine whether there are any existing nodes in the book hierarchy. 110 if (db_result(db_query("SELECT COUNT(*) FROM {book}"))) { 111 // Temporary table for the old book hierarchy; we'll discard revision info. 112 $schema['book_temp'] = array( 113 'fields' => array( 114 'nid' => array('type' => 'int', 'unsigned' => TRUE, 'not null' => TRUE, 'default' => 0), 115 'parent' => array('type' => 'int', 'not null' => TRUE, 'default' => 0), 116 'weight' => array('type' => 'int', 'not null' => TRUE, 'default' => 0, 'size' => 'tiny') 117 ), 118 'indexes' => array( 119 'parent' => array('parent') 120 ), 121 'primary key' => array('nid'), 122 ); 123 124 db_create_table($ret, 'book_temp', $schema['book_temp']); 125 126 // Insert each node in the old table into the temporary table. 127 $ret[] = update_sql("INSERT INTO {book_temp} (nid, parent, weight) SELECT b.nid, b.parent, b.weight FROM {book} b INNER JOIN {node} n on b.vid = n.vid"); 128 $ret[] = update_sql("DROP TABLE {book}"); 129 130 db_create_table($ret, 'book', $schema['book']); 131 132 $_SESSION['book_update_6000_orphans']['from'] = 0; 133 $_SESSION['book_update_6000'] = array(); 134 $result = db_query("SELECT * from {book_temp} WHERE parent = 0"); 135 136 // Collect all books - top-level nodes. 137 while ($a = db_fetch_array($result)) { 138 $_SESSION['book_update_6000'][] = $a; 139 } 140 $ret['#finished'] = FALSE; 141 return $ret; 142 } 143 else { 144 // No exising nodes in the hierarchy, so drop the table and re-create it. 145 $ret[] = update_sql("DROP TABLE {book}"); 146 db_create_table($ret, 'book', $schema['book']); 147 return $ret; 148 } 149 } 150 elseif ($_SESSION['book_update_6000_orphans']) { 151 // Do the first batched part of the update - collect orphans. 152 $update_count = 400; // Update this many at a time 153 154 $result = db_query_range("SELECT * FROM {book_temp}", $_SESSION['book_update_6000_orphans']['from'], $update_count); 155 $has_rows = FALSE; 156 // Go through the next $update_count book pages and locate the orphans. 157 while ($book = db_fetch_array($result)) { 158 $has_rows = TRUE; 159 // Orphans are defined as nodes whose parent does not exist in the table. 160 if ($book['parent'] && !db_result(db_query("SELECT COUNT(*) FROM {book_temp} WHERE nid = %d", $book['parent']))) { 161 if (empty($_SESSION['book_update_6000_orphans']['book'])) { 162 // The first orphan becomes the parent for all other orphans. 163 $book['parent'] = 0; 164 $_SESSION['book_update_6000_orphans']['book'] = $book; 165 $ret[] = array('success' => TRUE, 'query' => 'Relocated orphan book pages.'); 166 } 167 else { 168 // Re-assign the parent value of the book, and add it to the stack. 169 $book['parent'] = $_SESSION['book_update_6000_orphans']['book']['nid']; 170 $_SESSION['book_update_6000'][] = $book; 171 } 172 } 173 } 174 if ($has_rows) { 175 $_SESSION['book_update_6000_orphans']['from'] += $update_count; 176 } 177 else { 178 // Done with this part 179 if (!empty($_SESSION['book_update_6000_orphans']['book'])) { 180 // The orphans' parent is added last, so it will be processed first. 181 $_SESSION['book_update_6000'][] = $_SESSION['book_update_6000_orphans']['book']; 182 } 183 $_SESSION['book_update_6000_orphans'] = FALSE; 184 } 185 $ret['#finished'] = FALSE; 186 return $ret; 187 } 188 else { 189 // Do the next batched part of the update 190 $update_count = 100; // Update this many at a time 191 192 while ($update_count && $_SESSION['book_update_6000']) { 193 // Get the last node off the stack. 194 $book = array_pop($_SESSION['book_update_6000']); 195 196 // Add all of this node's children to the stack 197 $result = db_query("SELECT * FROM {book_temp} WHERE parent = %d", $book['nid']); 198 while ($a = db_fetch_array($result)) { 199 $_SESSION['book_update_6000'][] = $a; 200 } 201 202 if ($book['parent']) { 203 // If its not a top level page, get its parent's mlid. 204 $parent = db_fetch_array(db_query("SELECT b.mlid AS plid, b.bid FROM {book} b WHERE b.nid = %d", $book['parent'])); 205 $book = array_merge($book, $parent); 206 } 207 else { 208 // There is not a parent - this is a new book. 209 $book['plid'] = 0; 210 $book['bid'] = $book['nid']; 211 } 212 213 $book += array( 214 'module' => 'book', 215 'link_path' => 'node/'. $book['nid'], 216 'router_path' => 'node/%', 217 'menu_name' => 'book-toc-'. $book['bid'], 218 ); 219 $book = array_merge($book, db_fetch_array(db_query("SELECT title AS link_title FROM {node} WHERE nid = %d", $book['nid']))); 220 221 // Items with depth > MENU_MAX_DEPTH cannot be saved. 222 if (menu_link_save($book)) { 223 db_query("INSERT INTO {book} (mlid, nid, bid) VALUES (%d, %d, %d)", $book['mlid'], $book['nid'], $book['bid']); 224 } 225 else { 226 // The depth was greater then MENU_MAX_DEPTH, so attach it to the 227 // closest valid parent. 228 $book['plid'] = db_result(db_query("SELECT plid FROM {menu_links} WHERE mlid = %d", $book['plid'])); 229 if (menu_link_save($book)) { 230 db_query("INSERT INTO {book} (mlid, nid, bid) VALUES (%d, %d, %d)", $book['mlid'], $book['nid'], $book['bid']); 231 } 232 } 233 $update_count--; 234 } 235 $ret['#finished'] = FALSE; 236 } 237 238 if (empty($_SESSION['book_update_6000'])) { 239 $ret['#finished'] = TRUE; 240 $ret[] = array('success' => TRUE, 'query' => 'Relocated existing book pages.'); 241 $ret[] = update_sql("DROP TABLE {book_temp}"); 242 unset($_SESSION['book_update_6000']); 243 unset($_SESSION['book_update_6000_orphans']); 244 } 245 246 return $ret; 247 } 248 249 /** 250 * Implementation of hook_schema(). 251 */ 252 function book_schema() { 253 $schema['book'] = array( 254 'description' => 'Stores book outline information. Uniquely connects each node in the outline to a link in {menu_links}', 255 'fields' => array( 256 'mlid' => array( 257 'type' => 'int', 258 'unsigned' => TRUE, 259 'not null' => TRUE, 260 'default' => 0, 261 'description' => "The book page's {menu_links}.mlid.", 262 ), 263 'nid' => array( 264 'type' => 'int', 265 'unsigned' => TRUE, 266 'not null' => TRUE, 267 'default' => 0, 268 'description' => "The book page's {node}.nid.", 269 ), 270 'bid' => array( 271 'type' => 'int', 272 'unsigned' => TRUE, 273 'not null' => TRUE, 274 'default' => 0, 275 'description' => "The book ID is the {book}.nid of the top-level page.", 276 ), 277 ), 278 'primary key' => array('mlid'), 279 'unique keys' => array( 280 'nid' => array('nid'), 281 ), 282 'indexes' => array( 283 'bid' => array('bid'), 284 ), 285 ); 286 287 return $schema; 288 } 289 290
title
Description
Body
title
Description
Body
title
Description
Body
title
Body
| Generated: Thu Mar 24 11:18:33 2011 | Cross-referenced by PHPXref 0.7 |