You are here

function views_jump_menu_preprocess_views_jump_menu in Views Jump Menu 8

Implements template_preprocess_views_jump_menu().

File

./views_jump_menu.module, line 57
Contains views_jump_menu.module.

Code

function views_jump_menu_preprocess_views_jump_menu(&$variables) {

  /** @var Drupal\views\ViewExecutable $view */
  $view = $variables['view'];

  /** @var Drupal\views\ResultRow[] $rows */
  $rows = $variables['rows'];
  $options = $view->style_plugin->options;
  if ($options['wrapper_class']) {
    $variables['attributes']['class'][] = $options['wrapper_class'];
  }

  // Generate an HTML ID for this view. We need this so that multiple jump menus
  // on the same page can have independent drupalSettings.
  $view_id = Html::getUniqueId(implode('-', [
    $view
      ->id(),
    $view->current_display,
    'jump_menu',
  ]));

  // Pass the setting about whether to open links in a new window to the front-
  // end.
  $variables['#attached']['drupalSettings']['viewsJumpMenu'][$view_id]['new_window'] = $options['new_window'] ?? FALSE;
  $select = [
    'select_text' => $options['select_text'],
    'select_label' => $options['select_label'],
    'attributes' => new Attribute([
      'class' => _views_jump_menu_get_select_classes($options),
      'title' => $options['select_text'],
      'id' => $view_id,
    ]),
    'options' => [],
  ];
  if (!empty($options['label_field'])) {

    /**
     * @var string $id
     * @var Drupal\views\ResultRow $row
     */
    foreach ($rows as $id => $row) {
      $view->row_index = $row->index;

      // Make sure each field handler has cached the right contents before
      // rendering them in the select field.
      foreach ([
        'label_field',
        'url_field',
      ] as $fieldType) {

        /** @var \Drupal\views\Plugin\views\field\FieldHandlerInterface $handler */
        foreach ($view->field[$options[$fieldType]]->displayHandler
          ->getHandlers('field') as $handler) {
          $handler
            ->advancedRender($row);
        }
      }
      $select['options'][$id] = [
        'label' => Html::decodeEntities(strip_tags($view->field[$options['label_field']]
          ->advancedRender($row))),
        'url' => $view->field[$options['url_field']]
          ->advancedRender($row),
      ];
    }
  }
  $variables['select'] = $select;
}