upgrade to OpenPublish 7.x-1.0-alpha9
[eupraxis:fsrn.git] / openpublish / profiles / openpublish / modules / contrib / context / context_ui / context_ui.module
1 <?php
2
3 /**
4  * Implementation of hook_ctools_plugin_directory().
5  */
6 function context_ui_ctools_plugin_directory($module, $plugin) {
7   if ($module == 'ctools' && $plugin == 'export_ui') {
8     return 'export_ui';
9   }
10 }
11
12 /**
13  * Implementation of hook_theme().
14  */
15 function context_ui_theme() {
16   $items = array();
17   $items['context_ui_form'] = array(
18     'render element' => 'form',
19     'path' => drupal_get_path('module', 'context_ui') .'/theme',
20     'template' => 'context-ui-form',
21     'file' => 'theme.inc',
22   );
23   $items['context_ui_plugins'] = array(
24     'render element' => 'form',
25     'path' => drupal_get_path('module', 'context_ui') .'/theme',
26     'template' => 'context-ui-plugins',
27     'file' => 'theme.inc',
28   );
29   $items['context_ui_editor'] = array(
30     'render element' => 'form',
31     'path' => drupal_get_path('module', 'context_ui') .'/theme',
32     'template' => 'context-ui-editor',
33     'file' => 'theme.inc',
34   );
35   return $items;
36 }
37
38 /**
39  * Implementation of hook_block_info().
40  */
41 function context_ui_block_info() {
42   $blocks = array();
43   $blocks['editor'] = array('info' => t('Context editor'), 'admin' => TRUE);
44   if (module_exists('devel')) {
45     $blocks['devel'] = array('info' => t('Context inspector'), 'admin' => TRUE);
46   }
47   return $blocks;
48 }
49
50 /**
51  * Implementation of hook_block_view().
52  */
53 function context_ui_block_view($delta = '') {
54   switch ($delta) {
55     case 'editor':
56       if (user_access('administer site configuration') && strpos($_GET['q'], 'admin/structure/context') === FALSE && $contexts = context_active_contexts()) {
57         return array(
58           'subject' => t('Context editor'),
59           'content' => drupal_get_form('context_ui_editor', $contexts),
60         );
61       }
62       break;
63     case 'devel':
64       if (module_exists('devel') && $all = context_get()) {
65         return array(
66           'subject' => t('Context inspector'),
67           'content' => kdevel_print_object($all),
68         );
69       }
70       break;
71   }
72 }
73
74 /**
75  * Implementation of hook_menu().
76  */
77 function context_ui_menu() {
78   $items = array();
79   $items['admin/structure/context/settings'] = array(
80     'title' => 'Settings',
81     'access callback' => 'user_access',
82     'access arguments' => array('administer site configuration'),
83     'page callback' => 'drupal_get_form',
84     'page arguments' => array('context_ui_settings'),
85     'type' => MENU_LOCAL_TASK,
86     'weight' => 3,
87   );
88   return $items;
89 }
90
91 /**
92  * Implementation of hook_help().
93  */
94 function context_ui_help($path, $arg) {
95   switch ($path) {
96     case 'admin/help#context_ui':
97       $output = file_get_contents(drupal_get_path('module', 'context_ui') .'/README.txt');
98       return module_exists('markdown') ? filter_xss_admin(module_invoke('markdown', 'filter', 'process', 0, -1, $output)) : '<pre>'. check_plain($output) .'</pre>';
99     case 'admin/structure/context':
100       return '<p>'. t('Context allows you to manage contextual conditions and reactions for different portions of your site. You can think of each context as representing a "section" of your site. For each context, you can choose the conditions that trigger this context to be active and choose different aspects of Drupal that should react to this active context.') .'</p>';
101   }
102 }
103
104 /**
105  * Inline context editor form.
106  */
107 function context_ui_editor($form, &$form_state, $contexts) {
108   $form = array(
109     '#attributes' => array('class' => array('context-editor')),
110     '#theme' => array('context_ui_editor'),
111     'editables' => array(),
112     'contexts' => array('#tree' => TRUE),
113     'buttons' => array('#tree' => FALSE),
114   );
115
116   $items = array();
117   $form_context = array();
118   ksort($contexts);
119
120   foreach ($contexts as $context) {
121     $edit = l(t('Edit'), $_GET['q'], array('fragment' => $context->name, 'attributes' => array('class' => array('edit'))));
122     $done = l(t('Done'), $_GET['q'], array('fragment' => $context->name, 'attributes' => array('class' => array('done'))));
123     $items[] = array(
124       'data' => "<div class='label'>" . (empty($context->description) ? $context->name : check_plain($context->description)) ."</div><div class='links'>{$edit} {$done}</div>",
125       'class' => array('context-editable clearfix'),
126       'id' => "context-editable-trigger-{$context->name}",
127     );
128     $form_context = array(
129       '#tree' => TRUE,
130       '#type' => module_exists('admin') ? 'admin_panes' : NULL,
131       'context' => array('#type' => 'value', '#value' => $context),
132     );
133
134     // Edit context conditions.
135     foreach (array_keys(context_conditions()) as $condition) {
136       $plugin = context_get_plugin('condition', $condition);
137       if (method_exists($plugin, 'editor_form') && ($plugin_form = $plugin->editor_form($context))) {
138         $form_context['condition'][$condition] = $plugin_form;
139       }
140     }
141     if (count(element_children($form_context['condition']))) {
142       $form_context['condition']['#title'] = t('Conditions');
143       $form_context['condition']['#description'] = t('This context is active when any of the selected conditions are true.');
144     }
145
146     // Edit context reactions.
147     foreach (array_keys(context_reactions()) as $reaction) {
148       $plugin = context_get_plugin('reaction', $reaction);
149       if (method_exists($plugin, 'editor_form') && ($plugin_form = $plugin->editor_form($context))) {
150         $form_context["reaction-{$reaction}"] = $plugin_form + array('#title' => $plugin->title);
151       }
152     }
153
154     // Add to main form.
155     $form['contexts'][$context->name] = $form_context;
156   }
157
158   // Display editable contexts in list.
159   $form['editables']['#markup'] = theme('item_list', array('items' => $items));
160
161   // Buttons.
162   $form['buttons']['save'] = array(
163     '#type' => 'submit',
164     '#value' => t('Save changes'),
165     '#submit' => array('context_ui_editor_submit'),
166   );
167   $form['buttons']['cancel'] = array(
168     '#type' => 'submit',
169     '#value' => t('Cancel'),
170     '#submit' => array('context_ui_editor_cancel'),
171   );
172   return $form;
173 }
174
175 /**
176  * Values processor for context_ui_editor_submit().
177  * Split out for reuse by overriding submit handlers.
178  */
179 function context_ui_editor_process($values) {
180   $context = $values['context'];
181   foreach (array_keys(context_conditions()) as $condition) {
182     if (isset($values['condition'][$condition])) {
183       $plugin = context_get_plugin('condition', $condition);
184       if ($plugin && method_exists($plugin, 'editor_form_submit')) {
185         $context->conditions[$condition]['values'] = $plugin->editor_form_submit($context, $values['condition'][$condition]);
186       }
187     }
188     if (isset($context->conditions[$condition]) && context_empty($context->conditions[$condition]['values'])) {
189       unset($context->conditions[$condition]);
190     }
191   }
192   foreach (array_keys(context_reactions()) as $reaction) {
193     if (isset($values["reaction-{$reaction}"])) {
194       $plugin = context_get_plugin('reaction', $reaction);
195       if ($plugin && method_exists($plugin, 'editor_form_submit')) {
196         $context->reactions[$reaction] = $plugin->editor_form_submit($context, $values["reaction-{$reaction}"]);
197       }
198     }
199     if (isset($context->reactions[$reaction]) && context_empty($context->reactions[$reaction])) {
200       unset($context->reactions[$reaction]);
201     }
202   }
203   return $context;
204 }
205
206 /**
207  * Save handler for context_block_editor().
208  */
209 function context_ui_editor_submit(&$form, &$form_state) {
210   foreach ($form_state['values']['contexts'] as $name => $values) {
211     $original_conditions = $values['context']->conditions;
212     $original_reactions = $values['context']->reactions;
213     $context = context_ui_editor_process($values);
214     if (($original_conditions !== $context->conditions) || ($original_reactions !== $context->reactions)) {
215       if (context_save($context)) {
216         drupal_set_message(t('Saved %title.', array(
217           '%title' => (!empty($context->description) ? $context->description : $context->name)
218         )));
219       }
220       else {
221         drupal_set_message(t('Could not save context %title.', array('%title' =>  $context->name)), 'error');
222       }
223     }
224   }
225   return;
226 }
227
228 /**
229  * Cancel handler for context_block_editor().
230  */
231 function context_ui_editor_cancel(&$form, &$form_state) {
232   return;
233 }
234
235 /**
236  * Settings form.
237  */
238 function context_ui_settings($form, &$form_state) {
239   $form = array();
240   foreach (context_conditions() as $condition => $info) {
241     if ($plugin = context_get_plugin('condition', $condition)) {
242       $settings_form = $plugin->settings_form();
243       if ($settings_form) {
244         $form['conditions'][$condition] = $settings_form;
245         $form['conditions'][$condition]['#tree'] = FALSE;
246         $form['conditions'][$condition]['#type'] = 'fieldset';
247         $form['conditions'][$condition]['#title'] = $info['title'];
248       }
249     }
250   }
251   foreach (context_reactions() as $reaction => $info) {
252     if ($plugin = context_get_plugin('reaction', $reaction)) {
253       $settings_form = $plugin->settings_form();
254       if ($settings_form) {
255         $form['reactions'][$reaction] = $settings_form;
256         $form['reactions'][$reaction]['#tree'] = FALSE;
257         $form['reactions'][$reaction]['#type'] = 'fieldset';
258         $form['reactions'][$reaction]['#title'] = $info['title'];
259       }
260     }
261   }
262   $form = system_settings_form($form);
263   $form['#submit'][] = 'context_ui_settings_submit';
264   return $form;
265 }
266
267 /**
268  * Extra submit handler for context_ui_settings.
269  * Mark the menu cache as needing a rebuild.
270  */
271 function context_ui_settings_submit($form, &$form_state) {
272   variable_set('menu_rebuild_needed', TRUE);
273 }