¿Cómo mostrar el orden expuesto en las vistas usando un widget desplegable?

10

Por defecto, el módulo Vistas 3.0 para Drupal 7 utiliza dos menús desplegables para mostrar la clasificación expuesta. Primero desplegable para seleccionar el nombre del campo, y otro - para seleccionar la dirección de clasificación.

Widget de vistas predeterminadas para ordenar

¿Cómo puedo exponer la clasificación en un menú desplegable?

Nueva versión del widget expuesto para ordenar

Eugene Fidelin
fuente

Respuestas:

13

Puede usar el módulo Mejor filtros expuestos para ese propósito. Tiene esa opción para combinar el campo de clasificación y las indicaciones en una lista de selección.

berdyshev
fuente
Gracias por otra solución!
Eugene Fidelin
3
Me tomó 30 minutos encontrar esa opción. En su vista, lo encontrará en la configuración BEF => Opciones de clasificación avanzadas => Combinar orden de clasificación con ordenar por. ¡¡¡Gracias!!!
Roger
10

Necesita crear un módulo pequeño con los siguientes ganchos:

/**
 * Implements hook_form_alter().
 *
 * Alter exposed filter form in views
 */
function MODULE_form_views_exposed_form_alter(&$form, &$form_state, $form_id) {
  if (isset($form['sort_by'])) {
    // Combine sort drop-downs into one.
    $form['sorting'] = array(
      '#type' => 'select',
      '#id'   => 'sort',
      '#title' => $form['sort_by']['#title'],
    );
    foreach ($form['sort_by']['#options'] as $sort_by_key => $sort_by_title) {
      foreach ($form['sort_order']['#options'] as $sort_order_key => $sort_order_title) {
        $form['sorting']['#options'][$sort_by_key . '|' . $sort_order_key] = $sort_by_title . ' ' . $sort_order_title;
      }
    }

    // Get default value for combined sort.
    $sort_by_keys = array_keys($form['sort_by']['#options']);
    $form['sorting']['#default_value'] = $sort_by_keys[0] . '|' . $form['sort_order']['#default_value'];
  }

  // Explode combined sort field into two values that are appropriate for views.
  if (isset($form_state['input']['sorting'])) {
    $sorting = explode('|', $form_state['input']['sorting']);
    $form_state['input']['sort_by'] = $sorting[0];
    $form_state['input']['sort_order'] = $sorting[1];
  }
}

/**
 * Default preprocess function for all filter forms.
 */
function MODULE_preprocess_views_exposed_form(&$vars) {
  $form = &$vars['form'];

  // Render new created sort field.
  if (isset($form['sorting'])) {
    $form['sorting']['#printed'] = FALSE;
    $vars['sorting'] = drupal_render($form['sorting']);

    // Need to rebuild the submit button.
    $form['submit']['#printed'] = FALSE;
    $vars['button'] = drupal_render_children($form);
  }
}

Luego debe copiar el archivo "views / theme / views-shown-form.tpl.php" en su carpeta de temas y reemplazar los widgets $ sort_by y $ sort_order con los nuevos $ sorting

Encontrar:

<?php if (!empty($sort_by)): ?>
  <div class="views-exposed-widget views-widget-sort-by">
    <?php print $sort_by; ?>
  </div>
  <div class="views-exposed-widget views-widget-sort-order">
    <?php print $sort_order; ?>
  </div>
<?php endif; ?>

Reemplazar con:

<?php if (!empty($sorting)): ?>
  <div class="views-exposed-widget views-widget-sort-by">
    <?php print $sorting; ?>
  </div>
<?php endif; ?>
Eugene Fidelin
fuente
¿Cómo cambio la etiqueta, por ejemplo, "Fecha de publicación ascendente" y "Fecha de publicación descendente" a "Productos recientes" y "Productos anteriores"?
Ram