Supporto volontario e collaborativo per Joomla!® in italiano

ChronoConnectivity e Eventlist. Ricerche plus.

vales_061_logoDa tempo avevo la necessità di avere per il mio sito delle ricerche particolari, un po' più specializzate, per gli eventi gestiti da Eventlist, "il Signore degli Eventi". Anche nel forum di joomla.it, dopo la pubblicazione del precedente articolo "ChronoConnectivity. Infiniti modi per vedere e gestire i contenuti di Joomla!" erano venute sollecitazioni per questa accoppiata. Dopo un po' di lavoro che ha dovuto superare alcune difficoltà, che vedremo in seguito, siamo giunti finalmente alla soluzione abbastanza stabile che è opportuno divulgare, anche perchè mostrerà alcuni metodi di lavoro che saranno poi applicabili ad altre accoppiate che qualcuno vorrà tentare.

Per applicare ciò che sarà illustrato in questo articolo dovremo avere installati nel nostro Joomla! Chronoform, il plugin di Chronoform ed Eventlist. I primi sappiamo ormai che li troviamo nel sito della Chronoengine, Eventlist lo troveremo invece nel sito del produttore www.schlu.net/downloads.html.

Non ho parlato di Chronoconnectivity e può sembrare strano, ma vedremo subito che non lo è perchè per ottenere i risultati descritti in questo articolo ho dovuto apportare delle piccole modifiche, ma significative, al codice di questo componente. Nulla di particolare, nessun stravolgimento, si tratta di 3 modifiche al codice del file connection.php che ora consentono di compiere le ricerche non più su una sola tabella di database ma sui risultati di una query che coinvolge più tabelle aventi relazioni su alcuni campi. Sono state inoltre necessarie ulteriori modifiche per cambiare il nome al componente che nella nuova versione si chiama ovviamente chronoconnectivity2. Quindi tutti i richiami al nome del componente sono stati cambiati in tutti i file che compongono l'estensione e questo consente di poter installare questa versione modificata senza avere conflitti con i file della versione originaria. Quindi alla fine ci troveremo su joomla! due versioni, chronoconnectivity che lavora con le precedenti connessioni e chronoconnectivity2 che lavora con questa e con quelle che sfrutteranno questi potenziamenti. Chronoconnectivity2 potra essere scaricata da qui http://www.joomla.it/download-della-community/item/40-chronoconnectivity-multitabelle.html.

Dato che dobbiamo interfacciare il componente Eventlist diamo uno sguardo alle sue tabelle che da un esame con phpmyadmin risultano le seguenti:

  • jos_eventlist_categoriesEventList_logo
  • jos_eventlist_events
  • jos_eventlist_groupmembers
  • jos_eventlist_groups
  • jos_eventlist_register
  • jos_eventlist_settings
  • jos_eventlist_venues

Dopo un esame delle tabelle nei loro contenuti ho deciso di utilizzare per questo articolo jos_eventlist_events, jos_eventlist_categories, jos_eventlist_venues che hanno queste caratteristiche:


jos_eventlist_events_

Questa è certamente la cartella principale nella quale sono inseriti i campi descrittivi dell'evento memorizzato. I nomi dei campi sono sufficientemente intuitivi e descrivono quello che troveremo al loro interno. Fra questi campi sono da evidenziare i due campi locid e catsid. Questi due campi sono quelli che relazionano la tabella alle altre due tabelle scelte rispettivamente jos_eventlist_categories e jos_eventlist_venues, visualizzate di seguito.

jos_eventlist_categories

Questo vuol dire che il valore del campo catsid nella prima tabella jos_eventlist_events conterrà il valore e punterà al campo id della tabella jos_eventlist_categories. In pratica quando il programma in esecuzione troverà il valore di catsid nella prima tabella jos_eventlist_events, con l'uso di tecniche di PHP e di Mysql andrà a cercare nella tabella jos_eventlist_categories lo stesso valore nel campo id. Trovato il record, che sarà unico, che risponde a quel valore estrarrà i valori anche degli altri campi come ad esempio catname, il nome della categoria, catdescription la descrizione della categoria, ecc. La tabella jos_eventlist_categories contiene infatti le descrizioni delle categorie degli eventi classificati da Eventlist.

jos_eventlist_venues

La tabella jos_eventlist_venues contiene invece le sedi degli eventi, i campi saranno infatti funzionali a fornire le informazioni che descrivono le sedi, la loro ubicazione, indirizzo, la città, la provincia-regone, lo stato, ecc. A mio parere avrebbero potuto creare altre tabelle per city, country e state per evitare duplicazioni di inserimenti, ma avranno avuto i loro motivi. Questo fatto come vedremo a richiesto un po' di extra lavoro per far funzionare alcune cose. Anche per questa tabella avremo un meccanismo simile a quello descritto in precedenza. Il campo locid della tabella jos_eventlist_events conterrà il valore e punterà al campo id della tabella jos_eventlist_venues e lo stesso meccanismo descritto in precedenza permetterà di trovare i valori che descrivono la sede da associare ad ogni evento.

Avendo ben chiari questi concetti che non sono altro che le tecniche di costruzione di un database ottimizzato (non del tutto) con tabelle in relazione fra loro, possiamo proseguire nel nostro lavoro. Questo è il motivo principale da cui discendeva la necessità di avere una connectivity che gestisse non una sola tabella come avevamo visto fino ad ora negli altri esempi di utilizzo di Chronoconnectivity, ma più tabelle, perchè in questo caso per ricerche sul campo city (città) tabella jos_eventlist_venues e sul campo catname (categoria) tabella jos_eventlist_categories, abbiamo necessità avere i valori letti con una query che interroghi più tabelle.

