class SlickGrouping in Slick Views 7.3
Same name and namespace in other branches
- 8.2 src/Plugin/views/style/SlickGrouping.php \Drupal\slick_views\Plugin\views\style\SlickGrouping
Slick style plugin with grouping support.
Hierarchy
- class \views_object
- class \views_plugin
- class \views_plugin_style
- class \Drupal\blazy\Dejavu\BlazyStylePluginBase uses BlazyStyleBaseTrait, BlazyStyleOptionsTrait, BlazyStylePluginTrait
- class \Drupal\slick_views\Plugin\views\style\SlickViewsBase
- class \Drupal\slick_views\Plugin\views\style\SlickGrouping
- class \Drupal\slick_views\Plugin\views\style\SlickViewsBase
- class \Drupal\blazy\Dejavu\BlazyStylePluginBase uses BlazyStyleBaseTrait, BlazyStyleOptionsTrait, BlazyStylePluginTrait
- class \views_plugin_style
- class \views_plugin
Expanded class hierarchy of SlickGrouping
File
- src/
Plugin/ views/ style/ SlickGrouping.php, line 12
Namespace
Drupal\slick_views\Plugin\views\styleView source
class SlickGrouping extends SlickViewsBase {
/**
* {@inheritdoc}
*/
public function option_definition() {
$options = parent::option_definition();
foreach ([
'limit',
'optionset',
] as $key) {
$options['grouping_' . $key] = [
'default' => '',
];
}
return $options;
}
/**
* Overrides parent::buildOptionsForm().
*/
public function options_form(&$form, &$form_state) {
parent::options_form($form, $form_state);
$definition = $this
->getDefinedFormScopes();
$states = [
'visible' => [
'select[name*="[grouping][0][field]"]' => [
'!value' => '',
],
],
];
if (!isset($form['grouping_limit'])) {
$form['grouping_limit'] = [
'#type' => 'textfield',
'#title' => t('Grouping limit'),
'#default_value' => $this->options['grouping_limit'],
'#description' => t('Limit the amount of rows per group. Leave it empty, or 0, for no limit. Applicable only to the first level. Be sure having enough rows.'),
'#enforced' => TRUE,
'#states' => $states,
];
}
if (!isset($form['grouping_optionset'])) {
$form['grouping_optionset'] = [
'#type' => 'select',
'#title' => t('Grouping optionset'),
'#options' => $this
->admin()
->getOptionsetsByGroupOptions('main'),
'#default_value' => $this->options['grouping_optionset'],
'#description' => t('If provided, the grouping header will be treated as Slick tabs and acts like simple filters. Else regular stacking slicks. Requires: Optionset thumbnail, Vanilla unchecked, and Randomize option disabled for all optionsets, else impressing broken grouping due to reordered slides. Combine with grids to have a complete insanity.'),
'#enforced' => TRUE,
'#states' => $states,
];
}
$groupings = $this->options['grouping'] ?: [];
for ($i = 0; $i <= count($groupings); $i++) {
foreach ([
'rendered',
'rendered_strip',
] as $key) {
$form['grouping'][$i][$key]['#field_suffix'] = ' ';
$form['grouping'][$i][$key]['#title_display'] = 'before';
}
}
$this
->buildSettingsForm($form, $definition);
if (isset($form['optionset_thumbnail'])) {
$form['optionset_thumbnail']['#description'] .= ' ' . t('This will be used (taken over) for grouping tabs if Grouping optionset is provided. Including all thumbnail-related options: Skin tthumbnail, Thumbnail position.');
}
}
/**
* Overrides StylePluginBase::render().
*/
public function render() {
$sets = parent::render();
$settings = $this->options;
$grouping = empty($settings['grouping']) ? [] : array_filter($settings['grouping']);
$tabs = !empty($settings['grouping_optionset']) && !empty($settings['optionset_thumbnail']);
$tags = [
'span',
'a',
'em',
'strong',
'i',
'button',
];
if (!empty($grouping) && $tabs) {
foreach ($sets as $set) {
$options = [];
$options['nav'] = TRUE;
$options['skin'] = '';
$options['skin_thumbnail'] = $settings['skin_thumbnail'];
$options['thumbnail_position'] = $settings['thumbnail_position'];
$options['optionset'] = $settings['grouping_optionset'];
$options['optionset_thumbnail'] = $settings['optionset_thumbnail'];
$slide = [
'settings' => $options,
'slide' => $set,
];
$thumb['slide']['#markup'] = empty($set['#title']) ? '' : strip_tags($set['#title'], '<span><a><em><strong><i><button>');
$thumb['slide']['#allowed_tags'] = $tags;
$build['items'][] = $slide;
$build['thumb']['items'][] = $thumb;
unset($slide, $thumb);
}
$build['settings'] = $options;
$sets = $this
->manager()
->build($build);
}
return $sets;
}
/**
* Overrides StylePluginBase::renderRowGroup().
*/
protected function render_row_group(array $rows = [], $level = 0) {
$view = $this->view;
$settings = $this->options;
$view_name = $view->name;
$view_mode = $view->current_display;
$grouping = empty($settings['grouping']) ? [] : array_filter($settings['grouping']);
$id = $grouping ? "{$view_name}-{$view_mode}-{$level}" : "{$view_name}-{$view_mode}";
$id = Blazy::getHtmlId('slick-views-' . $id, $settings['id']);
$settings = $this
->buildSettings();
// Prepare needed settings to work with.
$settings['id'] = $id;
if (empty($grouping) && empty($settings['grouping_optionset'])) {
$settings['nav'] = !$settings['vanilla'] && $settings['optionset_thumbnail'] && isset($view->result[1]);
}
$build = $this
->buildElements($settings, $rows);
// Extracts Blazy formatter settings if available.
if (empty($settings['vanilla']) && isset($build['items'][0])) {
$this
->blazyManager()
->isBlazy($settings, $build['items'][0]);
}
// Supports Blazy multi-breakpoint images if using Blazy formatter.
$settings['first_image'] = isset($rows[0]) ? $this
->getFirstImage($rows[0]) : [];
$build['settings'] = $settings;
$elements = $this
->manager()
->build($build);
// Attach library if there is no results and ajax is active,
// otherwise library will not be attached on ajax callback.
// Note the empty space, a trick to solve: Undefined variable: empty...
// No markup is output, yet the library is still attached on the page.
// When this is reached, the $elements is an empty array.
if (empty($this->view->result) && $this->view->use_ajax) {
$elements['#markup'] = ' ';
$elements['#attached'] = $this
->manager()
->attach($settings);
}
return $elements;
}
/**
* Overrides StylePluginBase::renderGroupingSets().
*
* @see https://www.drupal.org/node/2639300
*/
public function render_grouping_sets($sets, $level = 0) {
$output = [];
$grouping = empty($this->options['grouping']) ? [] : array_filter($this->options['grouping']);
foreach ($sets as $set) {
$level = isset($set['level']) ? $set['level'] : 0;
$row = reset($set['rows']);
// Render as a grouping set.
if (is_array($row) && isset($row['group'])) {
$single_output = [
'#theme' => views_theme_functions('views_view_grouping', $this->view, $this->display),
'#view' => $this->view,
'#grouping' => $grouping[$level],
'#rows' => $set['rows'],
'#title' => $set['group'],
];
}
else {
$slick = $this
->render_row_group($set['rows'], $level);
// Views leaves the first grouping header to the style plugin.
if (!empty($grouping) && $level == 0) {
if (empty($this->options['grouping_optionset'])) {
$content[0] = $slick;
$content[0]['#prefix'] = '<h2 class="view-grouping-header">' . $set['group'] . '</h2>';
$single_output[0] = $content;
$single_output[0]['#prefix'] = '<div class="view-grouping">';
$single_output[0]['#suffix'] = '</div>';
}
else {
$single_output = $slick;
}
}
else {
$single_output = $slick;
}
}
$single_output['#grouping_level'] = $level;
$single_output['#title'] = $set['group'];
$output[] = $single_output;
}
return drupal_render_children($output);
}
/**
* Overrides StylePluginBase::renderGrouping().
*/
public function render_grouping($records, $groupings = [], $group_rendered = NULL) {
$sets = parent::render_grouping($records, $groupings, $group_rendered);
$grouping = empty($groupings) ? [] : array_filter($groupings);
// Only add limits for the first top level grouping to avoid recursiveness.
if (!empty($grouping) && !empty($this->options['grouping_limit'])) {
$new_sets = array_values($sets);
$sets = [];
foreach ($new_sets as $set) {
$set['rows'] = array_slice($set['rows'], 0, $this->options['grouping_limit'], TRUE);
$sets[] = $set;
}
}
return $sets;
}
}
Members
Name | Modifiers | Type | Description | Overrides |
---|---|---|---|---|
BlazyStyleBaseTrait:: |
protected | property | The first Blazy formatter found to get data from for lightbox gallery, etc. | |
BlazyStyleBaseTrait:: |
protected | property | The dynamic html settings. | |
BlazyStyleBaseTrait:: |
public | function | Returns the renderable array of field containing rendered and raw data. | |
BlazyStyleBaseTrait:: |
public | function | Returns the first Blazy formatter found. | |
BlazyStyleBaseTrait:: |
protected | function | Sets dynamic html settings. | |
BlazyStyleOptionsTrait:: |
protected | property | The Views as options. | |
BlazyStyleOptionsTrait:: |
public | function | Returns available fields for select options. | |
BlazyStyleOptionsTrait:: |
public | function | Returns the string values for the expected Title, ET label, List, Term. | |
BlazyStylePluginBase:: |
protected | property |
The blazy manager service. Overrides BlazyStyleBaseTrait:: |
|
BlazyStylePluginBase:: |
public | function |
Returns the blazy manager. Overrides BlazyStyleBaseTrait:: |
|
BlazyStylePluginBase:: |
public | function | Returns an individual row/element content. | |
BlazyStylePluginTrait:: |
public | function | Returns the rendered caption fields. | |
BlazyStylePluginTrait:: |
public | function | Returns the rendered field, either string or array. | |
BlazyStylePluginTrait:: |
public | function | Get the image item to work with out of this formatter. | |
BlazyStylePluginTrait:: |
public | function | Returns the modified renderable image_formatter to support lazyload. | |
BlazyStylePluginTrait:: |
public | function | Returns the rendered layout fields. | |
BlazyStylePluginTrait:: |
public | function | Checks if we can work with this formatter, otherwise no go if flattened. | |
SlickGrouping:: |
public | function |
Overrides parent::buildOptionsForm(). Overrides views_plugin_style:: |
|
SlickGrouping:: |
public | function |
Information about options for all kinds of purposes will be held here. Overrides SlickViewsBase:: |
|
SlickGrouping:: |
public | function |
Overrides StylePluginBase::render(). Overrides views_plugin_style:: |
|
SlickGrouping:: |
public | function |
Overrides StylePluginBase::renderGrouping(). Overrides views_plugin_style:: |
|
SlickGrouping:: |
public | function |
Overrides StylePluginBase::renderGroupingSets(). Overrides views_plugin_style:: |
|
SlickGrouping:: |
protected | function | Overrides StylePluginBase::renderRowGroup(). | |
SlickViewsBase:: |
protected | property | The slick service manager. | |
SlickViewsBase:: |
public | function | Returns the slick admin. | |
SlickViewsBase:: |
public | function | Returns slick contents. | |
SlickViewsBase:: |
protected | function |
Overrides StylePluginBase::render(). Overrides BlazyStyleBaseTrait:: |
|
SlickViewsBase:: |
public | function | Build the Slick settings form. | |
SlickViewsBase:: |
protected | function | Returns the defined scopes for the current form. | |
SlickViewsBase:: |
public | function |
Initialize a style plugin. Overrides views_plugin_style:: |
|
SlickViewsBase:: |
public | function | Returns the blazy manager. | |
views_object:: |
public | property | Handler's definition. | |
views_object:: |
public | property | Except for displays, options for the object will be held here. | 1 |
views_object:: |
function | Collect this handler's option definition and alter them, ready for use. | ||
views_object:: |
public | function | Views handlers use a special construct function. | 4 |
views_object:: |
public | function | 1 | |
views_object:: |
public | function | ||
views_object:: |
public | function | Always exports the option, regardless of the default value. | |
views_object:: |
public | function | Set default options on this object. | 1 |
views_object:: |
public | function | Set default options. | |
views_object:: |
public | function | Let the handler know what its full definition is. | |
views_object:: |
public | function | Unpack options over our existing defaults, drilling down into arrays so that defaults don't get totally blown away. | |
views_object:: |
public | function | Unpack a single option definition. | |
views_object:: |
public | function | Unpacks each handler to store translatable texts. | |
views_object:: |
public | function | ||
views_plugin:: |
public | property | The current used views display. | |
views_plugin:: |
public | property | The plugin name of this plugin, for example table or full. | |
views_plugin:: |
public | property | The plugin type of this plugin, for example style or query. | |
views_plugin:: |
public | property |
The top object of a view. Overrides views_object:: |
1 |
views_plugin:: |
public | function | Provide a list of additional theme functions for the theme info page. | |
views_plugin:: |
public | function | Handle any special handling on the validate form. | 9 |
views_plugin:: |
public | function | Return the human readable name of the display. | |
views_plugin:: |
public | function | Returns the summary of the settings in the display. | 8 |
views_plugin:: |
public | function | Provide a full list of possible theme templates used by this style. | |
views_plugin_style:: |
public | property | The row plugin, if it's initialized and the style itself supports it. | |
views_plugin_style:: |
public | property | Store all available tokens row rows. | |
views_plugin_style:: |
public | function | Called by the view builder to see if this style handler wants to interfere with the sorts. If so it should build; if it returns any non-TRUE value, normal sorting will NOT be added to the query. | 1 |
views_plugin_style:: |
public | function | Called by the view builder to let the style build a second set of sorts that will come after any other sorts in the view. | 1 |
views_plugin_style:: |
public | function |
Destructor. Overrides views_object:: |
|
views_plugin_style:: |
public | function | Should the output of the style plugin be rendered even if it's empty. | 1 |
views_plugin_style:: |
public | function | Get a rendered field. | |
views_plugin_style:: |
public | function | Get the raw field value. | |
views_plugin_style:: |
public | function | Return the token replaced row class for the specified row. | |
views_plugin_style:: |
public | function |
Validate the options form. Overrides views_plugin:: |
|
views_plugin_style:: |
public | function | Allow the style to do stuff before each row is rendered. | |
views_plugin_style:: |
public | function |
Add anything to the query that we might need to. Overrides views_plugin:: |
2 |
views_plugin_style:: |
public | function | Render all of the fields for a given style and store them on the object. | |
views_plugin_style:: |
public | function | Take a value and apply token replacement logic to it. | |
views_plugin_style:: |
public | function | Return TRUE if this style also uses fields. | |
views_plugin_style:: |
public | function | Return TRUE if this style also uses a row plugin. | |
views_plugin_style:: |
public | function | Return TRUE if this style also uses a row plugin. | |
views_plugin_style:: |
public | function | Return TRUE if this style uses tokens. | |
views_plugin_style:: |
public | function |
Validate that the plugin is correct and can be saved. Overrides views_plugin:: |