Mercurial > hg > rr-repo
comparison modules/forum/forum.install @ 0:ff03f76ab3fe
initial version
author | danieleb <danielebarchiesi@me.com> |
---|---|
date | Wed, 21 Aug 2013 18:51:11 +0100 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:ff03f76ab3fe |
---|---|
1 <?php | |
2 | |
3 /** | |
4 * @file | |
5 * Install, update, and uninstall functions for the Forum module. | |
6 */ | |
7 | |
8 /** | |
9 * Implements hook_install(). | |
10 */ | |
11 function forum_install() { | |
12 // Set the weight of the forum.module to 1 so it is loaded after the taxonomy.module. | |
13 db_update('system') | |
14 ->fields(array('weight' => 1)) | |
15 ->condition('name', 'forum') | |
16 ->execute(); | |
17 // Forum topics are published by default, but do not have any other default | |
18 // options set (for example, they are not promoted to the front page). | |
19 variable_set('node_options_forum', array('status')); | |
20 } | |
21 | |
22 /** | |
23 * Implements hook_enable(). | |
24 */ | |
25 function forum_enable() { | |
26 // If we enable forum at the same time as taxonomy we need to call | |
27 // field_associate_fields() as otherwise the field won't be enabled until | |
28 // hook modules_enabled is called which takes place after hook_enable events. | |
29 field_associate_fields('taxonomy'); | |
30 // Create the forum vocabulary if it does not exist. | |
31 $vocabulary = taxonomy_vocabulary_load(variable_get('forum_nav_vocabulary', 0)); | |
32 if (!$vocabulary) { | |
33 $edit = array( | |
34 'name' => t('Forums'), | |
35 'machine_name' => 'forums', | |
36 'description' => t('Forum navigation vocabulary'), | |
37 'hierarchy' => 1, | |
38 'module' => 'forum', | |
39 'weight' => -10, | |
40 ); | |
41 $vocabulary = (object) $edit; | |
42 taxonomy_vocabulary_save($vocabulary); | |
43 variable_set('forum_nav_vocabulary', $vocabulary->vid); | |
44 } | |
45 | |
46 // Create the 'taxonomy_forums' field if it doesn't already exist. | |
47 if (!field_info_field('taxonomy_forums')) { | |
48 $field = array( | |
49 'field_name' => 'taxonomy_forums', | |
50 'type' => 'taxonomy_term_reference', | |
51 'settings' => array( | |
52 'allowed_values' => array( | |
53 array( | |
54 'vocabulary' => $vocabulary->machine_name, | |
55 'parent' => 0, | |
56 ), | |
57 ), | |
58 ), | |
59 ); | |
60 field_create_field($field); | |
61 | |
62 // Create a default forum so forum posts can be created. | |
63 $edit = array( | |
64 'name' => t('General discussion'), | |
65 'description' => '', | |
66 'parent' => array(0), | |
67 'vid' => $vocabulary->vid, | |
68 ); | |
69 $term = (object) $edit; | |
70 taxonomy_term_save($term); | |
71 | |
72 // Create the instance on the bundle. | |
73 $instance = array( | |
74 'field_name' => 'taxonomy_forums', | |
75 'entity_type' => 'node', | |
76 'label' => $vocabulary->name, | |
77 'bundle' => 'forum', | |
78 'required' => TRUE, | |
79 'widget' => array( | |
80 'type' => 'options_select', | |
81 ), | |
82 'display' => array( | |
83 'default' => array( | |
84 'type' => 'taxonomy_term_reference_link', | |
85 'weight' => 10, | |
86 ), | |
87 'teaser' => array( | |
88 'type' => 'taxonomy_term_reference_link', | |
89 'weight' => 10, | |
90 ), | |
91 ), | |
92 ); | |
93 field_create_instance($instance); | |
94 } | |
95 | |
96 // Ensure the forum node type is available. | |
97 node_types_rebuild(); | |
98 $types = node_type_get_types(); | |
99 node_add_body_field($types['forum']); | |
100 } | |
101 | |
102 /** | |
103 * Implements hook_uninstall(). | |
104 */ | |
105 function forum_uninstall() { | |
106 // Load the dependent Taxonomy module, in case it has been disabled. | |
107 drupal_load('module', 'taxonomy'); | |
108 | |
109 variable_del('forum_containers'); | |
110 variable_del('forum_hot_topic'); | |
111 variable_del('forum_per_page'); | |
112 variable_del('forum_order'); | |
113 variable_del('forum_block_num_active'); | |
114 variable_del('forum_block_num_new'); | |
115 variable_del('node_options_forum'); | |
116 | |
117 field_delete_field('taxonomy_forums'); | |
118 // Purge field data now to allow taxonomy module to be uninstalled | |
119 // if this is the only field remaining. | |
120 field_purge_batch(10); | |
121 } | |
122 | |
123 /** | |
124 * Implements hook_schema(). | |
125 */ | |
126 function forum_schema() { | |
127 $schema['forum'] = array( | |
128 'description' => 'Stores the relationship of nodes to forum terms.', | |
129 'fields' => array( | |
130 'nid' => array( | |
131 'type' => 'int', | |
132 'unsigned' => TRUE, | |
133 'not null' => TRUE, | |
134 'default' => 0, | |
135 'description' => 'The {node}.nid of the node.', | |
136 ), | |
137 'vid' => array( | |
138 'type' => 'int', | |
139 'unsigned' => TRUE, | |
140 'not null' => TRUE, | |
141 'default' => 0, | |
142 'description' => 'Primary Key: The {node}.vid of the node.', | |
143 ), | |
144 'tid' => array( | |
145 'type' => 'int', | |
146 'unsigned' => TRUE, | |
147 'not null' => TRUE, | |
148 'default' => 0, | |
149 'description' => 'The {taxonomy_term_data}.tid of the forum term assigned to the node.', | |
150 ), | |
151 ), | |
152 'indexes' => array( | |
153 'forum_topic' => array('nid', 'tid'), | |
154 'tid' => array('tid'), | |
155 ), | |
156 'primary key' => array('vid'), | |
157 'foreign keys' => array( | |
158 'forum_node' => array( | |
159 'table' => 'node', | |
160 'columns' => array( | |
161 'nid' => 'nid', | |
162 'vid' => 'vid', | |
163 ), | |
164 ), | |
165 ), | |
166 ); | |
167 | |
168 $schema['forum_index'] = array( | |
169 'description' => 'Maintains denormalized information about node/term relationships.', | |
170 'fields' => array( | |
171 'nid' => array( | |
172 'description' => 'The {node}.nid this record tracks.', | |
173 'type' => 'int', | |
174 'unsigned' => TRUE, | |
175 'not null' => TRUE, | |
176 'default' => 0, | |
177 ), | |
178 'title' => array( | |
179 'description' => 'The title of this node, always treated as non-markup plain text.', | |
180 'type' => 'varchar', | |
181 'length' => 255, | |
182 'not null' => TRUE, | |
183 'default' => '', | |
184 ), | |
185 'tid' => array( | |
186 'description' => 'The term ID.', | |
187 'type' => 'int', | |
188 'unsigned' => TRUE, | |
189 'not null' => TRUE, | |
190 'default' => 0, | |
191 ), | |
192 'sticky' => array( | |
193 'description' => 'Boolean indicating whether the node is sticky.', | |
194 'type' => 'int', | |
195 'not null' => FALSE, | |
196 'default' => 0, | |
197 'size' => 'tiny', | |
198 ), | |
199 'created' => array( | |
200 'description' => 'The Unix timestamp when the node was created.', | |
201 'type' => 'int', | |
202 'unsigned' => TRUE, | |
203 'not null' => TRUE, | |
204 'default'=> 0, | |
205 ), | |
206 'last_comment_timestamp' => array( | |
207 'type' => 'int', | |
208 'not null' => TRUE, | |
209 'default' => 0, | |
210 'description' => 'The Unix timestamp of the last comment that was posted within this node, from {comment}.timestamp.', | |
211 ), | |
212 'comment_count' => array( | |
213 'type' => 'int', | |
214 'unsigned' => TRUE, | |
215 'not null' => TRUE, | |
216 'default' => 0, | |
217 'description' => 'The total number of comments on this node.', | |
218 ), | |
219 ), | |
220 'indexes' => array( | |
221 'forum_topics' => array('nid', 'tid', 'sticky', 'last_comment_timestamp'), | |
222 'created' => array('created'), | |
223 'last_comment_timestamp' => array('last_comment_timestamp'), | |
224 ), | |
225 'foreign keys' => array( | |
226 'tracked_node' => array( | |
227 'table' => 'node', | |
228 'columns' => array('nid' => 'nid'), | |
229 ), | |
230 'term' => array( | |
231 'table' => 'taxonomy_term_data', | |
232 'columns' => array( | |
233 'tid' => 'tid', | |
234 ), | |
235 ), | |
236 ), | |
237 ); | |
238 | |
239 | |
240 return $schema; | |
241 } | |
242 | |
243 /** | |
244 * Implements hook_update_dependencies(). | |
245 */ | |
246 function forum_update_dependencies() { | |
247 $dependencies['forum'][7003] = array( | |
248 // Forum update 7003 uses field API update functions, so must run after | |
249 // Field API has been enabled. | |
250 'system' => 7020, | |
251 // Forum update 7003 relies on updated taxonomy module schema. Ensure it | |
252 // runs after all taxonomy updates. | |
253 'taxonomy' => 7010, | |
254 ); | |
255 return $dependencies; | |
256 } | |
257 | |
258 /** | |
259 * Add new index to forum table. | |
260 */ | |
261 function forum_update_7000() { | |
262 db_drop_index('forum', 'nid'); | |
263 db_add_index('forum', 'forum_topic', array('nid', 'tid')); | |
264 } | |
265 | |
266 /** | |
267 * Create new {forum_index} table. | |
268 */ | |
269 function forum_update_7001() { | |
270 $forum_index = array( | |
271 'description' => 'Maintains denormalized information about node/term relationships.', | |
272 'fields' => array( | |
273 'nid' => array( | |
274 'description' => 'The {node}.nid this record tracks.', | |
275 'type' => 'int', | |
276 'unsigned' => TRUE, | |
277 'not null' => TRUE, | |
278 'default' => 0, | |
279 ), | |
280 'title' => array( | |
281 'description' => 'The title of this node, always treated as non-markup plain text.', | |
282 'type' => 'varchar', | |
283 'length' => 255, | |
284 'not null' => TRUE, | |
285 'default' => '', | |
286 ), | |
287 'tid' => array( | |
288 'description' => 'The term ID.', | |
289 'type' => 'int', | |
290 'unsigned' => TRUE, | |
291 'not null' => TRUE, | |
292 'default' => 0, | |
293 ), | |
294 'sticky' => array( | |
295 'description' => 'Boolean indicating whether the node is sticky.', | |
296 'type' => 'int', | |
297 'not null' => FALSE, | |
298 'default' => 0, | |
299 'size' => 'tiny', | |
300 ), | |
301 'created' => array( | |
302 'description' => 'The Unix timestamp when the node was created.', | |
303 'type' => 'int', | |
304 'unsigned' => TRUE, | |
305 'not null' => TRUE, | |
306 'default'=> 0, | |
307 ), | |
308 'last_comment_timestamp' => array( | |
309 'type' => 'int', | |
310 'not null' => TRUE, | |
311 'default' => 0, | |
312 'description' => 'The Unix timestamp of the last comment that was posted within this node, from {comment}.timestamp.', | |
313 ), | |
314 'comment_count' => array( | |
315 'type' => 'int', | |
316 'unsigned' => TRUE, | |
317 'not null' => TRUE, | |
318 'default' => 0, | |
319 'description' => 'The total number of comments on this node.', | |
320 ), | |
321 ), | |
322 'indexes' => array( | |
323 'forum_topics' => array('tid', 'sticky', 'last_comment_timestamp'), | |
324 ), | |
325 'foreign keys' => array( | |
326 'tracked_node' => array( | |
327 'table' => 'node', | |
328 'columns' => array('nid' => 'nid'), | |
329 ), | |
330 'term' => array( | |
331 'table' => 'taxonomy_term_data', | |
332 'columns' => array( | |
333 'tid' => 'tid', | |
334 ), | |
335 ), | |
336 ), | |
337 ); | |
338 db_create_table('forum_index', $forum_index); | |
339 | |
340 $select = db_select('node', 'n'); | |
341 $forum_alias = $select->join('forum', 'f', 'n.vid = f.vid'); | |
342 $ncs_alias = $select->join('node_comment_statistics', 'ncs', 'n.nid = ncs.nid'); | |
343 $select | |
344 ->fields('n', array('nid', 'title', 'sticky', 'created')) | |
345 ->fields($forum_alias, array('tid')) | |
346 ->fields($ncs_alias, array('last_comment_timestamp', 'comment_count')); | |
347 | |
348 db_insert('forum_index') | |
349 ->fields(array('nid', 'title', 'sticky', 'created', 'tid', 'last_comment_timestamp', 'comment_count')) | |
350 ->from($select) | |
351 ->execute(); | |
352 } | |
353 | |
354 /** | |
355 * @addtogroup updates-7.x-extra | |
356 * @{ | |
357 */ | |
358 | |
359 /** | |
360 * Add new index to forum_index table. | |
361 */ | |
362 function forum_update_7002() { | |
363 db_drop_index('forum_index', 'forum_topics'); | |
364 db_add_index('forum_index', 'forum_topics', array('nid', 'tid', 'sticky', 'last_comment_timestamp')); | |
365 } | |
366 | |
367 /** | |
368 * Rename field to 'taxonomy_forums'. | |
369 */ | |
370 function forum_update_7003() { | |
371 $messages = array(); | |
372 | |
373 $new_field_name = 'taxonomy_forums'; | |
374 | |
375 // Test to see if the taxonomy_forums field exists. | |
376 $fields = _update_7000_field_read_fields(array('field_name' => $new_field_name)); | |
377 if ($fields) { | |
378 // Since the field exists, we're done. | |
379 return; | |
380 } | |
381 | |
382 // Calculate the old field name. | |
383 $vid = variable_get('forum_nav_vocabulary', 0); | |
384 $vocabulary_machine_name = db_select('taxonomy_vocabulary', 'tv') | |
385 ->fields('tv', array('machine_name')) | |
386 ->condition('vid', $vid) | |
387 ->execute() | |
388 ->fetchField(); | |
389 $old_field_name = 'taxonomy_' . $vocabulary_machine_name; | |
390 | |
391 // Read the old fields. | |
392 $old_fields = _update_7000_field_read_fields(array('field_name' => $old_field_name)); | |
393 foreach ($old_fields as $old_field) { | |
394 if ($old_field['storage']['type'] != 'field_sql_storage') { | |
395 $messages[] = t('Cannot rename field %id (%old_field_name) to %new_field_name because it does not use the field_sql_storage storage type.', array( | |
396 '%id' => $old_field['id'], | |
397 '%old_field_name' => $old_field_name, | |
398 '%new_field_name' => $new_field_name, | |
399 )); | |
400 continue; | |
401 } | |
402 | |
403 // Update {field_config}. | |
404 db_update('field_config') | |
405 ->fields(array('field_name' => $new_field_name)) | |
406 ->condition('id', $old_field['id']) | |
407 ->execute(); | |
408 | |
409 // Update {field_config_instance}. | |
410 db_update('field_config_instance') | |
411 ->fields(array('field_name' => $new_field_name)) | |
412 ->condition('field_id', $old_field['id']) | |
413 ->execute(); | |
414 | |
415 // The tables that need updating in the form 'old_name' => 'new_name'. | |
416 $tables = array( | |
417 'field_data_' . $old_field_name => 'field_data_' . $new_field_name, | |
418 'field_revision_' . $old_field_name => 'field_revision_' . $new_field_name, | |
419 ); | |
420 foreach ($tables as $old_table => $new_table) { | |
421 $old_column_name = $old_field_name . '_tid'; | |
422 $new_column_name = $new_field_name . '_tid'; | |
423 | |
424 // Rename the column. | |
425 db_drop_index($old_table, $old_column_name); | |
426 db_change_field($old_table, $old_column_name, $new_column_name, array( | |
427 'type' => 'int', | |
428 'unsigned' => TRUE, | |
429 'not null' => FALSE, | |
430 )); | |
431 db_drop_index($old_table, $new_column_name); | |
432 db_add_index($old_table, $new_column_name, array($new_column_name)); | |
433 | |
434 // Rename the table. | |
435 db_rename_table($old_table, $new_table); | |
436 } | |
437 } | |
438 | |
439 cache_clear_all('*', 'cache_field', TRUE); | |
440 | |
441 return $messages; | |
442 } | |
443 | |
444 /** | |
445 * Update {forum_index} so that only published nodes are indexed. | |
446 */ | |
447 function forum_update_7011() { | |
448 $select = db_select('node', 'n') | |
449 ->fields('n', array('nid')) | |
450 ->condition('status', 0 ); | |
451 | |
452 db_delete('forum_index') | |
453 ->condition('nid', $select, 'IN') | |
454 ->execute(); | |
455 } | |
456 | |
457 /** | |
458 * Add 'created' and 'last_comment_timestamp' indexes. | |
459 */ | |
460 function forum_update_7012() { | |
461 db_add_index('forum_index', 'created', array('created')); | |
462 db_add_index('forum_index', 'last_comment_timestamp', array('last_comment_timestamp')); | |
463 } | |
464 | |
465 /** | |
466 * @} End of "addtogroup updates-7.x-extra". | |
467 */ |