Nel rispetto della licenza GPL con cui è rilasciata Chronoconnectivity ora dichiarerò le modifiche fatte al componente. Le modifiche sostanziali sono state apportate al file che nella versione originale si trova in questa posizione components/com_chronoconnectivity/libraries/connection.php. Le modifiche sono queste.

la riga 198 è stata commentata e sostituita dalla seguente dove è stato tolto il riferimento alla singola tabella indicata nella configurazione della connessione.

 
//$query = "SELECT * FROM ".$MyConnection->connectionrow->tablenames;
$query = "SELECT * FROM ";
 

alla linea 213 nella dichiarazione global è stata aggiunta la variabile $total, che rappresenta il numero dei records trovati dalla query ed in questo modo sarà recuperabile in tutte le sezioni della connessione Header, Body e Footer.

 
global $mainframe,$total;
 

la riga 228 è stata commentata e sostituita dalla seguente dove è stato tolto il riferimento alla singola tabella indicata nella configurazione della connessione.

 
/* $database->setQuery( "SELECT count(*) FROM ".$MyConnection->connectionrow->tablenames.
" ".trim($WHERE)); */
$database->setQuery( "SELECT count(*) FROM ".trim($WHERE) );
 

In sostanza con queste modifiche abbiamo ottenuto che la sezione WHERE SQL non restituisce più la sola parte where della query di ricerca, ma ora restituisce tutto ciò che normalmente sta dopo la FROM, quindi i nomi delle tabelle correlate alla query ed ogni altra istruzione per stabilire le condizioni e le modalità di restituzione dei dati della query stessa. Quindi il significato della sezione WHERE SQL in questa versione di Chronoconnectivity dovrà essere inteso in questo nuovo modo

La tabella principale che viene selezionata nella dropdown TableName(s):, che accetta una sola tabella, dovremo continuare a selezionarla, altrimenti il componente non salva la configurazione. La stessa tabella principale però dovrà essere inserita nell'ultima posizione nell'elenco delle tabelle inserite nella query, per motivi di programamzione. Come vedremo nell'esempio. La s della sezione TableName(s): o è un lapsus dell'autore dell'estensione oppure lascia prefigurare che le future versioni prendano in considerazione uso di più tabelle nella query come abbiamo fatto ora. Naturalmente ho provato a modificare questo limite della dropdown di selezione delle tabelle, ma al momento non ho ottenuto risultati. Vedremo in futuro.

Chi nonosce MYsql e il linguaggio SQL comprende che questo è un potenziamento importante del componente che ora offre prestazioni più performanti nella rappresentazione dei dati.

Premesso tutto ciò, possiamo passare al sodo della messa a punto della connnessione, tenendo conto che le istruzioni generali per configurare una connessione erano già state illustrate nei precedenti articoli. Iniziamo dalla sezione WHERE SQL che per quanto detto in precedenza non restituirà più solo la where ma tutte le istruzioni per definire le tabelle e le condizioni della query.

 
<?php
    $session =& JFactory::getSession('ricerca');
 
// questa if serve per verificare se entriamo nella ricerca per la prima volta
// da una voce di menu ed in questo caso vengono azzerate le sessioni aperte in
// cui sono memorizzati i valori delle precedenti ricerche
 
    if ($_SERVER['QUERY_STRING']=="") {
    $session->clear('cerca','ricerca');
    $session->clear('memo','ricerca');
    }
 
    $search_array = array('title','datdescription');
    global $mem;
    $cerca = array();
    foreach ( $search_array as $search ) {
      $value = JRequest::getVar($search, '' , 'post');
      $value = ereg_replace("'","\'",$value);
      if ( $value ) {
 
        $cerca[] = " `$search` LIKE '%$value%' ";
 
      }
    }
 
// nuove modalità di ricerca 
      if (JRequest::getVar('loc', '' , 'post')<>'') {
      $cerca[] = " b.city like '%".JRequest::getVar('loc', '' , 'post')."%' ";
      }
      if (JRequest::getVar('catsid', '' , 'post')<>'') {
      $cerca[] = " `catsid` = '".JRequest::getVar('catsid', '' , 'post')."' ";
      }
 
// se inserite data inizio e data fine
      if (JRequest::getVar('dates', '' , 'post')<>'' and
          JRequest::getVar('enddates', '' , 'post')<>'') {
 
      $cerca[] = "(((`dates` >= '".JRequest::getVar('dates', '' , 'post')."')  AND 
(`dates` <= '".JRequest::getVar('enddates', '' , 'post')."') ) OR 
"."((`enddates` >= '".JRequest::getVar('dates', '' , 'post')."')  AND 
(`enddates` <= '".JRequest::getVar('enddates', '' , 'post')."' )) OR "
."((`dates` >= '".JRequest::getVar('dates', '' , 'post')."')  AND 
(`enddates` <= '".JRequest::getVar('enddates', '' , 'post')."' )) OR "
."((`dates` <= '".JRequest::getVar('dates', '' , 'post')."')  AND 
(`enddates` >= '".JRequest::getVar('enddates', '' , 'post')."' ))) ";
      }      
 
// se inserita solo data inizio
      if (JRequest::getVar('dates', '' , 'post')<>'' and
      JRequest::getVar('enddates', '' , 'post')=='') {
      $cerca[] = "(`dates` <= '".JRequest::getVar('dates', '' , 'post')."'  AND
 `enddates` >= '".JRequest::getVar('dates', '' , 'post')."' )";
      }
 
