Commit a2fd7e49 authored by dawehner's avatar dawehner

#535868 by dagmar: Exposed forms as plugins, helping to isolate exposed form...

#535868 by dagmar: Exposed forms as plugins, helping to isolate exposed form code and increase the ability for modules to change the behavior of exposed forms.
parent 46c5ddae
<?php
// $Id$
/**
* The base plugin to handle exposed filter forms.
*/
class views_plugin_exposed_form extends views_plugin {
/**
* Initialize the plugin.
*
* @param $view
* The view object.
* @param $display
* The display handler.
*/
function init(&$view, &$display) {
$this->view = &$view;
$this->display = &$display;
$exposed_form = $display->handler->get_option('exposed_form');
$this->unpack_options($this->options, $exposed_form['options']);
}
/**
* Return a string to display as the clickable title for the
* control.
*/
function summary_title() {
return t('Unknown');
}
function option_definition() {
$options = parent::option_definition();
$options['submit_button'] = array('default' => t('Apply'), 'translatable' => TRUE);
return $options;
}
function options_form(&$form, &$form_state) {
$form['submit_button'] = array(
'#type' => 'textfield',
'#title' => t('Submit button text'),
'#description' => t('Text to display in the submit button of the exposed form.'),
'#default_value' => $this->options['submit_button'],
);
}
/**
* Render the exposed filter form.
*
* This actually does more than that; because it's using FAPI, the form will
* also assign data to the appropriate handlers for use in building the
* query.
*/
function render_exposed_form($block = FALSE) {
// Deal with any exposed filters we may have, before building.
$form_state = array(
'view' => &$this->view,
'display' => &$this->display,
'method' => 'get',
'rerender' => TRUE,
'no_redirect' => TRUE,
'submit_button' => $this->options['submit_button'],
);
// Some types of displays (eg. attachments) may wish to use the exposed
// filters of their parent displays instead of showing an additional
// exposed filter form for the attachment as well as that for the parent.
if (!$this->view->display_handler->displays_exposed() || (!$block && $this->view->display_handler->get_option('exposed_block'))) {
unset($form_state['rerender']);
}
if (!empty($this->ajax)) {
$form_state['ajax'] = TRUE;
}
$output = drupal_render(drupal_build_form('views_exposed_form', $form_state));
if (!empty($form_state['js settings'])) {
$this->view->js_settings = $form_state['js settings'];
}
return $output;
}
function query() { }
function pre_render() { }
function post_render(&$output) { }
function pre_execute() { }
function post_execute() { }
}
<?php
// $Id$
/**
* Exposed form plugin that provides basic exposed form
*/
class views_plugin_exposed_form_basic extends views_plugin_exposed_form {
function summary_title() {
return t('Basic');
}
}
<?php
// $Id$
/**
* Exposed form plugin that provides basic exposed form
*/
class views_plugin_exposed_form_input_required extends views_plugin_exposed_form {
function summary_title() {
return t('Input required');
}
function option_definition() {
$options = parent::option_definition();
$options['text_input_required'] = array('default' => t('Select any filter and click on Apply to see results'), 'translatable' => TRUE);
$options['text_input_required_format'] = array('default' => FILTER_FORMAT_DEFAULT);
return $options;
}
function options_form(&$form, &$form_state) {
parent::options_form($form, $form_state);
$form['text_input_required'] = array(
'#type' => 'textarea',
'#title' => t('Text on demand'),
'#description' => t('Text to display instead results until user select and apply an expose filter.'),
'#default_value' => $this->options['text_input_required'],
);
$form['text_input_required_format'] = filter_form($this->options['text_input_required_format'], NULL, array('text_input_required_format'));
}
function options_submit(&$form, &$form_state) {
$form_state['values']['exposed_form_options']['text_input_required_format'] = $form_state['values']['text_input_required_format'];
parent::options_submit($form, $form_state);
}
function exposed_filter_applied() {
static $cache = NULL;
if (!isset($cache)) {
$view = $this->view;
$exposed_data = $view->exposed_data;
if (is_array($view->filter) && count($view->filter)) {
foreach ($view->filter as $filter_id => $filter) {
if ($filter->is_exposed()) {
$identifier = $filter->options['expose']['identifier'];
if (isset($view->exposed_input[$identifier])) {
$cache = TRUE;
return $cache;
}
}
}
}
$cache = FALSE;
}
return $cache;
}
function pre_render() {
if (!$this->exposed_filter_applied()) {
$this->view->display_handler->set_option('empty', $this->options['text_input_required']);
$this->view->display_handler->set_option('empty_format', $this->options['text_input_required_format']);
}
}
function query() {
if (!$this->exposed_filter_applied()) {
// We return with no query; this will force the empty text.
$this->view->built = TRUE;
$this->view->executed = TRUE;
$this->view->result = array();
}
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment