source: sipes/modules_contrib/panels/includes/plugins.inc @ de78188

stableversion-3.0
Last change on this file since de78188 was 4f375e3, checked in by José Gregorio Puentes <jpuentes@…>, 8 años ago

se agrego el modulo panels

  • Propiedad mode establecida a 100644
File size: 12.9 KB
Línea 
1<?php
2
3/**
4 * @file
5 *
6 * Contains helper code for plugins and contexts.
7 */
8
9/**
10 * Determine if a pane is visible.
11 *
12 * @param $pane
13 *   The pane object to test for access.
14 * @param $display
15 *   The display object containing the pane object to be tested.
16 */
17function panels_pane_access($pane, $display) {
18  ctools_include('context');
19  return ctools_access($pane->access, $display->context);
20}
21
22/**
23 * Get a list of panels available in the layout.
24 */
25function panels_get_regions($layout, $display) {
26  if (!empty($layout['panels function']) && function_exists($layout['panels function'])) {
27    return $layout['panels function']($display, $display->layout_settings, $layout);
28  }
29  if (!empty($layout['panels'])) {
30    return $layout['panels'];
31  }
32  return array();
33}
34
35/**
36 * Get cached content for a given display and possibly pane.
37 *
38 * @return
39 *   The cached content, or FALSE to indicate no cached content exists.
40 */
41function panels_get_cached_content($display, $args, $context, $pane = NULL) {
42  // Never use cache on a POST
43  if (!empty($_POST)) {
44    return FALSE;
45  }
46
47  $method = $pane ? $pane->cache['method'] : $display->cache['method'];
48  $function = panels_plugin_get_function('cache', $method, 'cache get');
49
50  if (!$function) {
51    return FALSE;
52  }
53
54  $conf = $pane ? $pane->cache['settings'] : $display->cache['settings'];
55  $cache = $function($conf, $display, $args, $context, $pane);
56  if (empty($cache)) {
57    return FALSE;
58  }
59
60  // restore it.
61  $cache->restore();
62  return $cache;
63}
64
65/**
66 * Store cached content for a given display and possibly pane.
67 */
68function panels_set_cached_content($cache, $display, $args, $context, $pane = NULL) {
69  // Never use cache on a POST
70  if (!empty($_POST)) {
71    return FALSE;
72  }
73
74  $method = $pane ? $pane->cache['method'] : $display->cache['method'];
75  $function = panels_plugin_get_function('cache', $method, 'cache set');
76
77  if (!$function) {
78    return FALSE;
79  }
80
81  $conf = $pane ? $pane->cache['settings'] : $display->cache['settings'];
82
83  // snapshot it.
84  $cache->cache();
85  return $function($conf, $cache, $display, $args, $context, $pane);
86}
87
88/**
89 * Clear all cached content for a display.
90 */
91function panels_clear_cached_content($display) {
92  // Figure out every method we might be using to cache content in this display:
93  $methods = array();
94  if (!empty($display->cache['method'])) {
95    $methods[$display->cache['method']] = TRUE;
96  }
97
98  foreach ($display->content as $pane) {
99    if (!empty($pane->cache['method'])) {
100      $methods[$pane->cache['method']] = TRUE;
101    }
102  }
103
104  foreach (array_keys($methods) as $method) {
105    $function = panels_plugin_get_function('cache', $method, 'cache clear');
106    if ($function) {
107      $function($display);
108    }
109  }
110}
111
112/**
113 * An object to hold caching information while it is happening.
114 */
115class panels_cache_object {
116  var $content = '';
117  var $head = NULL;
118  var $css = NULL;
119  var $js = NULL;
120  var $tokens = NULL;
121  var $ready = FALSE;
122
123  /**
124   * When constructed, take a snapshot of our existing out of band data.
125   */
126  function panels_cache_object() {
127    $this->head = drupal_set_html_head();
128    $this->css = drupal_add_css();
129    $this->tokens = ctools_set_page_token();
130
131    foreach (array('header', 'footer') as $scope) {
132      $this->js[$scope] = drupal_add_js(NULL, NULL, $scope);
133    }
134  }
135
136  /**
137   * Add content to the cache. This assumes a pure stream;
138   * use set_content() if it's something else.
139   */
140  function add_content($content) {
141    $this->content .= $content;
142  }
143
144  function set_content($content) {
145    $this->content = $content;
146  }
147
148  /**
149   * Set the object for storing. This overwrites.
150   */
151  function cache() {
152    if ($this->ready) {
153      return;
154    }
155
156    $this->ready = TRUE;
157
158    // Simple replacement for head
159    $this->head = str_replace($this->head, '', drupal_set_html_head());
160
161    // Slightly less simple for CSS:
162    $css = drupal_add_css();
163    $start = $this->css;
164    $this->css = array();
165
166    foreach ($css as $media => $medias) {
167      foreach ($medias as $type => $types) {
168        foreach ($types as $path => $preprocess) {
169          if (!isset($start[$media][$type][$path])) {
170            $this->css[] = array($path, $type, $media, $preprocess);
171          }
172        }
173      }
174    }
175
176    $js = array();
177    // A little less simple for js
178    foreach (array('header', 'footer') as $scope) {
179      $js[$scope] = drupal_add_js(NULL, NULL, $scope);
180    }
181
182    $start = $this->js;
183    $this->js = array();
184
185    foreach ($js as $scope => $scopes) {
186      foreach ($scopes as $type => $types) {
187        foreach ($types as $id => $info) {
188          if (!isset($start[$scope][$type][$id])) {
189            switch ($type) {
190              case 'setting':
191                $this->js[] = array($info, $type, $scope);
192                break;
193
194              case 'inline':
195                $this->js[] = array($info['code'], $type, $scope, $info['defer']);
196                break;
197
198              default:
199                $this->js[] = array($id, $type, $scope, $info['defer'], $info['cache']);
200            }
201          }
202        }
203      }
204    }
205
206    // And for tokens:
207    $tokens = ctools_set_page_token();
208    foreach ($this->tokens as $token => $argument) {
209      if (isset($tokens[$token])) {
210        unset($tokens);
211      }
212    }
213
214    $this->tokens = $tokens;
215  }
216
217  /**
218   * Restore out of band data saved to cache.
219   */
220  function restore() {
221    if (!empty($this->head)) {
222      drupal_set_html_head($this->head);
223    }
224    if (!empty($this->css)) {
225      foreach ($this->css as $args) {
226        call_user_func_array('drupal_add_css', $args);
227      }
228    }
229    if (!empty($this->js)) {
230      foreach ($this->js as $args) {
231        call_user_func_array('drupal_add_js', $args);
232      }
233    }
234
235    if (!empty($this->tokens)) {
236      foreach ($this->tokens as $token => $key) {
237        list($type, $argument) = $key;
238        ctools_set_page_token($token, $type, $argument);
239      }
240    }
241  }
242}
243
244/**
245 * Get the title of a pane.
246 *
247 * @param $pane
248 *   The $pane object.
249 */
250function panels_get_pane_title(&$pane, $context = array(), $incoming_content = NULL) {
251  ctools_include('content');
252  return ctools_content_admin_title($pane->type, $pane->subtype, $pane->configuration, $context);
253}
254
255/**
256 * Fetch metadata on a specific layout plugin.
257 *
258 * @param $layout
259 *   Name of a panel layout. If the layout name contains a ':' this
260 *   indicates that we need to separate the sublayout out and
261 *   load it individually.
262 *
263 * @return
264 *   An array with information about the requested panel layout.
265 */
266function panels_get_layout($layout) {
267  ctools_include('plugins');
268  return ctools_get_plugins('panels', 'layouts', $layout);
269}
270
271/**
272 * Fetch metadata for all layout plugins.
273 *
274 * @return
275 *   An array of arrays with information about all available panel layouts.
276 */
277function panels_get_layouts() {
278  ctools_include('plugins');
279  return ctools_get_plugins('panels', 'layouts');
280}
281
282/**
283 * Fetch metadata for all layout plugins that provide builders.
284 *
285 * The layout builders allow reusable layouts be stored in the database and
286 * exported. Since there are different methods, we are not limiting this
287 * to just one plugin.
288 *
289 * @return
290 *   An array of arrays with information about panel layouts with builders.
291 */
292function panels_get_layout_builders() {
293  ctools_include('plugins');
294  $plugins = ctools_get_plugins('panels', 'layouts');
295  $builders = array();
296  foreach ($plugins as $name => $plugin) {
297    if (!empty($plugin['builder'])) {
298      $builders[$name] = $plugin;
299    }
300  }
301
302  return $builders;
303}
304
305/**
306 * Fetch metadata on a specific style plugin.
307 *
308 * @param $style
309 *   Name of a panel style.
310 *
311 * @return
312 *   An array with information about the requested panel style.
313 */
314function panels_get_style($style) {
315  ctools_include('plugins');
316  return ctools_get_plugins('panels', 'styles', $style);
317}
318
319/**
320 * Fetch metadata for all style plugins.
321 *
322 * @return
323 *   An array of arrays with information about all available panel styles.
324 */
325function panels_get_styles() {
326  ctools_include('plugins');
327  return ctools_get_plugins('panels', 'styles');
328}
329
330/**
331 * Fetch metadata on a specific caching plugin.
332 *
333 * @param $cache
334 *   Name of a panel cache.
335 *
336 * @return
337 *   An array with information about the requested panel cache.
338 */
339function panels_get_cache($cache) {
340  ctools_include('plugins');
341  return ctools_get_plugins('panels', 'cache', $cache);
342}
343
344/**
345 * Fetch metadata for all context plugins.
346 *
347 * @return
348 *   An array of arrays with information about all available panel caches.
349 */
350function panels_get_caches() {
351  ctools_include('plugins');
352  return ctools_get_plugins('panels', 'cache');
353}
354
355/**
356 * Fetch metadata on a specific display renderer plugin.
357 *
358 * @return
359 *   An array of arrays with information about the requested panels display
360 *   renderer.
361 */
362function panels_get_display_renderer($renderer) {
363  ctools_include('plugins');
364  return ctools_get_plugins('panels', 'display_renderers', $renderer);
365}
366
367/**
368 * Fetch metadata for all display renderer plugins.
369 *
370 * @return
371 *   An array of arrays with information about all available panels display
372 *   renderer.
373 */
374function panels_get_display_renderers() {
375  ctools_include('plugins');
376  return ctools_get_plugins('panels', 'display_renderers');
377}
378
379/**
380 * Get and initialize the class to handle rendering a display.
381 *
382 * @return
383 *   Either the instantiated renderer or FALSE if one could not be found.
384 */
385function panels_get_renderer_handler($plugin, &$display) {
386  if (is_string($plugin)) {
387    $plugin = panels_get_display_renderer($plugin);
388  }
389
390  $class = ctools_plugin_get_class($plugin, 'handler');
391  if ($class) {
392    $renderer = new $class();
393    $renderer->init($plugin, $display);
394    return $renderer;
395  }
396
397  return FALSE;
398}
399
400/**
401 * Choose a renderer for a display based on a render pipeline setting.
402 */
403function panels_get_renderer($pipeline_name, &$display) {
404  // If operating in legacy mode, only the legacy renderer is available:
405  if (variable_get('panels_legacy_rendering_mode', TRUE)) {
406    return panels_get_renderer_handler('legacy', $display);
407  }
408
409  // Load the pipeline
410  ctools_include('export');
411  $pipeline = ctools_export_crud_load('panels_renderer_pipeline', $pipeline_name);
412
413  // If we can't, or it has no renderers, default.
414  if (!$pipeline || empty($pipeline->settings['renderers'])) {
415    return panels_get_renderer_handler('standard', $display);
416  }
417
418  // Get contexts set on the pipeline:
419  $contexts = array();
420  if (!empty($pipeline->settings['contexts'])) {
421    $contexts = ctools_context_load_contexts($pipeline->settings['context']);
422  }
423
424  // Cycle through our renderers and see.
425  foreach ($pipeline->settings['renderers'] as $candidate) {
426    // See if this passes selection criteria.
427    if (!ctools_access($candidate['access'], $contexts)) {
428      continue;
429    }
430
431    $renderer = panels_get_renderer_handler($candidate['renderer'], $display);
432
433    if (!empty($candidate['options'])) {
434      $renderer->set_options($candidate['options']);
435    }
436
437    return $renderer;
438  }
439
440  // Fall through. If no renderer is selected, use the standard renderer
441  return panels_get_renderer_handler('standard', $display);
442}
443
444/**
445 * Sort callback for sorting renderer pipelines.
446 *
447 * Sort first by weight, then by title.
448 */
449function _panels_renderer_pipeline_sort($a, $b) {
450  if ($a->weight == $b->weight) {
451      if ($a->admin_title == $b->admin_title) {
452        return 0;
453      }
454    return ($a->admin_title < $b->admin_title) ? -1 : 1;
455  }
456  return ($a->weight < $b->weight) ? -1 : 1;
457}
458
459/**
460 * Get a list of available renderer pipelines.
461 *
462 * This can be used to form a select or radios widget by enabling
463 * sorting. Descriptions are left in.
464 */
465function panels_get_renderer_pipelines($sort = TRUE) {
466  // If operating in legacy mode, only the legacy renderer is available:
467  if (variable_get('panels_legacy_rendering_mode', TRUE)) {
468    return array();
469  }
470
471  ctools_include('export');
472  $pipelines = ctools_export_crud_load_all('panels_renderer_pipeline');
473  if ($sort) {
474    uasort($pipelines, '_panels_renderer_pipeline_sort');
475  }
476
477  return $pipelines;
478}
479
480/**
481 * Get a function from a plugin, if it exists.
482 *
483 * @param $plugin
484 *   The type of plugin
485 * @param $which
486 *   Either the loaded plugin object (or the same data in array form)
487 *   or a string with the name of the desired the specific plugin.
488 * @param $function_name
489 *   The identifier of the function. For example, 'settings form'.
490 *
491 * @return
492 *   The actual name of the function to call, or NULL if the function
493 *   does not exist.
494 */
495function panels_plugin_get_function($plugin, $which, $function_name) {
496  ctools_include('plugins');
497  if (is_object($which) || is_array($which)) {
498    return ctools_plugin_get_function($which, $function_name);
499  }
500  else {
501    return ctools_plugin_load_function('panels', $plugin, $which, $function_name);
502  }
503
504}
505
506// @todo these are DEPRECATED and can probably be removed.
507// These are placeholders to prevent crashes from the former plugins
508class panels_required_context { function filter() { } };
509class panels_optional_context extends panels_required_context {};
Nota: Vea TracBrowser para ayuda de uso del navegador del repositorio.