//costruzione parte fissa della query per ricerca su più tabelle
 
$fissainiziale = " `jos_eventlist_venues` as b, `jos_eventlist_categories` as
 c, `jos_eventlist_events`  WHERE jos_eventlist_events.published = 1 and 
c.id = catsid and locid = b.id ";
$fissa = $fissainiziale." AND ";
 
 
// questo potenziamento consente di legare alla ricerca nuove tabelle oltre a
// quella definita nella connessione in TableName. E' possibile, dopo aver 
// previsto nuovi campi di inserimento e definite le modalità di ricerca come 
// sopra, attivare anche ricerche su nuovi campi delle tabelle aggiuntive con ad
// esempio: b.country = qualcosa.
 
 
     if (empty($cerca) and (JRequest::getVar('submit','no','POST')=="Trova")) {
     $session->set('cerca',0,'ricerca');
     JRequest::setVar('limitstart',0,'Get');
     $mem=0;
     }
 
    if ( !empty($cerca) ){
            echo $fissa.implode(' AND ', $cerca);
            $mem=1;
            $session->set('cerca',$cerca,'ricerca');          
    }
 
    elseif ((JRequest::getVar('submit','no','POST')<>"Trova") and
  ($session->get('cerca',0,'ricerca')<>0)) {
    $cerca=$session->get('cerca',0,'ricerca');
 
    echo $fissa.implode(' AND ', $cerca);
    }
    else
    {
    echo $fissainiziale;
    }
?>
 

Il risultato di questa sezione consentirà di definire la query in funzione dei campi inseriti nella ricerca. Avvierà la sessione per memorizzare i dati di ricerca durante la navigazione fra i risultati della medesima ricerca. Azzererà i dati della ricerca nel caso in cui l'ingresso sia proveniente da un menu.

Vediamo ora la sezione Header dove inseriremo i campi delle nostre ricerche.

 
<?php
// estrazione del nome della categoria già selezionato nella precedente
// ricerca per memorizzazione
$db =& JFactory::getDBO();
 
$query = "
 
SELECT s.catname FROM #__eventlist_categories as s 
 WHERE s.id = '".JRequest::getVar('catsid', '', 'post')."'
 
";
$db->setQuery($query);
 
$nomes11 = $db->loadRow();
 
//memorizzazione dei valori dei campi della ricerca per mostrarli nelle ricerche
$memo[]=JRequest::getVar('title', '' , 'post');
$memo[]=JRequest::getVar('datdescription', '' , 'post');
$memo[]=JRequest::getVar('loc', '' , 'post');
$memo[]=$nomes11[0];
$memo[]=JRequest::getVar('dates', '' , 'post');
$memo[]=JRequest::getVar('enddates', '' , 'post');
 
//estrazione dei valori del campo city per la casella dropdown
$nome_selected = JRequest::getInt('city', '', 'post');
$db =& JFactory::getDBO();
 
$query = "
 
SELECT `city`, `id`
 FROM `#__eventlist_venues`
 GROUP BY `city`
";
$db->setQuery($query);
$nomes = $db->loadAssocList();
$nome_options = "";
foreach ( $nomes as $v ) {
 if ( $nome_selected == $v['city'] ) {
 $selected = "selected='selected'";
 } else {
 $selected = '';
 }
 
 $nome_options .= "<option value='".$v['city']."'  >".$v['city']."</option>";
 
}
?>
 
<?php
 
//estrazione del nome categoria per la dropdown
$nome_selected = JRequest::getInt('catname', '', 'post');
$db =& JFactory::getDBO();
 
$query = "
 
SELECT `id`, `catname`
 FROM `#__eventlist_categories`
 ORDER BY `catname`
";
$db->setQuery($query);
$nomes = $db->loadAssocList();
$nome_options2 = "";
foreach ( $nomes as $v ) {
 if ( $nome_selected == $v['catname'] ) {
 $selected = "selected='selected'";
 } else {
 $selected = '';
 }
 
 $nome_options2 .= "<option value='".$v['id']."'  >".$v['catname']."</option>";
 
}
?>
 
<!-- Inserimento dei campi dei filtri di ricerca -->
 
<div style="float:left; width: 100%; ">
<table width="100%" cellpadding="0" cellspacing="0">
 
 <tr bgcolor="#ffffff">
   <TD WIDTH=15%><b>Titolo</b>: </td>
   <TD WIDTH=35%><input type="text" name="title" /></td>
   <TD WIDTH=15%><b>Descrizione</b>: </td>
   <TD WIDTH=35%><input type="text" name="datdescription" /></td>
 </tr>
 <tr bgcolor="#ffffff">
   <TD WIDTH=15%><b>Località</b>: </td>
   <TD WIDTH=35%><select name="loc" class="form">
   <option value="" >Seleziona la località</option>
   <?php echo $nome_options; ?>
</select></td>
 
   <TD WIDTH=15%><b>Categoria</b>: </td>
   <TD WIDTH=35%><select name="catsid" class="form">
   <option value="" >Seleziona la categoria</option>
   <?php echo $nome_options2; ?>
</select></td>
 </tr>
 
 <tr>
   <TD WIDTH=15%><b>Dal (data)</b>: </td>
   <TD WIDTH=35%><input type="text" name="dates" /> aaaa-mm-gg</td>
   <TD WIDTH=15%><b>Al (data) </b>: </td>
   <TD WIDTH=35%><input type="text" name="enddates" /> aaaa-mm-gg</td>
 </tr>
 <tr>
   <td colspan="2"><img src="bordo_inferiore.gif"></td>
 </tr>
