Code Coverage |
||||||||||
Classes and Traits |
Functions and Methods |
Lines |
||||||||
Total | |
0.00% |
0 / 1 |
|
0.00% |
0 / 6 |
CRAP | |
0.00% |
0 / 69 |
InputRequired | |
0.00% |
0 / 1 |
|
0.00% |
0 / 6 |
240 | |
0.00% |
0 / 69 |
defineOptions | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 5 |
|||
buildOptionsForm | |
0.00% |
0 / 1 |
6 | |
0.00% |
0 / 10 |
|||
submitOptionsForm | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 5 |
|||
exposedFilterApplied | |
0.00% |
0 / 1 |
56 | |
0.00% |
0 / 18 |
|||
preRender | |
0.00% |
0 / 1 |
6 | |
0.00% |
0 / 22 |
|||
query | |
0.00% |
0 / 1 |
6 | |
0.00% |
0 / 9 |
<?php | |
/** | |
* @file | |
* Contains \Drupal\views\Plugin\views\exposed_form\InputRequired. | |
*/ | |
namespace Drupal\views\Plugin\views\exposed_form; | |
use Drupal\Core\Form\FormStateInterface; | |
use Drupal\views\Views; | |
/** | |
* Exposed form plugin that provides an exposed form with required input. | |
* | |
* @ingroup views_exposed_form_plugins | |
* | |
* @ViewsExposedForm( | |
* id = "input_required", | |
* title = @Translation("Input required"), | |
* help = @Translation("An exposed form that only renders a view if the form contains user input.") | |
* ) | |
*/ | |
class InputRequired extends ExposedFormPluginBase { | |
protected function defineOptions() { | |
$options = parent::defineOptions(); | |
$options['text_input_required'] = array('default' => $this->t('Select any filter and click on Apply to see results')); | |
$options['text_input_required_format'] = array('default' => NULL); | |
return $options; | |
} | |
public function buildOptionsForm(&$form, FormStateInterface $form_state) { | |
parent::buildOptionsForm($form, $form_state); | |
$form['text_input_required'] = array( | |
'#type' => 'text_format', | |
'#title' => $this->t('Text on demand'), | |
'#description' => $this->t('Text to display instead of results until the user selects and applies an exposed filter.'), | |
'#default_value' => $this->options['text_input_required'], | |
'#format' => isset($this->options['text_input_required_format']) ? $this->options['text_input_required_format'] : filter_default_format(), | |
'#editor' => FALSE, | |
); | |
} | |
public function submitOptionsForm(&$form, FormStateInterface $form_state) { | |
$exposed_form_options = $form_state->getValue('exposed_form_options'); | |
$form_state->setValue(array('exposed_form_options', 'text_input_required_format'), $exposed_form_options['text_input_required']['format']); | |
$form_state->setValue(array('exposed_form_options', 'text_input_required'), $exposed_form_options['text_input_required']['value']); | |
parent::submitOptionsForm($form, $form_state); | |
} | |
protected function exposedFilterApplied() { | |
static $cache = NULL; | |
if (!isset($cache)) { | |
$view = $this->view; | |
if (is_array($view->filter) && count($view->filter)) { | |
foreach ($view->filter as $filter) { | |
if ($filter->isExposed()) { | |
$identifier = $filter->options['expose']['identifier']; | |
if (isset($view->getExposedInput()[$identifier])) { | |
$cache = TRUE; | |
return $cache; | |
} | |
} | |
} | |
} | |
$cache = FALSE; | |
} | |
return $cache; | |
} | |
public function preRender($values) { | |
// Display the "text on demand" if needed. This is a site builder-defined | |
// text to display instead of results until the user selects and applies | |
// an exposed filter. | |
if (!$this->exposedFilterApplied()) { | |
$options = array( | |
'id' => 'area', | |
'table' => 'views', | |
'field' => 'area', | |
'label' => '', | |
'relationship' => 'none', | |
'group_type' => 'group', | |
// We need to set the "Display even if view has no result" option to | |
// TRUE as the input required exposed form plugin will always force an | |
// empty result if no exposed filters are applied. | |
'empty' => TRUE, | |
'content' => [ | |
// @see \Drupal\views\Plugin\views\area\Text::render() | |
'value' => $this->options['text_input_required'], | |
'format' => $this->options['text_input_required_format'], | |
], | |
); | |
$handler = Views::handlerManager('area')->getHandler($options); | |
$handler->init($this->view, $this->displayHandler, $options); | |
$this->displayHandler->handlers['empty'] = array( | |
'area' => $handler, | |
); | |
// Override the existing empty result message (if applicable). | |
$this->displayHandler->setOption('empty', array('text' => $options)); | |
} | |
} | |
public function query() { | |
if (!$this->exposedFilterApplied()) { | |
// We return with no query; this will force the empty text. | |
$this->view->built = TRUE; | |
$this->view->executed = TRUE; | |
$this->view->result = array(); | |
} | |
else { | |
parent::query(); | |
} | |
} | |
} |