diff options
Diffstat (limited to 'sites/all/modules/views/plugins/views_plugin_display_attachment.inc')
-rw-r--r-- | sites/all/modules/views/plugins/views_plugin_display_attachment.inc | 284 |
1 files changed, 284 insertions, 0 deletions
diff --git a/sites/all/modules/views/plugins/views_plugin_display_attachment.inc b/sites/all/modules/views/plugins/views_plugin_display_attachment.inc new file mode 100644 index 000000000..8608cfc89 --- /dev/null +++ b/sites/all/modules/views/plugins/views_plugin_display_attachment.inc @@ -0,0 +1,284 @@ +<?php + +/** + * @file + * Contains the attachment display plugin. + */ + +/** + * The plugin that handles an attachment display. + * + * Attachment displays are secondary displays that are 'attached' to a primary + * display. Effectively they are a simple way to get multiple views within + * the same view. They can share some information. + * + * @ingroup views_display_plugins + */ +class views_plugin_display_attachment extends views_plugin_display { + function option_definition () { + $options = parent::option_definition(); + + $options['displays'] = array('default' => array()); + $options['attachment_position'] = array('default' => 'before'); + $options['inherit_arguments'] = array('default' => TRUE, 'bool' => TRUE); + $options['inherit_exposed_filters'] = array('default' => FALSE, 'bool' => TRUE); + $options['inherit_pager'] = array('default' => FALSE, 'bool' => TRUE); + $options['render_pager'] = array('default' => FALSE, 'bool' => TRUE); + + return $options; + } + + function execute() { + return $this->view->render($this->display->id); + } + + function attachment_positions($position = NULL) { + $positions = array( + 'before' => t('Before'), + 'after' => t('After'), + 'both' => t('Both'), + ); + + if ($position) { + return $positions[$position]; + } + + return $positions; + } + + /** + * Provide the summary for attachment options in the views UI. + * + * This output is returned as an array. + */ + function options_summary(&$categories, &$options) { + // It is very important to call the parent function here: + parent::options_summary($categories, $options); + + $categories['attachment'] = array( + 'title' => t('Attachment settings'), + 'column' => 'second', + 'build' => array( + '#weight' => -10, + ), + ); + + $displays = array_filter($this->get_option('displays')); + if (count($displays) > 1) { + $attach_to = t('Multiple displays'); + } + elseif (count($displays) == 1) { + $display = array_shift($displays); + if (!empty($this->view->display[$display])) { + $attach_to = check_plain($this->view->display[$display]->display_title); + } + } + + if (!isset($attach_to)) { + $attach_to = t('Not defined'); + } + + $options['displays'] = array( + 'category' => 'attachment', + 'title' => t('Attach to'), + 'value' => $attach_to, + ); + + $options['attachment_position'] = array( + 'category' => 'attachment', + 'title' => t('Attachment position'), + 'value' => $this->attachment_positions($this->get_option('attachment_position')), + ); + + $options['inherit_arguments'] = array( + 'category' => 'attachment', + 'title' => t('Inherit contextual filters'), + 'value' => $this->get_option('inherit_arguments') ? t('Yes') : t('No'), + ); + + $options['inherit_exposed_filters'] = array( + 'category' => 'attachment', + 'title' => t('Inherit exposed filters'), + 'value' => $this->get_option('inherit_exposed_filters') ? t('Yes') : t('No'), + ); + + $options['inherit_pager'] = array( + 'category' => 'pager', + 'title' => t('Inherit pager'), + 'value' => $this->get_option('inherit_pager') ? t('Yes') : t('No'), + ); + + $options['render_pager'] = array( + 'category' => 'pager', + 'title' => t('Render pager'), + 'value' => $this->get_option('render_pager') ? t('Yes') : t('No'), + ); + + } + + /** + * Provide the default form for setting options. + */ + function options_form(&$form, &$form_state) { + // It is very important to call the parent function here: + parent::options_form($form, $form_state); + + switch ($form_state['section']) { + case 'inherit_arguments': + $form['#title'] .= t('Inherit contextual filters'); + $form['inherit_arguments'] = array( + '#type' => 'checkbox', + '#title' => t('Inherit'), + '#description' => t('Should this display inherit its contextual filter values from the parent display to which it is attached?'), + '#default_value' => $this->get_option('inherit_arguments'), + ); + break; + case 'inherit_exposed_filters': + $form['#title'] .= t('Inherit exposed filters'); + $form['inherit_exposed_filters'] = array( + '#type' => 'checkbox', + '#title' => t('Inherit'), + '#description' => t('Should this display inherit its exposed filter values from the parent display to which it is attached?'), + '#default_value' => $this->get_option('inherit_exposed_filters'), + ); + break; + case 'inherit_pager': + $form['#title'] .= t('Inherit pager'); + $form['inherit_pager'] = array( + '#type' => 'checkbox', + '#title' => t('Inherit'), + '#description' => t('Should this display inherit its paging values from the parent display to which it is attached?'), + '#default_value' => $this->get_option('inherit_pager'), + ); + break; + case 'render_pager': + $form['#title'] .= t('Render pager'); + $form['render_pager'] = array( + '#type' => 'checkbox', + '#title' => t('Render'), + '#description' => t('Should this display render the pager values? This is only meaningful if inheriting a pager.'), + '#default_value' => $this->get_option('render_pager'), + ); + break; + case 'attachment_position': + $form['#title'] .= t('Position'); + $form['attachment_position'] = array( + '#type' => 'radios', + '#description' => t('Attach before or after the parent display?'), + '#options' => $this->attachment_positions(), + '#default_value' => $this->get_option('attachment_position'), + ); + break; + case 'displays': + $form['#title'] .= t('Attach to'); + $displays = array(); + foreach ($this->view->display as $display_id => $display) { + if (!empty($display->handler) && $display->handler->accept_attachments()) { + $displays[$display_id] = $display->display_title; + } + } + $form['displays'] = array( + '#type' => 'checkboxes', + '#description' => t('Select which display or displays this should attach to.'), + '#options' => $displays, + '#default_value' => $this->get_option('displays'), + ); + break; + } + } + + /** + * Perform any necessary changes to the form values prior to storage. + * There is no need for this function to actually store the data. + */ + function options_submit(&$form, &$form_state) { + // It is very important to call the parent function here: + parent::options_submit($form, $form_state); + switch ($form_state['section']) { + case 'inherit_arguments': + case 'inherit_pager': + case 'render_pager': + case 'inherit_exposed_filters': + case 'attachment_position': + case 'displays': + $this->set_option($form_state['section'], $form_state['values'][$form_state['section']]); + break; + } + } + + /** + * Attach to another view. + */ + function attach_to($display_id) { + $displays = $this->get_option('displays'); + + if (empty($displays[$display_id])) { + return; + } + + if (!$this->access()) { + return; + } + + // Get a fresh view because our current one has a lot of stuff on it because it's + // already been executed. + $view = $this->view->clone_view(); + $view->original_args = $view->args; + + $args = $this->get_option('inherit_arguments') ? $this->view->args : array(); + $view->set_arguments($args); + $exposed_input = $this->get_option('inherit_exposed_filters') ? $this->view->exposed_input : array(); + $view->set_exposed_input($exposed_input); + $view->set_display($this->display->id); + if ($this->get_option('inherit_pager')) { + $view->display_handler->use_pager = $this->view->display[$display_id]->handler->use_pager(); + $view->display_handler->set_option('pager', $this->view->display[$display_id]->handler->get_option('pager')); + } + + $attachment = $view->execute_display($this->display->id, $args); + + switch ($this->get_option('attachment_position')) { + case 'before': + $this->view->attachment_before .= $attachment; + break; + case 'after': + $this->view->attachment_after .= $attachment; + break; + case 'both': + $this->view->attachment_before .= $attachment; + $this->view->attachment_after .= $attachment; + break; + } + + $view->destroy(); + } + + /** + * Attachment displays only use exposed widgets if + * they are set to inherit the exposed filter settings + * of their parent display. + */ + function uses_exposed() { + if (!empty($this->options['inherit_exposed_filters']) && parent::uses_exposed()) { + return TRUE; + } + return FALSE; + } + + /** + * If an attachment is set to inherit the exposed filter + * settings from its parent display, then don't render and + * display a second set of exposed filter widgets. + */ + function displays_exposed() { + return $this->options['inherit_exposed_filters'] ? FALSE : TRUE; + } + + function use_pager() { + return !empty($this->use_pager); + } + + function render_pager() { + return !empty($this->use_pager) && $this->get_option('render_pager'); + } +} |