123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549 |
- <?php
- /**
- * @file
- * Preprocessors and theme functions for the Views UI.
- */
- use Drupal\Component\Render\FormattableMarkup;
- use Drupal\Core\Form\FormState;
- use Drupal\Core\Render\Element;
- use Drupal\Core\Render\Element\Checkboxes;
- use Drupal\Core\Render\Element\Radios;
- use Drupal\Core\Url;
- use Drupal\Core\Template\Attribute;
- /**
- * Prepares variables for Views UI display tab setting templates.
- *
- * Default template: views-ui-display-tab-setting.html.twig.
- *
- * @param array $variables
- * An associative array containing:
- * - link: The setting's primary link.
- * - settings_links: An array of links for this setting.
- * - defaulted: A boolean indicating the setting is in its default state.
- * - overridden: A boolean indicating the setting has been overridden from
- * the default.
- * - description: The setting's description.
- * - description_separator: A boolean indicating a separator colon should be
- * appended to the setting's description.
- */
- function template_preprocess_views_ui_display_tab_setting(&$variables) {
- // Put the primary link to the left side.
- array_unshift($variables['settings_links'], $variables['link']);
- if (!empty($variables['overridden'])) {
- $variables['attributes']['title'][] = t('Overridden');
- }
- // Append a colon to the description, if requested.
- if ($variables['description'] && $variables['description_separator']) {
- $variables['description'] .= t(':');
- }
- }
- /**
- * Prepares variables for Views UI view listing templates.
- *
- * Default template: views-ui-view-listing-table.html.twig.
- *
- * @param array $variables
- * An associative array containing:
- * - headers: An associative array containing the headers for the view
- * listing table.
- * - rows: An associative array containing the rows data for the view
- * listing table.
- */
- function template_preprocess_views_ui_views_listing_table(&$variables) {
- // Convert the attributes to valid attribute objects.
- foreach ($variables['headers'] as $key => $header) {
- $variables['headers'][$key]['attributes'] = new Attribute($header['#attributes']);
- }
- if (!empty($variables['rows'])) {
- foreach ($variables['rows'] as $key => $row) {
- $variables['rows'][$key]['attributes'] = new Attribute($row['#attributes']);
- }
- }
- }
- /**
- * Prepares variables for Views UI display tab bucket templates.
- *
- * Default template: views-ui-display-tab-bucket.html.twig.
- *
- * @param array $variables
- * An associative array containing:
- * - element: An associative array containing the properties of the element.
- * Properties used: #name, #overridden, #children, #title, #actions.
- */
- function template_preprocess_views_ui_display_tab_bucket(&$variables) {
- $element = $variables['element'];
- if (!empty($element['#overridden'])) {
- $variables['attributes']['title'][] = t('Overridden');
- }
- $variables['name'] = isset($element['#name']) ? $element['#name'] : NULL;
- $variables['overridden'] = isset($element['#overridden']) ? $element['#overridden'] : NULL;
- $variables['content'] = $element['#children'];
- $variables['title'] = $element['#title'];
- $variables['actions'] = !empty($element['#actions']) ? $element['#actions'] : [];
- }
- /**
- * Prepares variables for Views UI build group filter form templates.
- *
- * Default template: views-ui-build-group-filter-form.html.twig.
- *
- * @param array $variables
- * An associative array containing:
- * - form: A render element representing the form.
- */
- function template_preprocess_views_ui_build_group_filter_form(&$variables) {
- $form = $variables['form'];
- // Prepare table of options.
- $header = [
- t('Default'),
- t('Weight'),
- t('Label'),
- t('Operator'),
- t('Value'),
- t('Operations'),
- ];
- // Prepare default selectors.
- $form_state = new FormState();
- $form['default_group'] = Radios::processRadios($form['default_group'], $form_state, $form);
- $form['default_group_multiple'] = Checkboxes::processCheckboxes($form['default_group_multiple'], $form_state, $form);
- $form['default_group']['All']['#title'] = '';
- $rows[] = [
- ['data' => $form['default_group']['All']],
- '',
- [
- 'data' => \Drupal::config('views.settings')->get('ui.exposed_filter_any_label') == 'old_any' ? t('<Any>') : t('- Any -'),
- 'colspan' => 4,
- 'class' => ['class' => 'any-default-radios-row'],
- ],
- ];
- // Remove the 'All' default_group form element because it's added to the
- // table row.
- unset($variables['form']['default_group']['All']);
- foreach (Element::children($form['group_items']) as $group_id) {
- $form['group_items'][$group_id]['value']['#title'] = '';
- $default = [
- $form['default_group'][$group_id],
- $form['default_group_multiple'][$group_id],
- ];
- // Remove these fields from the form since they are moved into the table.
- unset($variables['form']['default_group'][$group_id]);
- unset($variables['form']['default_group_multiple'][$group_id]);
- $link = [
- '#type' => 'link',
- '#url' => Url::fromRoute('<none>', [], [
- 'attributes' => [
- 'id' => 'views-remove-link-' . $group_id,
- 'class' => [
- 'views-hidden',
- 'views-button-remove',
- 'views-groups-remove-link',
- 'views-remove-link',
- ],
- 'alt' => t('Remove this item'),
- 'title' => t('Remove this item'),
- ],
- ]),
- '#title' => new FormattableMarkup('<span>@text</span>', ['@text' => t('Remove')]),
- ];
- $remove = [$form['group_items'][$group_id]['remove'], $link];
- $data = [
- 'default' => ['data' => $default],
- 'weight' => ['data' => $form['group_items'][$group_id]['weight']],
- 'title' => ['data' => $form['group_items'][$group_id]['title']],
- 'operator' => ['data' => $form['group_items'][$group_id]['operator']],
- 'value' => ['data' => $form['group_items'][$group_id]['value']],
- 'remove' => ['data' => $remove],
- ];
- $rows[] = ['data' => $data, 'id' => 'views-row-' . $group_id, 'class' => ['draggable']];
- }
- $variables['table'] = [
- '#type' => 'table',
- '#header' => $header,
- '#rows' => $rows,
- '#attributes' => [
- 'class' => ['views-filter-groups'],
- 'id' => 'views-filter-groups',
- ],
- '#tabledrag' => [
- [
- 'action' => 'order',
- 'relationship' => 'sibling',
- 'group' => 'weight',
- ],
- ],
- ];
- // Hide fields used in table.
- unset($variables['form']['group_items']);
- }
- /**
- * Prepares variables for Views UI rearrange filter form templates.
- *
- * Default template: views-ui-rearrange-filter-form.html.twig.
- *
- * @param array $variables
- * An associative array containing:
- * - form: A render element representing the form.
- */
- function template_preprocess_views_ui_rearrange_filter_form(&$variables) {
- $form = &$variables['form'];
- $rows = $ungroupable_rows = [];
- // Enable grouping only if > 1 group.
- $variables['grouping'] = count(array_keys($form['#group_options'])) > 1;
- foreach ($form['#group_renders'] as $group_id => $contents) {
- // Header row for the group.
- if ($group_id !== 'ungroupable') {
- // Set up tabledrag so that it changes the group dropdown when rows are
- // dragged between groups.
- $options = [
- 'table_id' => 'views-rearrange-filters',
- 'action' => 'match',
- 'relationship' => 'sibling',
- 'group' => 'views-group-select',
- 'subgroup' => 'views-group-select-' . $group_id,
- ];
- drupal_attach_tabledrag($form['override'], $options);
- // Title row, spanning all columns.
- $row = [];
- // Add a cell to the first row, containing the group operator.
- $row[] = [
- 'class' => ['group', 'group-operator', 'container-inline'],
- 'data' => $form['filter_groups']['groups'][$group_id],
- 'rowspan' => max([2, count($contents) + 1]),
- ];
- // Title.
- $row[] = [
- 'class' => ['group', 'group-title'],
- 'data' => [
- '#prefix' => '<span>',
- '#markup' => $form['#group_options'][$group_id],
- '#suffix' => '</span>',
- ],
- 'colspan' => 4,
- ];
- $rows[] = [
- 'class' => ['views-group-title'],
- 'data' => $row,
- 'id' => 'views-group-title-' . $group_id,
- ];
- // Row which will only appear if the group has nothing in it.
- $row = [];
- $class = 'group-' . (count($contents) ? 'populated' : 'empty');
- $instructions = '<span>' . t('No filters have been added.') . '</span> <span class="js-only">' . t('Drag to add filters.') . '</span>';
- // When JavaScript is enabled, the button for removing the group (if it's
- // present) should be hidden, since it will be replaced by a link on the
- // client side.
- if (!empty($form['remove_groups'][$group_id]['#type']) && $form['remove_groups'][$group_id]['#type'] == 'submit') {
- $form['remove_groups'][$group_id]['#attributes']['class'][] = 'js-hide';
- }
- $row[] = [
- 'colspan' => 5,
- 'data' => [
- ['#markup' => $instructions],
- $form['remove_groups'][$group_id],
- ],
- ];
- $rows[] = [
- 'class' => [
- 'group-message',
- 'group-' . $group_id . '-message',
- $class,
- ],
- 'data' => $row,
- 'id' => 'views-group-' . $group_id,
- ];
- }
- foreach ($contents as $id) {
- if (isset($form['filters'][$id]['name'])) {
- $row = [];
- $row[]['data'] = $form['filters'][$id]['name'];
- $form['filters'][$id]['weight']['#attributes']['class'] = ['weight'];
- $row[]['data'] = $form['filters'][$id]['weight'];
- $form['filters'][$id]['group']['#attributes']['class'] = ['views-group-select views-group-select-' . $group_id];
- $row[]['data'] = $form['filters'][$id]['group'];
- $form['filters'][$id]['removed']['#attributes']['class'][] = 'js-hide';
- $remove_link = [
- '#type' => 'link',
- '#url' => Url::fromRoute('<none>'),
- '#title' => new FormattableMarkup('<span>@text</span>', ['@text' => t('Remove')]),
- '#weight' => '1',
- '#options' => [
- 'attributes' => [
- 'id' => 'views-remove-link-' . $id,
- 'class' => [
- 'views-hidden',
- 'views-button-remove',
- 'views-groups-remove-link',
- 'views-remove-link',
- ],
- 'alt' => t('Remove this item'),
- 'title' => t('Remove this item'),
- ],
- ],
- ];
- $row[]['data'] = [
- $form['filters'][$id]['removed'],
- $remove_link,
- ];
- $row = [
- 'data' => $row,
- 'class' => ['draggable'],
- 'id' => 'views-row-' . $id,
- ];
- if ($group_id !== 'ungroupable') {
- $rows[] = $row;
- }
- else {
- $ungroupable_rows[] = $row;
- }
- }
- }
- }
- if (!$variables['grouping']) {
- $form['filter_groups']['groups'][0]['#title'] = t('Operator');
- }
- if (!empty($ungroupable_rows)) {
- $header = [
- t('Ungroupable filters'),
- t('Weight'),
- [
- 'data' => t('Group'),
- 'class' => ['views-hide-label'],
- ],
- [
- 'data' => t('Remove'),
- 'class' => ['views-hide-label'],
- ],
- ];
- $variables['ungroupable_table'] = [
- '#type' => 'table',
- '#header' => $header,
- '#rows' => $ungroupable_rows,
- '#attributes' => [
- 'id' => 'views-rearrange-filters-ungroupable',
- 'class' => ['arrange'],
- ],
- '#tabledrag' => [
- [
- 'action' => 'order',
- 'relationship' => 'sibling',
- 'group' => 'weight',
- ],
- ],
- ];
- }
- if (empty($rows)) {
- $rows[] = [['data' => t('No fields available.'), 'colspan' => '2']];
- }
- // Set up tabledrag so that the weights are changed when rows are dragged.
- $variables['table'] = [
- '#type' => 'table',
- '#rows' => $rows,
- '#attributes' => [
- 'id' => 'views-rearrange-filters',
- 'class' => ['arrange'],
- ],
- '#tabledrag' => [
- [
- 'action' => 'order',
- 'relationship' => 'sibling',
- 'group' => 'weight',
- ],
- ],
- ];
- // When JavaScript is enabled, the button for adding a new group should be
- // hidden, since it will be replaced by a link on the client side.
- $form['actions']['add_group']['#attributes']['class'][] = 'js-hide';
- }
- /**
- * Prepares variables for style plugin table templates.
- *
- * Default template: views-ui-style-plugin-table.html.twig.
- *
- * @param array $variables
- * An associative array containing:
- * - form: A render element representing the form.
- */
- function template_preprocess_views_ui_style_plugin_table(&$variables) {
- $form = $variables['form'];
- $header = [
- t('Field'),
- t('Column'),
- t('Align'),
- t('Separator'),
- [
- 'data' => t('Sortable'),
- 'align' => 'center',
- ],
- [
- 'data' => t('Default order'),
- 'align' => 'center',
- ],
- [
- 'data' => t('Default sort'),
- 'align' => 'center',
- ],
- [
- 'data' => t('Hide empty column'),
- 'align' => 'center',
- ],
- [
- 'data' => t('Responsive'),
- 'align' => 'center',
- ],
- ];
- $rows = [];
- foreach (Element::children($form['columns']) as $id) {
- $row = [];
- $row[]['data'] = $form['info'][$id]['name'];
- $row[]['data'] = $form['columns'][$id];
- $row[]['data'] = $form['info'][$id]['align'];
- $row[]['data'] = $form['info'][$id]['separator'];
- if (!empty($form['info'][$id]['sortable'])) {
- $row[] = [
- 'data' => $form['info'][$id]['sortable'],
- 'align' => 'center',
- ];
- $row[] = [
- 'data' => $form['info'][$id]['default_sort_order'],
- 'align' => 'center',
- ];
- $row[] = [
- 'data' => $form['default'][$id],
- 'align' => 'center',
- ];
- }
- else {
- $row[] = '';
- $row[] = '';
- $row[] = '';
- }
- $row[] = [
- 'data' => $form['info'][$id]['empty_column'],
- 'align' => 'center',
- ];
- $row[] = [
- 'data' => $form['info'][$id]['responsive'],
- 'align' => 'center',
- ];
- $rows[] = $row;
- }
- // Add the special 'None' row.
- $rows[] = [['data' => t('None'), 'colspan' => 6], ['align' => 'center', 'data' => $form['default'][-1]], ['colspan' => 2]];
- // Unset elements from the form array that are used to build the table so that
- // they are not rendered twice.
- unset($form['default']);
- unset($form['info']);
- unset($form['columns']);
- $variables['table'] = [
- '#type' => 'table',
- '#theme' => 'table__views_ui_style_plugin_table',
- '#header' => $header,
- '#rows' => $rows,
- ];
- $variables['form'] = $form;
- }
- /**
- * Prepares variables for views UI view preview section templates.
- *
- * Default template: views-ui-view-preview-section.html.twig.
- *
- * @param array $variables
- * An associative array containing:
- * - view: The view object.
- * - section: The section name of a View (e.g. title, rows or pager).
- */
- function template_preprocess_views_ui_view_preview_section(&$variables) {
- switch ($variables['section']) {
- case 'title':
- $variables['title'] = t('Title');
- $links = views_ui_view_preview_section_display_category_links($variables['view'], 'title', $variables['title']);
- break;
- case 'header':
- $variables['title'] = t('Header');
- $links = views_ui_view_preview_section_handler_links($variables['view'], $variables['section']);
- break;
- case 'empty':
- $variables['title'] = t('No results behavior');
- $links = views_ui_view_preview_section_handler_links($variables['view'], $variables['section']);
- break;
- case 'exposed':
- // @todo Sorts can be exposed too, so we may need a better title.
- $variables['title'] = t('Exposed Filters');
- $links = views_ui_view_preview_section_display_category_links($variables['view'], 'exposed_form_options', $variables['title']);
- break;
- case 'rows':
- // @todo The title needs to depend on what is being viewed.
- $variables['title'] = t('Content');
- $links = views_ui_view_preview_section_rows_links($variables['view']);
- break;
- case 'pager':
- $variables['title'] = t('Pager');
- $links = views_ui_view_preview_section_display_category_links($variables['view'], 'pager_options', $variables['title']);
- break;
- case 'more':
- $variables['title'] = t('More');
- $links = views_ui_view_preview_section_display_category_links($variables['view'], 'use_more', $variables['title']);
- break;
- case 'footer':
- $variables['title'] = t('Footer');
- $links = views_ui_view_preview_section_handler_links($variables['view'], $variables['section']);
- break;
- case 'attachment_before':
- // @todo: Add links to the attachment configuration page.
- $variables['title'] = t('Attachment before');
- break;
- case 'attachment_after':
- // @todo: Add links to the attachment configuration page.
- $variables['title'] = t('Attachment after');
- break;
- }
- if (isset($links)) {
- $build = [
- '#theme' => 'links__contextual',
- '#links' => $links,
- '#attributes' => ['class' => ['contextual-links']],
- '#attached' => [
- 'library' => ['contextual/drupal.contextual-links'],
- ],
- ];
- $variables['links'] = $build;
- }
- }
|