</table>
 
 
<p style="text-align:center;">
<b>Per resettare la ricerca lanciarla con campi vuoti  </b>
<input type="submit" value="Trova" name="submit" 
style='width:80px; color:#cccccc; background-color:#135cae; cursor:pointer;' />
<input type="reset" name="reset" value="Reset" 
style='width:80px; color:#cccccc; background-color:#135cae; cursor:pointer;'/></p>
</div>
 
<!--  inserimento navigazione fra pagine -->
<p>{pagination}</p>
 
 
 
<?php
//attivazione della sessione per memorizzare i campi di ricerca da mostrare nell'header 
 
     global $mem;
     if (($mem==0) and (JRequest::getVar('submit','no','POST')=="Trova")) {
          $session->set('memo',0,'ricerca');
     }
 
    if ( $mem==1 ){
          $session->set('memo',$memo,'ricerca');          
    }
 
    elseif ((JRequest::getVar('submit','no','POST')<>"Trova") and
  ($session->get('memo',0,'ricerca')<>0)) {
    $memo=$session->get('memo',0,'ricerca');
    }
    else
    {
 
    }
?>
 
<table width="100%"  border="0" cellspacing="0" cellpadding="0">
 
<!-- visualizzazione dei valori di ricerca inseriti -->
<tr>
<td colspan="5" ><?php global $total; echo $total; ?>
Risultati trovati per: Titolo=<b style="color: #135cae;">
<?php echo $memo[0];?></b> Descrizione=<b style="color: #135cae;">
<?php echo $memo[1];?></b> Città=<b style="color: #135cae;">
<?php echo $memo[2];?></b> Categoria=<b style="color: #135cae;">
<?php echo $memo[3]; ?></b> Dal=<b style="color: #135cae;">
<?php echo $memo[4];?></b> Al=<b style="color: #135cae;">
<?php echo $memo[5];?></b><br/><br/></td>
</tr>
 
<!-- intestazione report della ricerca -->
<tr>
<th width="15%" class="sectiontableheader">Data</th>
<th width="30%" class="sectiontableheader">Titolo</th>
<th width="20%" class="sectiontableheader">Sede e Descrizione</th>
<th width="20%" class="sectiontableheader">Città</th>
<th width="15%" class="sectiontableheader">Categoria</th>
</tr>
 

In questa sezione sono stati risolti i seguenti problemi: la visualizzazione dei campi di ricerca, estrazione di valori per popolare le due caselle dropdown località e categorie, da notare nella query sul campo city della tabella jos_eventlist_venues l'uso del comando group by che consente di estrarre il nome di ogni località una sola volta (questa era la critica che sollevavo alla realizzazione di questa tabella). Si realizza poi la memorizzazione dei valori della ricerca nella sessione per visualizzarli durante la navigazione fra le pagine, l'attivazione della navigazione fra le pagine e visualizzazione del numero dei risultati trovati e dei valori della ricerca.

Passiamo ora alla sezione Body che visualizzerà i risultati della ricerca.

 
<?php
$db =& JFactory::getDBO();
 
$query = "
 
SELECT c.venue, c.city, s.catname
  FROM #__eventlist_venues as c, #__eventlist_categories as s 
  WHERE c.id = $MyRow->locid AND s.id = $MyRow->catsid
 
";
$db->setQuery($query);
$nomes = $db->loadRow();
if (!isset($bc)) : $bc=0; endif;
$bc+=1;
?>
 
 
<tr style="background-color:
<?php if ($bc==0) {
echo "#FFFFFF;\"";
} else {
echo "#BFCFFF;\"";
$bc=-1;
}
?>
>
<td width="15%">
<div class="date"><?php echo date("d-m-Y",strtotime($MyRow->dates));?>  
<?php echo date("d-m-Y",strtotime($MyRow->enddates));?></div>
</td>
 
<td width="30%"><a href="index.php?view=details&id={id}%3A{alias}&option=com_eventlist&Itemid=74"
 >{title}</a></td>
<td  width="20%"><?php echo "<b>".$nomes[0]."</b>"; ?><br/>{datdescription}</td>
<td width="20%"><?php echo "<b>".$nomes[1]."</b>"; ?></td>
                    <td width="15%"><?php echo "<b>".$nomes[2]."</b>"; ?></td>
 
</tr>
 

In questa sezione è definito il codice per visualizzare i risultati della ricerca riga per riga. Ricordo che i valori dei campi della tabella principale selezionata con la configurazione si ricavano in questo modo. In HTML con {nomecampo} ed in PHP con $MyRow->nomecampo. Da notare che con l'uso di PHP viene creato il link sul nome dell'evento che punta alla scheda evento di Eventlist e la conversione delle date dal sistema americano a quello europeo.

L'ultima sezione definita è il Footer dove viene inserito il tag di fine tabella iniziata nel Header ed il comando di navigazione.

 
</table>
 
<p>{pagination}</p>
<br/>
 

Nelle altre tab della configurazione dovranno essere inseriti i seguenti valori.

Tab General campo Order fields: inserire dates per avere l'ordinamento cronologico, in Header/Title: inserire Tutti gli eventi, in Enable Mambots: e in Enable Form tags: mettere Yes.

Tab FrontEnd Settings in View user Groups: settare Public User -Guest, in View Users: settare admin.

Tab Admin Settings in Data View Fields Names: basta scegliere almeno un campo, in Data View Columns titles: dare un titolo al campo scelto.

