upgrade omega again
[indybay:drupal.git] / docs / sites / all / modules / contrib / context / context_layouts / plugins / context_layouts_reaction_block.inc
1 <?php
2
3 class context_layouts_reaction_block extends context_reaction_block {
4   /**
5    * Override of is_enabled_region().
6    * Check that there is an active layout and it supports the given region.
7    */
8   protected function is_enabled_region($region) {
9     $layout = $this->get_active_layout();
10     if ($layout && isset($layout['regions']) && is_array($layout['regions'])) {
11       return in_array($region, $layout['regions'], TRUE) && parent::is_enabled_region($region);
12     }
13     return parent::is_enabled_region($region);
14   }
15
16   /**
17    * Retrieve the first layout specified found by any active contexts.
18    */
19   function get_active_layout($info = TRUE) {
20     $contexts = $this->get_contexts();
21     $layouts = context_layouts_get_layouts();
22     if (!empty($contexts) && !empty($layouts)) {
23       foreach ($contexts as $context) {
24         $values = $this->fetch_from_context($context);
25         if (isset($values['layout']) && isset($layouts[$values['layout']])) {
26           return $info ? $layouts[$values['layout']] : $values['layout'];
27         }
28       }
29     }
30     // Fallback to default layout if provided.
31     if (isset($layouts['default'])) {
32       return $info ? $layouts['default'] : 'default';
33     }
34     return FALSE;
35   }
36
37   /**
38    * Add the layout template to page vars.
39    */
40   function add_layout_template(&$vars) {
41     if ($layout = $this->get_active_layout()) {
42       if (!empty($layout['template'])) {
43         global $theme;
44         $vars['theme_hook_suggestion'] = "page__context_layouts_{$theme}_{$layout['layout']}";
45       }
46     }
47   }
48
49   /**
50    * Add the layout stylesheet to the CSS.
51    */
52   function add_layout_stylesheet() {
53     if ($layout = $this->get_active_layout()) {
54       if (!empty($layout['stylesheet'])) {
55         drupal_add_css(drupal_get_path('theme', $layout['theme']) . '/' . $layout['stylesheet']);
56       }
57     }
58   }
59
60   /**
61    * Override of editor form.
62    */
63   function editor_form($context) {
64     drupal_add_css(drupal_get_path('module', 'context_layouts') . '/plugins/context_layouts_reaction_block.css');
65
66     $form = parent::editor_form($context);
67
68     if ($layouts = $this->get_layout_options()) {
69       $options = $this->fetch_from_context($context);
70       $form['layout'] = array(
71         // #tree *must* be true for our values to be nested correctly.
72         '#tree' => TRUE,
73         '#prefix' => '<div class="context-editor-block-layouts">',
74         '#suffix' => '</div>',
75         '#weight' => -100,
76         'layout' => array(
77           '#title' => t('Layout'),
78           '#options' => $layouts,
79           '#type' => 'select',
80           '#weight' => -100,
81           '#default_value' => isset($options['layout']) ? $options['layout'] : NULL,
82           '#required' => FALSE,
83           '#empty_value' => 0,
84           '#empty_option' => '- ' . t('Site default') . ' -',
85         ),
86         'update' => array(
87           '#value' => t('Change layout'),
88           '#type' => 'submit',
89         ),
90       );
91     }
92     return $form;
93   }
94
95   /**
96    * Override of editor form submit.
97    */
98   function editor_form_submit(&$context, $values) {
99     // Someone has changed the layout, assume that the block values are not actually usable here.
100     if (isset($context->reactions['block']['layout']) && $context->reactions['block']['layout'] != $values['layout']['layout']) {
101       $options = $context->reactions['block'];
102     }
103     else {
104       $options = parent::editor_form_submit($context, $values);
105     }
106
107     if (!empty($values['layout']['layout'])) {
108       $options['layout'] = $values['layout']['layout'];
109     }
110     else {
111       unset($options['layout']);
112     }
113     return $options;
114   }
115
116   /**
117    * Override of options form.
118    */
119   function options_form($context) {
120     $form = parent::options_form($context);
121     $options = $this->fetch_from_context($context);
122
123     // Only alter the options form if the theme provides layouts.
124     $theme_key = variable_get('theme_default', 'garland');
125     $layouts = $this->get_layout_options();
126     if (!empty($layouts)) {
127       $form['layout'] = array(
128         '#title' => t('Layout'),
129         '#description' => t('Choose one of the layouts provided by the default theme.'),
130         '#options' => $layouts,
131         '#type' => 'select',
132         '#weight' => -100,
133         '#default_value' => !empty($options['layout']) ? $options['layout'] : NULL,
134         '#attributes' => array('class' => array('context-blockform-layout')),
135         '#required' => FALSE,
136         '#empty_value' => 0,
137         '#empty_option' => '- ' . t('Site default') . ' -',
138       );
139
140       // Add js.
141       // @TODO: Move this to a theme function or somewhere that will get called even
142       // if the form is using a cached version of itself (e.g. when validate fails).
143       drupal_add_js(drupal_get_path('module', 'context_layouts') . '/plugins/context_layouts_reaction_block.js');
144       drupal_add_js(array('contextLayouts' => array('layouts' => $this->get_layout_regions())), 'setting');
145     }
146     return $form;
147   }
148
149   /**
150    * Override of submit handler.
151    */
152   function options_form_submit($values) {
153     $options = parent::options_form_submit($values);
154
155     // Only alter the options form if the theme provides layouts.
156     $theme_key = variable_get('theme_default', 'garland');
157     $layouts = context_layouts_get_layouts($theme_key);
158
159     // Check that this is a valid layout.
160     if (!empty($values['layout']) && isset($layouts[$values['layout']])) {
161       $layout = $values['layout'];
162       $options['layout'] = $layout;
163
164       // Remove blocks that don't belong to regions in this layout.
165       if (isset($layouts[$layout]['regions'])) {
166         foreach ($options['blocks'] as $bid => $block) {
167           if (!in_array($block['region'], $layouts[$layout]['regions'])) {
168             unset($options['blocks'][$bid]);
169           }
170         }
171       }
172     }
173     return $options;
174   }
175
176   /**
177    * Get layout options for the given theme.
178    */
179   protected function get_layout_options($theme_key = NULL) {
180     $theme_key = !isset($theme_key) ? variable_get('theme_default', 'garland') : $theme_key;
181     $layouts = context_layouts_get_layouts($theme_key);
182     $layout_options = array();
183     if (!empty($layouts)) {
184       foreach ($layouts as $layout => $info) {
185         $layout_options[$layout] = isset($info['name']) ? $info['name'] : $layout_options;
186       }
187     }
188     return $layout_options;
189   }
190
191   /**
192    * Get a layout to region map for the given theme.
193    */
194   protected function get_layout_regions($theme_key = NULL) {
195     $theme_key = !isset($theme_key) ? variable_get('theme_default', 'garland') : $theme_key;
196     $layouts = context_layouts_get_layouts($theme_key);
197     if (!empty($layouts)) {
198       $layout_regions = array();
199       foreach ($layouts as $layout => $info) {
200         $layout_regions[$layout] = is_array($info['regions']) ? $info['regions'] : array();
201       }
202     }
203     return $layout_regions;
204   }
205 }