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;
}