Dopo aver salvato la connessione possiamo assegnarla ad un menu del sito per la visualizzazione con la normale procedura. Il risultato sarà simile al seguente.

vales_06_tutti

Per le altre due connessioni che creeremo per le ricerche Eventi del mese ed Eventi della settimana, essendo dei casi particolari della ricerca generale non richiederanno nuovi interventi salvo le modifiche necessarie per definire le nuove query di ricerca negli intervalli di tempo mensile e settimanale e la modifica dei campi di input, dove potremo togliere i campi delle date essendo già definiti della query. Quindi le sezioni che subiranno modifiche sono WHERE SQL e Header le altre sezioni Body e Footer avranno gli stessi valori del precedente esempio. Questi sono i codici delle sezioni modificate.

Ricerca Eventi del mese

Sezione WHERE SQL

 
<?php
    $session =& JFactory::getSession('mese');
 
    if ($_SERVER['QUERY_STRING']=="") {
    $session->clear('cerca','mese');
    $session->clear('memo','mese');
    }
 
    $search_array = array('title','datdescription');
    global $mem;
    $cerca = array();
    foreach ( $search_array as $search ) {
      $value = JRequest::getVar($search, '' , 'post');
      $value = ereg_replace("'","\'",$value);
      if ( $value ) {
 
        $cerca[] = " `$search` LIKE '%$value%' ";
 
      }
    }
 
// nuove modalità di ricerca 
      if (JRequest::getVar('locid', '' , 'post')<>'') {
      $cerca[] = " b.city like '%".JRequest::getVar('locid', '' , 'post')."%' ";
      }
      if (JRequest::getVar('catsid', '' , 'post')<>'') {
      $cerca[] = " `catsid` = '".JRequest::getVar('catsid', '' , 'post')."' ";
      }
 
//costruzione parte fissa della query per ricerca su più tabelle
 
$fissainiziale = " `jos_eventlist_venues` as b, `jos_eventlist_categories` as c,
 `jos_eventlist_events`  WHERE jos_eventlist_events.published = 1 and c.id =
 catsid and locid = b.id ";
$fissa = $fissainiziale." AND ";
//$fissafine = " ORDER BY 'dates' ";
 
// questo potenziamento consente di legare alla ricerca nuove tabelle oltre a
// quella definita nella connessione in TableName. E' possibile, dopo aver 
// previsto nuovi campi di inserimento e definite le modalità di ricerca come
// sopra, attivare anche ricerche su nuovi campi delle tabelle aggiuntive con
// ad esempio: b.country = qualcosa.
 
$anno=date("Y");
$mese=date("m");
$giorno=date("d");
$giornosett=date("w");
 
$giorno1 = date("d",mktime(0,0,0,$mese,intval($giorno)-intval($giornosett)+1,$anno));
 // giorno inizio settimana (lunedì)
 
$giorno2 = date("d",mktime(0,0,0,$mese,intval($giorno)-intval($giornosett)+7,$anno));
 // giorno fine settimana (domenica)
 
$mese1 = date("m",mktime(0,0,0,$mese,intval($giorno)-intval($giornosett)+1,$anno));
 // mese inizio settimana (lunedì)
 
$mese2 = date("m",mktime(0,0,0,$mese,intval($giorno)-intval($giornosett)+7,$anno));
 // mese fine settimana (domenica)
 
$anno1 = date("Y",mktime(0,0,0,$mese,intval($giorno)-intval($giornosett)+1,$anno));
 // anno inizio settimana (lunedì)
 
$anno2 = date("Y",mktime(0,0,0,$mese,intval($giorno)-intval($giornosett)+7,$anno));
 // anno fine settimana (domenica)
 
 
 
$gg= date("t"); // giorni del mese in corso
 
$tf = "(((`dates` >= '".$anno1."-".$mese1."-"."01"."')  AND 
(`dates` <= '".$anno2."-".$mese2."-".$gg."') ) OR 
"."((`enddates` >= '".$anno1."-".$mese1."-"."01"."')  AND 
(`enddates` <= '".$anno2."-".$mese2."-".$gg."' )) OR "
."((`dates` >= '".$anno1."-".$mese1."-"."01"."')  AND 
(`enddates` <= '".$anno2."-".$mese2."-".$gg."' )) OR "
."((`dates` <= '".$anno1."-".$mese1."-"."01"."')  AND 
(`enddates` >= '".$anno2."-".$mese2."-".$gg."' ))) ";
 
 
     if (empty($cerca) and (JRequest::getVar('submit','no','POST')=="Trova")) {
     $session->set('cerca','0','mese');
     JRequest::setVar('limitstart',0,'Get');
     $mem=0;
     }
 
    if ( !empty($cerca) ){
            echo $fissa.$tf." AND ".implode(' AND ', $cerca);
            $mem=1;
            $session->set('cerca',$cerca,'mese');          
    }
 
    elseif ((JRequest::getVar('submit','no','POST')<>"Trova") and
  ($session->get('cerca',0,'mese')<>0)) {
    $cerca=$session->get('cerca',0,'mese');
    echo $fissa.$tf." AND ".implode(' AND ', $cerca);
    }
    else
    {
    echo $fissa.$tf;
    }
?>
 

Sezione Header della ricerca Eventi del Mese

 
<?php
 
$db =& JFactory::getDBO();
$query = "
 
SELECT s.catname
  FROM  #__eventlist_categories as s WHERE s.id =
 '".JRequest::getVar('catsid', '', 'post')."'
 
";
$db->setQuery($query);
 
$nomes11 = $db->loadRow();
 
