upgrade omega again
[indybay:drupal.git] / docs / sites / all / modules / contrib / context / context.core.inc
1 <?php
2
3 /**
4  * Implementation of hook_help().
5  */
6 function context_help($path, $arg) {
7   switch ($path) {
8     case 'admin/help#context':
9       $output = file_get_contents(drupal_get_path('module', 'context') . '/README.txt');
10       return module_exists('markdown') ? filter_xss_admin(module_invoke('markdown', 'filter', 'process', 0, -1, $output)) : '<pre>' . check_plain($output) . '</pre>';
11   }
12 }
13
14 /**
15  * Implementation of hook_theme().
16  */
17 function context_theme() {
18   $items = array();
19   if (!module_exists('block')) {
20     $items['block'] = array(
21       'render element' => 'elements',
22       'template' => 'block',
23       'path' => drupal_get_path('module', 'block'),
24       'file' => 'block.module',
25       'template' => 'block',
26     );
27   }
28   $items['context_block_form'] = array(
29     'render element' => 'form',
30     'path' => drupal_get_path('module', 'context') . '/theme',
31     'file' => 'context_reaction_block.theme.inc',
32   );
33   $items['context_block_regions_form'] = array(
34     'render element' => 'form',
35     'path' => drupal_get_path('module', 'context') . '/theme',
36     'file' => 'context_reaction_block.theme.inc',
37   );
38   $items['context_block_editor'] = array(
39     'render element' => 'form',
40     'path' => drupal_get_path('module', 'context') . '/theme',
41     'file' => 'context_reaction_block.theme.inc',
42   );
43   $items['context_block_browser'] = array(
44     'variables' => array('blocks' => array(), 'context' => array()),
45     'path' => drupal_get_path('module', 'context') . '/theme',
46     'template' => 'context-block-browser',
47     'file' => 'context_reaction_block.theme.inc',
48   );
49   $items['context_block_browser_item'] = array(
50     'variables' => array('block' => array()),
51     'path' => drupal_get_path('module', 'context') . '/theme',
52     'template' => 'context-block-browser-item',
53     'file' => 'context_reaction_block.theme.inc',
54   );
55   $items['context_block_script_placeholder'] = array(
56     'variables' => array('text' => NULL),
57     'path' => drupal_get_path('module', 'context') . '/theme',
58     'file' => 'context_reaction_block.theme.inc',
59   );
60   return $items;
61 }
62
63 /**
64  * Implementation of hook_theme_registry_alter().
65  */
66 function context_theme_registry_alter(&$theme_registry) {
67   // Push theme_page() through a context_preprocess to provide
68   // context-sensitive menus and variables. Ensure that
69   // context_preprocess_page() comes immediately after
70   // template_preprocess_page().
71   $position = array_search('context_preprocess_page', $theme_registry['page']['preprocess functions']);
72   if ($position !== FALSE) {
73     unset($theme_registry['page']['preprocess functions'][$position]);
74   }
75   // Prevent conflict with i18n_menu.
76   if (module_exists('i18n_menu')) {
77     $position = array_search('i18n_menu_preprocess_page', $theme_registry['page']['preprocess functions']);
78   }
79   else {
80     $position = array_search('template_preprocess_page', $theme_registry['page']['preprocess functions']);
81   }
82   $position = $position ? $position + 1 : 2;
83   array_splice($theme_registry['page']['preprocess functions'], $position, 0, 'context_preprocess_page');
84 }
85
86 /**
87  * Implementation of hook_ctools_render_alter().
88  * Used to detect the presence of a page manager node view or node form.
89  */
90 function context_ctools_render_alter($info, $page, $data) {
91   extract($data);
92   if ($page && in_array($task['name'], array('node_view', 'node_edit'), TRUE)) {
93     foreach ($contexts as $ctools_context) {
94       if (in_array('node', $ctools_context->type) && !empty($ctools_context->data)) {
95         context_node_condition($ctools_context->data, $task['name'] === 'node_view' ? 'view' : 'form');
96         break;
97       }
98     }
99   }
100 }
101
102 /**
103  * Implementation of hook_entity_prepare_view().
104  */
105 function context_entity_prepare_view($prepare, $entity_type) {
106   if ($entity_type === 'taxonomy_term' && count($prepare) === 1) {
107     $term = reset($prepare);
108     if ($term === menu_get_object('taxonomy_term', 2) && $plugin = context_get_plugin('condition', 'taxonomy_term')) {
109       $plugin->execute($term, 'view');
110     }
111   }
112 }
113
114 /**
115  * Implementation of hook_node_view().
116  */
117 function context_node_view($node, $view_mode) {
118   if ($view_mode === 'full') {
119     $object = menu_get_object();
120     if (isset($object->nid) && $object->nid === $node->nid) {
121       context_node_condition($node, 'view');
122     }
123   }
124 }
125
126 /**
127  * Implementation of hook_form_alter().
128  */
129 function context_form_alter(&$form, $form_state, $form_id) {
130   // If the form is an admin for, flag it so that we can force a rebuild if needed.
131   if (path_is_admin($_GET['q'])) {
132     $form['#submit'][] = 'context_admin_form_submit';
133   }
134   // Trigger the condition in an after_build function to avoid being skipped
135   // when there are validation errors.
136   $form['#after_build'][] = 'context_form_alter_node_after_build';
137 }
138
139 /**
140  * Form #after_build callback for context_form_alter().
141  */
142 function context_form_alter_node_after_build($form, &$form_state) {
143   // Prevent this from firing on admin pages... damn form driven apis...
144   if (!empty($form['#node_edit_form']) && arg(0) != 'admin') {
145     context_node_condition($form['#node'], 'form');
146   }
147   return $form;
148 }
149
150 /**
151  * Clear out block info cache when an admin area form is submitted.
152  */
153 function context_admin_form_submit(&$form, $form_state) {
154   if ($plugin = context_get_plugin('reaction', 'block')) {
155     $plugin->rebuild_needed(TRUE);
156   }
157 }
158
159 /**
160  * Centralized node condition call function for the ever increasing number of
161  * ways to get at a node view / node form.
162  */
163 function context_node_condition(&$node, $op) {
164   if ($plugin = context_get_plugin('condition', 'node')) {
165     $plugin->execute($node, $op);
166   }
167   if (module_exists('taxonomy')) {
168     if ($plugin = context_get_plugin('condition', 'node_taxonomy')) {
169       $plugin->execute($node, $op);
170     }
171   }
172   if (module_exists('book')) {
173     if ($plugin = context_get_plugin('condition', 'book')) {
174       $plugin->execute($node, $op);
175     }
176     if ($plugin = context_get_plugin('condition', 'bookroot')) {
177       $plugin->execute($node, $op);
178     }
179   }
180   // Allow other plugins to easily be triggered on node-related events.
181   drupal_alter('context_node_condition', $node, $op);
182 }
183
184 /**
185  * Implementation of hook_form_alter() for system_modules_form.
186  */
187 function context_form_system_modules_form_alter(&$form, $form_state) {
188   context_invalidate_cache();
189 }
190
191 /**
192  * Implementation of hook_form_alter() for user_profile_form.
193  */
194 function context_form_user_profile_form_alter(&$form, $form_state) {
195   if ($plugin = context_get_plugin('condition', 'user_page')) {
196     $plugin->execute($form['#user'], 'form');
197   }
198 }
199
200 /**
201  * Implementation of hook_form_alter() for user_register_form.
202  */
203 function context_form_user_register_form_alter(&$form, $form_state) {
204   if ($plugin = context_get_plugin('condition', 'user_page')) {
205     $plugin->execute($form['#user'], 'register');
206   }
207 }
208
209 /**
210  * Implementation of hook_form_alter() for comment_form.
211  */
212 function context_form_comment_form_alter(&$form, $form_state) {
213   if ($nid = $form['nid']['#value']) {
214     $node = node_load($nid);
215     context_node_condition($node, 'comment');
216   }
217 }
218
219 /**
220  * Implementation of hook_views_pre_view().
221  */
222 function context_views_pre_view($view, $display) {
223   if ($plugin = context_get_plugin('condition', 'views')) {
224     $plugin->execute($view);
225   }
226   // Support Views overrides of specific entity paths.
227   if ($view->display_handler->has_path()) {
228     switch ($view->display_handler->get_option('path')) {
229       case 'taxonomy/term/%':
230         if (($term = taxonomy_term_load(arg(2))) && ($plugin = context_get_plugin('condition', 'taxonomy_term'))) {
231           $plugin->execute($term, 'view');
232         }
233         break;
234       case 'node/%':
235         if ($node = node_load(arg(1))) {
236           context_node_condition($node, 'view');
237         }
238         break;
239       case 'user/%':
240         if (($account = user_load(arg(1))) && ($plugin = context_get_plugin('condition', 'user_page'))) {
241           $plugin->execute($account, 'view');
242         }
243         break;
244     }
245   }
246 }
247
248 /**
249  * Implementation of hook_user().
250  */
251 function context_user_view($account, $view_mode) {
252   if ($view_mode === 'full' && $plugin = context_get_plugin('condition', 'user_page')) {
253     $plugin->execute($account, 'view');
254   }
255 }
256
257 /**
258  * Implements hook_page_build().
259  */
260 function context_page_build(&$page) {
261   module_invoke_all('context_page_condition');
262   module_invoke_all('context_page_reaction');
263   if ($plugin = context_get_plugin('reaction', 'block')) {
264     $plugin->execute($page);
265   }
266
267   // See block_page_build. Clear static cache b/c in overlay form submissions
268   // hook_page_build can get called more than once per page load.
269   drupal_static_reset('context_reaction_block_list');
270 }
271
272 /**
273  * THEME FUNCTIONS & RELATED ==========================================
274  */
275
276 /**
277  * Generates an array of links (suitable for use with theme_links)
278  * to the node forms of types associated with current active contexts.
279  */
280 function context_links($reset = FALSE) {
281   static $links;
282   if (!$links || $reset) {
283     $contexts = context_active_contexts();
284     $active_types = array();
285     $conditions = array('node', 'bookroot');
286     foreach ($conditions as $condition) {
287       foreach ($contexts as $k => $v) {
288         if (!empty($v->conditions[$condition]['values'])) {
289           $active_types = array_merge($active_types, array_filter($v->conditions[$condition]['values']));
290         }
291       }
292     }
293
294     $links = array();
295     if (!empty($active_types)) {
296       // Iterate over active contexts
297       foreach ($active_types as $type) {
298         $add_url = 'node/add/' . str_replace('_', '-', $type);
299         $item = menu_get_item($add_url);
300         if ($item && $item['access'] && strpos($_GET['q'], $add_url) !== 0) {
301           $links[$type] = array('title' => t('Add @type', array('@type' => node_type_get_name($type))), 'href' => $add_url);
302         }
303       }
304     }
305     drupal_alter('context_links', $links);
306     uasort($links, 'element_sort');
307   }
308   return $links;
309 }
310
311 /**
312  * Implementation of hook_context_page_condition().
313  */
314 function context_context_page_condition() {
315   if ($plugin = context_get_plugin('condition', 'menu')) {
316     $plugin->execute();
317   }
318   if ($plugin = context_get_plugin('condition', 'sitewide')) {
319     $plugin->execute(1);
320   }
321   if ($plugin = context_get_plugin('condition', 'context')) {
322     $plugin->execute();
323   }
324 }
325
326 /**
327  * Implementation of hook_context_page_reaction().
328  */
329 function context_context_page_reaction() {
330   if ($plugin = context_get_plugin('reaction', 'breadcrumb')) {
331     $plugin->execute();
332   }
333   if ($plugin = context_get_plugin('reaction', 'css_injector')) {
334     $plugin->execute();
335   }
336   if ($plugin = context_get_plugin('reaction', 'debug')) {
337     $plugin->execute();
338   }
339 }
340
341 /**
342  * Implementation of hook_preprocess_page().
343  */
344 function context_preprocess_page(&$vars) {
345   if ($plugin = context_get_plugin('reaction', 'menu')) {
346     $plugin->execute($vars);
347   }
348   if ($plugin = context_get_plugin('reaction', 'theme')) {
349     $plugin->execute($vars);
350   }
351   /*
352   if ($context_links = context_links()) {
353     $vars['context_links'] = theme('links', $context_links);
354   }
355   else {
356     $vars['context_links'] = '';
357   }
358   */
359 }
360
361 /**
362  * Implementation of hook_preprocess_html().
363  */
364 function context_preprocess_html(&$vars) {
365   if ($plugin = context_get_plugin('reaction', 'theme_html')) {
366     $plugin->execute($vars);
367   }
368 }