Jun 062011
 

Post to Twitter Post to Facebook

Drupal interactúa constantemente con una base de datos determinada, todos los comentarios, contenidos y demás elementos de drupal se encuentran almacenados y drupal rescata esta información para mostrar estos datos.

Dentro de drupal encontramos una capa de abstracción que “protege” a drupal de las diferencias existentes entre la ingeniería de las diferentes bases de datos, gracias a esta capa podemos escribir un mismo código independientemente de la base de datos con la que estemos trabajando además de prevenir posibles ataques SQL inyection.Basada en objetos PDO (PHP´s Data Object) y  en el principio de que la escritura SQL es  más conveniente que aprender una sintaxis nueva.

En versiones anteriores de drupal realizaríamos nuestras consultas de la siguiente forma:


$result = db_query('SELECT name FROM {role} WHERE rid = :rid', array(':rid' => 2));

Esta forma de construir nuestras consultas puede servirnos perfectamente hasta cierto punto , pero ¿Cómo nos defendemos de consultas más complicadas?.Unas de las características de Drupal 7 es la posibilidad de crear query objects mediante  un query builder que harán mas manejables estas consultas complejas.De esta forma podríamos reescribir nuestra consulta anterior de la siguiente forma :


$query = db_select('role', 'r');
 $result = $query
 ->condition('rid',2)
 ->fields('r',array('name'))
 ->execute();

Ordenando resultados

Para ordenar el resultado de nuestra consulta simplemente usamos el método orderBy, si quisiéramos por ejemplo ordenar los resultados por name ascendentemente haríamos lo siguiente:


$query = db_select('role', 'r');
 $result = $query
 ->condition('rid',2)
 ->fields('r',array('name'))
 ->orderBy('name', 'ASC')
 ->execute();
Paginando resultados

Paginar resultados en drupal es extremádamente fácil.Supongamos que queremos mostrar un listado de todas nuestras nuestros nodos de tipo page, probablemente recibamos decenas de filas como resultado y por tanto necesitamos paginar los resultados por usabilidad.Para llegar a nuestro objetivo en primer lugar crearemos un menu item (ver el artículo anterior) y definiremos nuestra callback para mostrar los resultados que buscamos de la siguiente forma:


/**
 * Page callback
 */
function mimodulo_micallback(){

 //Creamos el query object y extendemos el object para que use un paginador por defecto
 $query = db_select('node','n')->extend('PagerDefault');
 //Construimos nuestra query indicando el número de elementos que
 //queremos que aparezcan por página.
 $query
 ->condition('type','page')
 ->fields('n',array('title'))
 ->limit(5);

 $result= $query ->execute();
 //Iteramos sobre los resultados para contruir la cadena que devolveremos
 $output = '';
 foreach ($result as $row) {

 $output .= $row->title."</br>";

 }
 //LLamamos a la función de tematización y aplicamos el tema de paginación a
 //nuestra salida y retornamos
 $output .= theme('pager');
 return $output;
 }

Imagen del listado de paginas paginado

Si todo ha ido bien , habremos obtenido nuestro paginador funcionando tal como se muestra en la figura y el cual nos ha sido muy facil crear :)

Fuente : Pro Drupal 7 Development