$memo[]=JRequest::getVar('title', '' , 'post');
$memo[]=JRequest::getVar('datdescription', '' , 'post');
$memo[]=JRequest::getVar('locid', '' , 'post');
$memo[]=$nomes11[0];
 
 
$nome_selected = JRequest::getInt('city', '', 'post');
$db =& JFactory::getDBO();
 
$query = "
 
SELECT `city`, `id`
 FROM `#__eventlist_venues`
 GROUP BY `city`
";
$db->setQuery($query);
$nomes = $db->loadAssocList();
$nome_options = "";
foreach ( $nomes as $v ) {
 if ( $nome_selected == $v['city'] ) {
 $selected = "selected='selected'";
 } else {
 $selected = '';
 }
 
 $nome_options .= "<option value='".$v['city']."'  >".$v['city']."</option>";
 
}
?>
 
<?php
 
$nome_selected = JRequest::getInt('catname', '', 'post');
$db =& JFactory::getDBO();
 
$query = "
 
SELECT `id`, `catname`
 FROM `#__eventlist_categories`
 ORDER BY `catname`
";
$db->setQuery($query);
$nomes = $db->loadAssocList();
$nome_options2 = "";
foreach ( $nomes as $v ) {
 if ( $nome_selected == $v['catname'] ) {
 $selected = "selected='selected'";
 } else {
 $selected = '';
 }
 
 $nome_options2 .= "<option value='".$v['id']."'  >".$v['catname']."</option>";
 
}
?>
 
<?php
 
$nome_selected = JRequest::getInt('state', '', 'post');
$db =& JFactory::getDBO();
 
$query = "
 
SELECT `id`, `state`
 FROM `#__eventlist_venues`
 ORDER BY `state`
";
$db->setQuery($query);
$nomes = $db->loadAssocList();
$nome_options3 = "";
foreach ( $nomes as $v ) {
 if ( $nome_selected == $v['state'] ) {
 $selected = "selected='selected'";
 } else {
 $selected = '';
 }
 
 $nome_options3 .= "<option value='".$v['state']."' $selected >".$v['state']."</option>";
 
}
 
?>
 
 
<div style="float:left; width: 100%; ">
<table width="100%" cellpadding="0" cellspacing="0">
 
 <tr bgcolor="#ffffff">
   <TD WIDTH=15%><b>Titolo</b>: </td>
   <TD WIDTH=35%><input type="text" name="title" /></td>
   <TD WIDTH=15%><b>Descrizione</b>: </td>
   <TD WIDTH=35%><input type="text" name="datdescription" /></td>
 </tr>
 <tr bgcolor="#ffffff">
   <TD WIDTH=15%><b>Località</b>: </td>
   <TD WIDTH=35%><select name="locid" class="form">
   <option value="" >Seleziona la località</option>
   <?php echo $nome_options; ?>
</select></td>
 
   <TD WIDTH=15%><b>Categoria</b>: </td>
   <TD WIDTH=35%><select name="catsid" class="form">
   <option value="" >Seleziona la categoria</option>
   <?php echo $nome_options2; ?>
</select></td>
 </tr>
 
 <tr>
   <td colspan="2"><img src="bordo_inferiore.gif"></td>
 </tr>
</table>
 
 
<p style="text-align:center;">
<input type="submit" value="Trova" name="submit" 
style='width:80px;color:#cccccc; background-color:#135cae; cursor:pointer;' />
<input type="reset" name="reset" value="Reset"
 style='width:80px;color:#cccccc; background-color:#135cae; cursor:pointer;' /></p>
<p style="text-align:center;"><b>Per resettare la ricerca lanciarla con campi vuoti</b></p>
</div>
<br/>
<br/>
 
<?php
     global $mem;
     if (($mem==0) and (JRequest::getVar('submit','no','POST')=="Trova")) {
          $session->clear('memo','mese');
     }
 
    if ( $mem==1 ){
          $session->set('memo',$memo,'mese');          
    }
 
    elseif ((JRequest::getVar('submit','no','POST')<>"Trova") and
  ($session->get('memo',0,'mese')<>0)) {
    $memo=$session->get('memo',0,'mese');
    }
    else
    {
    $session->clear('memo','mese');
    }
?>
 
<table width="100%"  border="0" cellspacing="0" cellpadding="0">
<tr>
<td colspan="5" ><?php global $total; echo $total; ?> 
Risultati trovati per: Titolo=<b style="color: #135cae;">
<?php echo $memo[0];?></b> Descrizione=<b style="color: #135cae;">
<?php echo $memo[1];?></b> Città=<b style="color: #135cae;">
<?php echo $memo[2];?></b> Categoria=<b style="color: #135cae;">
<?php echo $memo[3]; ?></b> <br/><br/></td>
</tr>
 
<tr>
<th width="15%" class="sectiontableheader">Data</th>
<th width="30%" class="sectiontableheader">Titolo</th>
<th width="20%" class="sectiontableheader">Sede e Descrizione</th>
<th width="20%" class="sectiontableheader">Città</th>
<th width="15%" class="sectiontableheader">Categoria</th>
</tr>
 

Ricerca Eventi della settimana

Sezione WHERE SQL

 
<?php
    $session =& JFactory::getSession('sett');
 
    if ($_SERVER['QUERY_STRING']=="") {
    $session->clear('cerca','sett');
    $session->clear('memo','sett');
    }
 
    $search_array = array('title','datdescription');
    global $mem;
    $cerca = array();
    foreach ( $search_array as $search ) {
      $value = JRequest::getVar($search, '' , 'post');
      $value = ereg_replace("'","\'",$value);
      if ( $value ) {
 
        $cerca[] = " `$search` LIKE '%$value%' ";
 
      }
    }
 
