Clusit-Associazione Italiana per la Sicurezza Informatica
Il mio profilo su Linkedin
Il mio spazio su YouTube
Joomla Italia
Il mio profilo su vololibero.net
 
Album Picasa
 
Aggiungere un filtro alle liste PDF Stampa E-mail
Joomla 1.7
Lunedì 24 Ottobre 2011 19:01
Sono le piccole utilità che rendono meno stressante l'utilizzo di una lista. E' vero che esiste comunque una comoda paginazione ma quando le liste si compongono di molte pagine può venire utile usare uno o più filtri.
Non è difficile, vediamo come fare...

L'esempio che segue riguarda la parte amministrativa, dove le liste sono più usate, per l'amministrazione di contenuti.
Iniziamo con la parte di immissione dei dati discriminanti; per fare questo occorre creare un campo di input, che sia un semplice campo di testo o una combo box valorizzata.
Per creare un campo di input in un form si usa la classe JForm.
La parte "visuale" del campo di input è rappresentata da un file php contenente un metodo da sovrascrivere e dall'istanza del suo oggetto nel file del template di visualizzazione.
Chiamiamo il nostro filtro "aziendafilter", un ipotetico filtro di una lista fatture da filtrare per azienda di appartenenza.
Il file si chiamerà aziendafilter.php e sarà collocato in una cartella fields all'interno della cartella models: administrator/com_componente/models/fields/aziendafilter.php
Importiamo prima le librerie necessarie:
<?php
defined('JPATH_BASE') or die;

jimport('joomla.html.html');
jimport('joomla.form.formfield');
jimport('joomla.form.helper');
JFormHelper::loadFieldClass('list');

Ora estendiamo la classe JFormFieldList

class JFormFieldAziendaFilter extends JFormFieldList{
 /**
 * The form field type.
 *
 * @var        string
 * @since    1.6
 */
 protected $type = 'aziendafilter';

$type sarà il tipo di form da usare come riferimento. In pratica estende i tipi di fields standard
per costruire il nostro combobox con la lista delle aziende (il cui id farà da discriminante per la query che estrae la lista delle fatture) usiamo getOptions()

public function getOptions(){
 // Initialize variables.
 $options = array();

 $db = JFactory::getDbo();
 $query = $db->getQuery(true);

 $query->select('id As value, nome As text');
 $query->from('#__aziende AS a');
 $query->order('a.nome');

 // Get the options.
 $db->setQuery($query);

 $options = $db->loadObjectList();

 // Check for a database error.
 if ($db->getErrorNum()) {
 JError::raiseWarning(500, $db->getErrorMsg());
 }

 array_unshift($options, JHtml::_('select.option', '', JText::_('All')));

 return $options;
 }

Bene, abbiamo costruito la lista che comporrà la nostra select.
Ora dobbiamo collocarla nel template della vista lista (come standard joomla usa nominare la cartella aggiungendo la "s" finale in caso la vista sia relativa a più elementi come nel caso appunto delle liste.
Quindi il nostro componente ipotetico per fatture avrà all'interno della views due cartelle, una fattura e l'altra fatturas! bello eh! L'hanno studiata per nomi anglofoni...
Andiamo ad aprire il nostro file del template: administrator/com_componente/views/fattures/tmpl/default.php
Appena all'interno del form, dove la vostra grafica ve lo consente, inserite la combo box
<select name="azienda_id" onchange="this.form.submit()">
 <?php echo JHtml::_('select.options', JFormFieldAziendaFilter::getOptions(), 'value', 'text', $this->state->get('filter.azienda_id'));?>
 </select>

Notate che che il valore dell'id lo recupero dalla, o meglio dalle variabili state, e più precisamente da "filter", l'array che contiene tutti i valori usati come filtro,
Le variabili "state" vengono usate da Joomla per molte funzionalità.
Questo documento è un po' datato ma rende l'idea.
Occupiamoci ora di settare questa variabile e di come recuperarla per filtrare la nostra query "principale".

Non chiamando con il submit nessuna view o controller, il form spedito ritorna alla vista di default; la differenza è che ora tra le variabili state abbiamo la nostra tra quelle "filter".
Quello che segue è il nostro ipotetico file fatturas.php che si trova nella cartella models.
<?php
// No direct access to this file
defined('_JEXEC') or die('Restricted access');
// import the Joomla modellist library
jimport('joomla.application.component.modellist');

class FatturasModelFatturas extends JModelList{
 /**
 * Method to build an SQL query to load the list data.
 *
 * @return    string    An SQL query
 */
 protected function getListQuery(){

 $db = JFactory::getDBO();
 $query = $db->getQuery(true);
 $query->select('*');
 $query->from('#__Fatture');

 // Filter by azienda.
 $id_azienda = $this->getState('filter.azienda_id');
 if (is_numeric($id_azienda)) {
 $query->where('id_azienda = '.(int) $id_azienda);
 }
 return $query;
 
 }

 protected function populateState($ordering = null, $direction = null){
 // Initialise variables.
 $app = JFactory::getApplication('administrator');

 $id_azienda = $this->getUserStateFromRequest($this->context.'.filter.azienda_id', 'azienda_id', '');
 $this->setState('filter.azienda_id', $id_azienda);

 // List state information.
 parent::populateState('name', 'asc');
 }

}

Il metodo getListQuery è quello che ci permette di creare la lista della vista di default.
Se nelle variabili "state" è presente il nostro id discriminante, lo aggiungiamo alla discriminante della query.
PopulateState è il metodo che Joomla ci offre per popolare lo state in un model.

Ora ancora una cosa ed abbiamo finito, dobbiamo occuparci della view.
Infatti recuperare l'id discriminante ci permette di prevalorizzare la nostra combo.
Quindi all'interno del file view.html.php
class FatturasViewFatturas extends JView{
....

... e all'interno della nostra classe, recuperiamo le variabili state
$this->state = $this->get('State');

... e includiamo il nostro field creato all'inizio
require_once JPATH_COMPONENT .'/models/fields/aziendafilter.php';


Bene, abbiamo finito. Se avete problemi o notate errori non mancate di segnalarmeli.

 
 
Questo sito è dedicato alla mia ed altrui curiosità, come primordiale bisogno di conoscere, capire nella sua complessità ogni cosa. Questo sito è basato sul framework Joomla1.5.xx!. Ogni contenuto o script pubblicato è di libera consultazione e duplicazione purchè se ne citi la fonte. Clicca qui per votare