Pues este es el código que tengo para crear la consulta:
Código PHP:
$querylimit = '';
$q = new DB_Sql_ext;
$q->connect($panel_Database, $panel_Host, $panel_User, $panel_Password);
$q->Debug = $panel_Debug;
$q->Halt_On_Error = $panel_Halt_On_Error;
// FILTRO
if ($diaactual == '') { // Si no se recibe ningún Día por GET, se cargan todos los registros del Mes recorrido
$WhereQuery = " WHERE publicar = 2 AND DATE_FORMAT(fecha, '%Y') = '".$anoactual."' AND DATE_FORMAT(fecha, '%m') = '".$mesactual."' ";
} else { // Si se pulsó en un Dia del calendario, se cargarán solamente los Eventos de ese día
$WhereQuery = " WHERE publicar = 2 AND DATE_FORMAT(fecha, '%d') = '".$diaactual."' AND DATE_FORMAT(fecha, '%Y') = '".$anoactual."' AND DATE_FORMAT(fecha, '%m') = '".$mesactual."' ";
}
// // Solamente se muestran los registros cuya fecha no haya pasado aún
$WhereQuery .= " AND ( DATE_FORMAT(fecha, '%Y-%m-%d') >= CURRENT_DATE() )";
$OrderBy = ' ORDER BY fecha DESC, titulo_'.$pref_idioma[$s_lng].', id';
// contar el total de todos los registros sin limitarlos
$querycount = "SELECT COUNT(id) AS contador FROM $catalogo_tabla_agenda".$WhereQuery;
if ($q->query($querycount)) {
$q->next_record();
// $tot_registros tiene la cuenta de todos los elementos de la BB.DD SIN limitar
$tot_registros = $q->f('contador');
}
// Consulta que se hace para obtener el listado que se va a mostrar.
$q_listado = "SELECT *, DATE_FORMAT(fecha,'%d/%m/%y') AS fecha_formateada FROM $catalogo_tabla_agenda";
$q_listado .= $WhereQuery.$OrderBy.$querylimit." ;";
if ($q->query($q_listado)) {
if ($q->num_rows() >= 1) {
while ($q->next_record()) {
$id = $q->f('id');
$fecha = $q->f('fecha_formateada');
$titulo = $q->f('titulo_'.$pref_idioma[$s_lng]);
$tablistado[] = array('id' => $id, 'fecha' => $fecha, 'titulo' => $titulo);
}
}
}
Y luego saco un mensaje si no hay resultados, y sino saco los registros:
Código PHP:
<?
// Mostrando listado de Registros - Inicio
if (count($tablistado) == 0) { ?>
<div class="listado_agenda">
<? echo $msg_agenda[1][$s_lng]; // Sin registros ?>
</div>
<?
} else {
for ($t = 0; $t < count($tablistado); $t++) {
$el_enlace_detalle = '/'.$pref_lng[$s_lng].'/agenda/detalle/'.genera_link_seo_noext('', $seo_siglas[12], $tablistado[$t]['titulo'], $tablistado[$t]['id']); ?>
<div class="listado_agenda">
<div class="fecha_agenda"><? echo $tablistado[$t]['fecha']; ?></div><br />
<div class="titulo_agenda">
<a href="<? echo $el_enlace_detalle; ?>" class="titulo_agenda" title="<? echo $msg_agenda[8][$s_lng]; // ampliar información ?>"> <? echo $tablistado[$t]['titulo']; ?></a>
</div>
</div>
<?
} // fin for
}
// Mostrando listado de Registros - Final
?>
De primeras, me ha gustado la solución de AndrewFace, pero tal y como tengo montado para mostrar los resultados con <div> me resulta algo complicado plasmarla.
Así que con vuestras sugerencias, se me ha ocurrido hacer una doble consulta:
- primero, una consulta sobre fechas distintas que tengan eventos y las recorro con un primer bucle 'for'.
- segundo, recorriendo el primer 'for', hago la segunda consulta para sacar los datos según la fecha recorrida en el primer for. Y entonces, para los datos hago un segundo 'for'.
Bueno, ya lo he probado y me sale como quería.
Ahora el nuevo código es como sigue:
Código PHP:
$querylimit = '';
$q = new DB_Sql_ext;
$q->connect($panel_Database, $panel_Host, $panel_User, $panel_Password);
$q->Debug = $panel_Debug;
$q->Halt_On_Error = $panel_Halt_On_Error;
// FILTRO
if ($diaactual == '') { // Si no se recibe ningún Día por GET, se cargan todos los registros del Mes recorrido
$WhereQuery = " WHERE publicar = 2 AND DATE_FORMAT(fecha, '%Y') = '".$anoactual."' AND DATE_FORMAT(fecha, '%m') = '".$mesactual."' ";
} else { // Si se pulsó en un Dia del calendario, se cargarán solamente los Eventos de ese día
$WhereQuery = " WHERE publicar = 2 AND DATE_FORMAT(fecha, '%d') = '".$diaactual."' AND DATE_FORMAT(fecha, '%Y') = '".$anoactual."' AND DATE_FORMAT(fecha, '%m') = '".$mesactual."' ";
}
// Solamente se muestran los registros cuya fecha no haya pasado aún
$WhereQuery .= " AND ( DATE_FORMAT(fecha, '%Y-%m-%d') >= CURRENT_DATE() )";
$OrderBy = ' ORDER BY fecha DESC, titulo_'.$pref_idioma[$s_lng].', id';
// contar el total de todos los registros sin limitarlos
$querycount = "SELECT COUNT(id) AS contador FROM $catalogo_tabla_agenda".$WhereQuery;
if ($q->query($querycount)) {
$q->next_record();
// $tot_registros tiene la cuenta de todos los elementos de la BB.DD SIN limitar
$tot_registros = $q->f('contador');
}
// Consulta que se hace para obtener el listado que se va a mostrar.
$q_listado = "SELECT DISTINCT DATE_FORMAT(fecha,'%d/%m/%y') AS fecha_formateada FROM $catalogo_tabla_agenda";
$q_listado .= $WhereQuery.$OrderBy.$querylimit." ;";
if ($q->query($q_listado)) {
if ($q->num_rows() >= 1) {
while ($q->next_record()) {
$fecha = $q->f('fecha_formateada');
$tablistado[] = array('fecha' => $fecha);
}
}
}
Ahora, mientras recorro cada fecha resultante, voy consultando los datos de eventos que haya en la misma, y los voy sacando con el segundo 'for':
Código PHP:
<?
// Mostrando listado de Registros - Inicio
if (count($tablistado) == 0) { ?>
<div class="listado_agenda">
<? echo $msg_agenda[1][$s_lng]; // Sin registros ?>
</div>
<?
} else {
for ($t = 0; $t < count($tablistado); $t++) { ?>
<div class="listado_agenda">
<div class="fecha_agenda"><? echo $tablistado[$t]['fecha']; ?></div>
<?
$la_fecha = explode('/', $tablistado[$t]['fecha']);
$la_fecha_dia = $la_fecha[0];
$la_fecha_mes = $la_fecha[1];
$la_fecha_anio = $la_fecha[2];
$q_datos = new DB_Sql_ext;
$q_datos->connect($panel_Database, $panel_Host, $panel_User, $panel_Password);
$Where_Datos = " WHERE publicar = 2 AND DATE_FORMAT(fecha, '%d') = '".$la_fecha_dia."' AND DATE_FORMAT(fecha, '%y') = '".$la_fecha_anio."' AND DATE_FORMAT(fecha, '%m') = '".$la_fecha_mes."' ";
$Order_datos = ' ORDER BY fecha DESC, titulo_'.$pref_idioma[$s_lng].', id';
$q_limit_datos = '';
$q_listado_datos = "SELECT *, DATE_FORMAT(fecha,'%d/%m/%y') AS fecha_formateada FROM $catalogo_tabla_agenda";
$q_listado_datos .= $Where_Datos.$Order_datos.$q_limit_datos." ;";
if ($q_datos->query($q_listado_datos)) {
if ($q_datos->num_rows() >= 1) {
// Iniciando array en cada vuelta para que no acumule datos anteriores
$tablistadatos = array();
while ($q_datos->next_record()) {
$id = $q_datos->f('id');
$fecha = $q_datos->f('fecha_formateada');
$titulo = $q_datos->f('titulo_'.$pref_idioma[$s_lng]);
$tablistadatos[]= array('id' => $id, 'fecha' => $fecha, 'titulo' => $titulo);
}
} else {
echo 'no hay datos';
}
}
for ($z = 0; $z < count($tablistadatos); $z++) {
$el_enlace_detalle = '/'.$pref_lng[$s_lng].'/agenda/detalle/'.genera_link_seo_noext('', $seo_siglas[12], $tablistadatos[$z]['titulo'], $tablistadatos[$z]['id']);
?>
<br />
<div class="titulo_agenda">
<a href="<? echo $el_enlace_detalle; ?>" class="titulo_agenda" title="<? echo $msg_agenda[8][$s_lng]; // ampliar información ?>"> <? echo $tablistadatos[$z]['titulo']; ?></a>
</div>
<?
} // fin for datos
?>
</div>
<?
} // fin for
}
// Mostrando listado de Registros - Final
?>
Pues nada, ahí se queda por si alguna vez a otro le hace falta algo parecido.
Gracias por la inspiración que me habéis facilitado. ¡¡¡Feliz año y tal y tal!!!