Ordenamiento dinámico en Views para Drupal

Un problema común que veo al trabajar con vistas que no son tablas es el ordenamiento dinámico. Parece que no hay una manera fácil de utilizar la funcionalidad de ordenación que proporcionan las vistas sin usar el estilo de tabla. Este es el método que utilizo para sortear el problema. No soy la primera en hacerlo de esta manera, y tampoco estoy convencida de que sea la forma más fácil. Pero funciona y lo hemos usado sin problemas.

Creo un módulo para contener una función que maneje la ordenación. Esto facilita realizar cambios sobre la marcha y mantiene el código fuera de la base de datos cuando es posible. Aún tendrás que hacer algo de trabajo en la vista, pero es mínimo y, con suerte, auto explicativo. A continuación, he esbozado las partes de la vista que necesitan ser editadas o añadidas. En este caso, quiero poder ordenar por título o precio, pero tu caso probablemente será diferente. Cambia las características de ordenación según corresponda.

Crea un argumento de tipo “Global: Null”. Puede aparecer en cualquier lugar de tu lista, pero debe haber un argumento presente en esa ubicación de URL o el código no se ejecutará. Usualmente añado un título o tipo de búsqueda. Establece el argumento para mostrar todos los valores si no está presente y añade un validador. Elige un validador PHP y añade lo siguiente:

return _mymodule_handle_sortables($view);

Eso te permitirá editar el contenido de la función rápida y fácilmente sin tener que editar la vista / guardar la vista / previsualizar la vista en cada iteración. Ten en cuenta que paso la variable $_GET. No es estrictamente necesario ya que debería estar disponible en la función de todos modos. Solo lo hago para mayor legibilidad.

Primer paso, obtén los nombres de los campos ordenables con el módulo de devel:

function _mymodule_handle_sortables(&$view) {dpm($view->sort);}

Previsualiza la vista y toma nota de los nombres de los campos. Una vez que los tengas, puedes hacer lo siguiente para alterar la salida de la vista:

function _mymodule_handle_sortables(&$view) { switch ($_GET[‘sort’]) { case ‘sell_price_asc’: unset($view->sort[‘title’]); $view->sort[‘sell_price’]->options[‘order’] = ‘ASC’; break; case ‘sell_price_desc’: unset($view->sort[‘title’]); $view->sort[‘sell_price’]->options[‘order’] = ‘DESC’; break; case ‘alpha_asc’: unset($view->sort[‘sell_price’]); $view->sort[‘title’]->options[‘order’] = ‘ASC’; break; case ‘alpha_desc’: unset($view->sort[‘sell_price’]); $view->sort[‘title’]->options[‘order’] = ‘DESC’; break; } return true; }

Añade un encabezado PHP a tu vista y agrega lo siguiente:

Ahora puedes mostrar dinámicamente un encabezado de ordenamiento. Aquí hay una función, admitidamente exagerada, para hacerlo:

function _mymodule_sortables($g) { // Collect all the relevant GET parameters $gopts = array(); foreach ($g as $k=>$v) { if ($k == ‘q’) continue; $gopts[$k] = $v; } $opts = http_build_query($gopts); // Preserve the sort choice for selection $s1 = $s2 = $s3 = $s4 = ”; switch ($gopts[‘sort’]) { case ‘alpha_asc’ : $s1 = ‘selected=”selected”‘;break; case ‘alpha_desc’ : $s2 = ‘selected=”selected”‘;break; case ‘sell_price_asc’ : $s3 = ‘selected=”selected”‘;break; case ‘sell_price_desc’ : $s4 = ‘selected=”selected”‘;break; } // Unset the sort option so that it can be set in the url manually below unset($gopts[‘sort’]); $opts_sort = http_build_query($gopts); $output = ”

Sorta-zz-a$ – $$$$ – $

“; return $output;}

Ten en cuenta también que proporciono un medio para elegir un “display” diferente dentro de esta vista al preservar las opciones de URL y añadir enlaces directos. Tengo una vista de cuadrícula y una vista de lista, el encabezado proporciona enlaces a las páginas para cada una y preserva las opciones de URL.

He eliminado un poco de código para mejorar la legibilidad y centrarme más en el punto de este artículo, así que házmelo saber si tienes alguna pregunta.