El premio anual al mejor sistema de gestión de contenidos (CMS) en código abierto que patrocina la editorial PacktPub ya ha publicado sus nominaciones para 2008 y Drupal está presente en dos categorías:
Best PHP Open Source CMS
Esta categoría premia a los mejores CMS Open Source escritos en PHP, y comparte nominaciones con CMS Made Simple, ez Publish, Joomla, y XOOPS. Esta categoría tiene un premio de 2000$ para el ganador y 500$ para segundo y tercero. En 2007 ganó Joomla por delante de Drupal, que fue segundo y e107 (que no está nominado este año) que fue tercero.
Open Source CMS Award Overall
Esta es la categoría principal, donde se vota al mejor CMS Open Source del año. Están nominados, además de Drupal, Joomla, DotNetNuke, Plone y TYPOlight. En 2007, ganó Drupal, por delante de Joomla y tercero quedó CMS Made Simple. Esta es la categoría con el premio más cuantioso, 5000$ para el ganador, 3000$ para el segundo y 2000$ para el tercero.
Vota a Drupal como el mejor CMS y también como el mejor CMS en PHP.
Aquí puedes ver un resumen comparativo del uso de los diferentes CMS en 2008.
Hoy me he encontrado con este problema, cuando intentas paginar una consulta que tiene una cláusula DISTINCT para eliminar duplicados (o un GROUP BY equivalente), el número de páginas resultantes en el theme_pager es incorrecto.
¿por qué pasa esto?En realidad, lo que pasa es que el pager_query inicializa una serie de variables globales que utiliza el theme_pager, entre ellas, el total de elementos y el número de páginas totales. Estas variables globales se ven alteradas al realizar la consulta que cuenta los registros devueltos, ya que filtra el DISTINCT.
por ejemploVamos a intentar sacar paginados todos los términos de taxonomía utilizados en la web, para ello unimos las tablas term_node, que tiene los términos usados en cada nodo y term_data, que contiene información de cada término, por ejemplo, su nombre.
<?php
$sql = "SELECT DISTINCT td.name AS term_name, t.tid
FROM term_node t
JOIN term_data td ON t.tid = td.tid";
$result = pager_query($sql, 20);
while ($data = db_fetch_object($result)) {
echo l($data->term_name,"taxonomy/term/".$data->tid) . "<br/>";
}
print theme('pager');
?>
Aquí podéis ver el resultado, las primeras páginas sacan los términos correctamente, pero hay más páginas de las que debería y están vacías. Esto es porque al contar, ha eliminado el DISTINCT y muestra todas las categorías por cada nodo, sin eliminar los duplicados.
¿cómo se resuelveHay que utilizar el cuarto parámetro del pager_query, $count_query, y pasarle una consulta que devuelva el número de registros diferentes que devuelve la consulta con el DISTINCT.
el ejemplo solucionado<?php
$sql = "SELECT DISTINCT td.name AS term_name, t.tid
FROM term_node t
JOIN term_data td ON t.tid = td.tid";
$sql_count = "SELECT COUNT(DISTINCT td.name, t.tid)
FROM term_node t
JOIN term_data td ON t.tid = td.tid";
$result = pager_query($sql, 20, 0, $sql_count);
while ($data = db_fetch_object($result)) {
echo l($data->term_name,"taxonomy/term/".$data->tid) . "<br/>";
}
print theme('pager');
?>
Aquí podéis ver la diferencia, pagina basándose en el número correcto de resultados diferentes que devuelve la consulta.
La solución ideal sería que implementaran una substitución en el pager_query que no filtrara las cláusulas DISTINCT, y es una tarea que parecía que iban a implementar en Drupal 6, pero finalmente no aplicaron ninguna solución, veremos si facilitan la tarea en la 7.