Comment afficher le tri exposé dans les vues à l'aide d'un widget déroulant?


10

Par défaut, le module Views 3.0 pour Drupal 7 utilise deux listes déroulantes pour afficher le tri exposé. Premier menu déroulant pour sélectionner le nom du champ, et un autre - pour sélectionner le sens du tri.

Widget Vues par défaut pour le tri

Comment puis-je exposer le tri dans une liste déroulante?

Nouvelle version du widget exposé pour le tri

Réponses:


13

Vous pouvez utiliser le module Filtres mieux exposés à cet effet. Il a une telle option pour combiner le champ de tri et les directions dans une liste de sélection.


Merci pour une autre solution!
Eugene Fidelin

3
Il m'a fallu 30 minutes pour trouver cette option. Sur votre vue, vous le trouverez sous Paramètres BEF => Options de tri avancées => Combinez l'ordre de tri avec le tri par. Merci!!!
Roger

10

Vous devez créer un petit module avec les crochets suivants:

/**
 * 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);
  }
}

Ensuite, vous devez copier le fichier "vues / thème / vues-exposées-form.tpl.php" dans votre dossier de thème et remplacer les widgets $ sort_by et $ sort_order par de nouveaux $ sorting

Trouver:

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

Remplacer par:

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

Comment changer le libellé par exemple "Date de publication ascendante" et "Date de publication descendante" en "Prodcuts récents" et "Produits plus anciens"?
Ram
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.