// nuove modalità di ricerca 
      if (JRequest::getVar('locid', '' , 'post')<>'') {
      $cerca[] = " b.city like '%".JRequest::getVar('locid', '' , 'post')."%' ";
      }
      if (JRequest::getVar('catsid', '' , 'post')<>'') {
      $cerca[] = " `catsid` = '".JRequest::getVar('catsid', '' , 'post')."' ";
      }
 
//costruzione parte fissa della query per ricerca su più tabelle
 
$fissainiziale = " `jos_eventlist_venues` as b, `jos_eventlist_categories` as c, `jos_eventlist_events`
  WHERE jos_eventlist_events.published = 1 and c.id = catsid and locid = b.id ";
$fissa = $fissainiziale." AND ";
//$fissafine = " ORDER BY 'dates' ";
 
// questo potenziamento consente di legare alla ricerca nuove tabelle oltre a quella definita
// nella connessione in TableName. E' possibile, dopo aver previsto nuovi campi di inserimento
// e definite le modalità di ricerca come sopra, attivare anche ricerche su nuovi campi delle 
// tabelle aggiuntive con ad esempio: b.country = qualcosa.
 
$anno=date("Y");
$mese=date("m");
$giorno=date("d");
$giornosett=date("w");
 
$giorno1 = date("d",mktime(0,0,0,$mese,(intval($giorno)-intval($giornosett)+1),$anno));
// giorno inizio settimana (lunedì)
 
$giorno2 = date("d",mktime(0,0,0,$mese,(intval($giorno)-intval($giornosett)+7),$anno)); 
// giorno fine settimana (domenica)
 
$mese1 = date("m",mktime(0,0,0,$mese,(intval($giorno)-intval($giornosett)+1),$anno)); 
// mese inizio settimana (lunedì)
 
$mese2 = date("m",mktime(0,0,0,$mese,(intval($giorno)-intval($giornosett)+7),$anno));
// mese fine settimana (domenica)
 
$anno1 = date("Y",mktime(0,0,0,$mese,(intval($giorno)-intval($giornosett)+1),$anno));
 // anno inizio settimana (lunedì)
$anno2 = date("Y",mktime(0,0,0,$mese,(intval($giorno)-intval($giornosett)+7),$anno));
 // anno fine settimana (domenica)
 
 
 
 
$gg= date("t"); // giorni del mese in corso
 
 
$tf = "(((`dates` <= '".$anno1."-".$mese1."-".$giorno1."')  AND 
(`enddates` >= '".$anno1."-".$mese1."-".$giorno1."') ) OR 
"."((`dates` <= '".$anno2."-".$mese2."-".$giorno2."')  AND 
(`enddates` >= '".$anno2."-".$mese2."-".$giorno2."' )) OR 
"."((`dates` >= '".$anno1."-".$mese1."-".$giorno1."')  AND 
(`enddates` <= '".$anno2."-".$mese2."-".$giorno2."' ))OR
 "."((`dates` <= '".$anno1."-".$mese1."-".$giorno1."')  AND 
 (`enddates` >= '".$anno2."-".$mese2."-".$giorno2."' )))";
 
 
     if (empty($cerca) and (JRequest::getVar('submit','no','POST')=="Trova")) {
     $session->set('cerca','0','sett');
     JRequest::setVar('limitstart',0,'Get');
     $mem=0;
     }
 
    if ( !empty($cerca) ){
            echo $fissa.$tf." AND ".implode(' AND ', $cerca);
            $mem=1;
            $session->set('cerca',$cerca,'sett');          
    }
 
    elseif ((JRequest::getVar('submit','no','POST')<>"Trova") and 
  ($session->get('cerca',0,'sett')<>0)) {
    $cerca=$session->get('cerca',0,'sett');
    echo $fissa.$tf." AND ".implode(' AND ', $cerca);
    }
    else
    {
    echo $fissa.$tf;
    }
?>
 

Sezione Header della ricerca Eventi della settimana

 
<?php
 
$db =& JFactory::getDBO();
$query = "
 
SELECT s.catname
  FROM  #__eventlist_categories as s 
WHERE s.id = '".JRequest::getVar('catsid', '', 'post')."'
 
";
$db->setQuery($query);
 
$nomes11 = $db->loadRow();
 
$memo[]=JRequest::getVar('title', '' , 'post');
$memo[]=JRequest::getVar('datdescription', '' , 'post');
$memo[]=JRequest::getVar('locid', '' , 'post');
$memo[]=$nomes11[0];
 
 
$nome_selected = JRequest::getInt('city', '', 'post');
$db =& JFactory::getDBO();
 
$query = "
 
SELECT `city`, `id`
 FROM `#__eventlist_venues`
 GROUP BY `city`
";
$db->setQuery($query);
$nomes = $db->loadAssocList();
$nome_options = "";
foreach ( $nomes as $v ) {
 if ( $nome_selected == $v['city'] ) {
 $selected = "selected='selected'";
 } else {
 $selected = '';
 }
 
 $nome_options .= "<option value='".$v['city']."'  >".$v['city']."</option>";
 
}
?>
 
<?php
 
$nome_selected = JRequest::getInt('catname', '', 'post');
$db =& JFactory::getDBO();
 
$query = "
 
SELECT `id`, `catname`
 FROM `#__eventlist_categories`
 ORDER BY `catname`
";
$db->setQuery($query);
$nomes = $db->loadAssocList();
$nome_options2 = "";
foreach ( $nomes as $v ) {
 if ( $nome_selected == $v['catname'] ) {
 $selected = "selected='selected'";
 } else {
 $selected = '';
 }
 
 $nome_options2 .= "<option value='".$v['id']."'  >".$v['catname']."</option>";
 
}
?>
 
<?php
 
$nome_selected = JRequest::getInt('state', '', 'post');
$db =& JFactory::getDBO();
 
$query = "
 
SELECT `id`, `state`
 FROM `#__eventlist_venues`
 ORDER BY `state`
";
$db->setQuery($query);
$nomes = $db->loadAssocList();
$nome_options3 = "";
foreach ( $nomes as $v ) {
 if ( $nome_selected == $v['state'] ) {
 $selected = "selected='selected'";
 } else {
 $selected = '';
 }
 
$nome_options3.="<option value='".$v['state']."' $selected >".$v['state']."</option>";
 
}
 
?>
 
 
<div style="float:left; width: 100%; ">
<table width="100%" cellpadding="0" cellspacing="0">
 
 <tr bgcolor="#ffffff">
   <TD WIDTH=15%><b>Titolo</b>: </td>
   <TD WIDTH=35%><input type="text" name="title" /></td>
   <TD WIDTH=15%><b>Descrizione</b>: </td>
   <TD WIDTH=35%><input type="text" name="datdescription" /></td>
 </tr>
 <tr bgcolor="#ffffff">
   <TD WIDTH=15%><b>Località</b>: </td>
   <TD WIDTH=35%><select name="locid" class="form">
   <option value="" >Seleziona la località</option>
   <?php echo $nome_options; ?>
</select></td>
 
   <TD WIDTH=15%><b>Categoria</b>: </td>
   <TD WIDTH=35%><select name="catsid" class="form">
   <option value="" >Seleziona la categoria</option>
   <?php echo $nome_options2; ?>
</select></td>
 </tr>
 
 <tr>
   <td colspan="2"><img src="bordo_inferiore.gif"></td>
 </tr>
</table>
 
 
<p style="text-align:center;">
<input type="submit" value="Trova" name="submit" 
style='width:80px; color:#cccccc; background-color:#135cae; cursor:pointer;' />
<input type="reset" name="reset" value="Reset" 
style='width:80px; color:#cccccc; background-color:#135cae; cursor:pointer;' /></p>
<p style="text-align:center;"><b>Per resettare la ricerca lanciarla con campi vuoti</b></p>
</div>
<br/>
<br/>
 
<?php
     global $mem;
     if (($mem==0) and (JRequest::getVar('submit','no','POST')=="Trova")) {
          $session->clear('memo','sett');
     }
 
    if ( $mem==1 ){
          $session->set('memo',$memo,'sett');          
    }
 
    elseif ((JRequest::getVar('submit','no','POST')<>"Trova") and 
  ($session->get('memo',0,'sett')<>0)) {
    $memo=$session->get('memo',0,'sett');
    }
    else
    {
    $session->clear('memo','sett');
    }
?>
 
<table width="100%"  border="0" cellspacing="0" cellpadding="0">
<tr>
<td colspan="5" ><?php global $total; echo $total; ?>
 Risultati trovati per: Titolo=<b style="color: #135cae;">
<?php echo $memo[0];?></b> Descrizione=<b style="color: #135cae;">
<?php echo $memo[1];?></b> Città=<b style="color: #135cae;">
<?php echo $memo[2];?></b> Categoria=<b style="color: #135cae;">
<?php echo $memo[3]; ?></b> <br/><br/></td>
</tr>
 
<tr>
<th width="15%" class="sectiontableheader">Data</th>
<th width="30%" class="sectiontableheader">Titolo</th>
<th width="20%" class="sectiontableheader">Sede e Descrizione</th>
<th width="20%" class="sectiontableheader">Città</th>
<th width="15%" class="sectiontableheader">Categoria</th>
</tr>
 

Inseriamo i nuovi codici nelle sezioni WHERE SQL e Header delle nuove connessioni create, e copiamo in esse i codici di Body e Footer dalla prima connessione. Salviamo ciascuna connessione e le associamo a nuove voci di menu con un titolo significativo del risultato della ricerca.

Questa sarà la finestra di avvio riceca per gli Eventi del Mese.

vales_06_mese

Questa sarà la finestra di avvio riceca per gli Eventi della Settimana.

vales_06_settimana

Il risultato finale sarà quello dichiarato all'inizio una nuova ricerca su Tutti gli Eventi, la ricerca sugli Eventi del Mese e quella sugli Eventi della Settimana offrendo così delle nuove specializzazioni alle ricerche già preventi nel componente Eventlist.

Oltre ad avere una sua utilità questa accopiata vuole anche essere, come per le altre, uno esempio a percorrere nuove strade per risolvere specifici problemi nel nostro Joomla. Proprio per questo alla fine di questo lavoro, voglio ringraziare gli utenti del forum di joomla.it per lo stimolo che hanno acceso per approfondire certi argomenti ed in particolare joored e nun84 per aver attivamente collaborato proponendo codice e collaudando le soluzioni che venivano proposte nelle fasi intermedie.

Spero che il codice nel travaso dalla demo funzionante non abbia riportato alterazioni e per ogni problema di chiarimenti e approfondimento ci sentiamo nel forum.

La demo è testabile a questo link: http://valesweb.altervista.org/ricerca-eventi.html

vales

http://valesweb.altervista.org


commentaCommenta questo articolo sul forum