Main menu

Forum


× Forum di assistenza italiano

Aggiungere filtri personalizzati per la lista events

  • andre74
  • Avatar di andre74 Autore della discussione
  • Fresh Boarder
  • Fresh Boarder
Di più
1 Mese 1 Settimana fa #16657 da andre74
Buongiorno allo STAFF e al forum,

mi auguro di non sbagliare la modalità di inserimento dei contenuti e delle spiegazioni, è la prima volta che scrivo in un forum, spero di essere chiaro.
Avrei bisogno di capire, se possibile, come e dove fare la query al database per mostrare la lista eventi filtrata da due select, da me aggiunte nella zona filtri nel frontend del CMS, per filtrare appunto gli eventi utilizzando le nuove voci inserite nei campi personalizzati.
(allego immagini)

Descrivo il mio intervento:
Installazione di Joomla 3.9.2 stabile + T3 framework
database mysql
piattaforma linux e php 7.1.28 (online server aruba)

Ho installato Icagenda PRO 3.6.12
Ho creato 3 categorie (rosso - verde - giallo)
Ho creato 4 features (feature bambole - feature giochi da tavolo - feature macchinine - feature soldatini)
Ho creato 2 campi personalizzati (Corso e Sede)
Corso
Parent form : Form Evento
Etichetta : Corso
Nome : filter_corso
Tipo di Campo : Dropo-down List
Opzioni confermato=confermato
non confermato=non confermato
Sede
Parent form : Form Evento
Etichetta : Sede
Nome : filter_sede
Tipo di Campo : Radio Buttons
Opzioni di Parma=di Parma
di Reggio Emilia=di Reggio Emilia
non definita=non definita

A questo punto vorrei poter filtrare la lista degli eventi secondo le impostazioni dei campi personalizzati.
A seguire le personalizzazioni fatte ai codici:

com_icagenda-frontend\views\list\view.html.php
riga 165-166
add
|| $jinput->get('filter_month')
|| $jinput->get('filter_corso')

com_icagenda-frontend\views\list\tmpl\default_filter.php
riga 33-39
// Get Corso options
$corso              = JFormHelper::loadFieldType('Corso', false);
$corsoOptions       = $corso->getOptions();

// Get Sede options
$sede              = JFormHelper::loadFieldType('Sede', false);
$sedeOptions       = $sede->getOptions();

riga 90-95
$filter_corso       = $menuOptions
					? ($this->params->get('filter_corso', 1) * 6)
					: ($iCparams->get('filter_corso', 1) * 6);
$filter_sede       = $menuOptions
					? ($this->params->get('filter_sede', 1) * 6)
					: ($iCparams->get('filter_sede', 1) * 6);

riga 244-252
$html_filter_corso      = '<select class="ic-input-small" id="filter_corso" name="filter_corso">
						<option value="">' . JText::_('COM_ICAGENDA_FILTERS_SELECT_CORSO') . '</option>
						' . JHtml::_('select.options', $corsoOptions, 'id', 'value',
						$jinput->get('filter_corso')) . '</select>';

$html_filter_sede      = '<select class="ic-input-small" id="filter_sede" name="filter_sede">
						<option value="">' . JText::_('COM_ICAGENDA_FILTERS_SELECT_SEDE') . '</option>
						' . JHtml::_('select.options', $sedeOptions, 'id', 'value',
						$jinput->get('filter_sede')) . '</select>';

com_icagenda-frontend\models\list.php
riga 101-107
// Filter (dropdown) corso
		$corso = $this->getUserStateFromRequest($this->context . '.filter.corso', 'filter_corso', '', 'string');
		$this->setState('filter.corso', $corso);
		
		// Filter (dropdown) sede
		$sede = $this->getUserStateFromRequest($this->context . '.filter.sede', 'filter_sede', '', 'string');
		$this->setState('filter.sede', $sede);

riga 87
tolto commenti
$search = $app->getUserStateFromRequest($this->context . '.filter.search', 'filter_search');

riga 168-169
$id .= ':' . $this->getState('filter.corso');
		$id .= ':' . $this->getState('filter.sede');


com_icagenda-frontend\models\fields\
aggiunti i file
corso.php
<?php
/**
 *------------------------------------------------------------------------------
 *  iCagenda v3 by Jooml!C - Events Management Extension for Joomla! 2.5 / 3.x
 *------------------------------------------------------------------------------
 * @package     com_icagenda
 * @copyright   Copyright (c)2012-2017 Cyril Rezé, Jooml!C - All rights reserved
 *
 * @license     GNU General Public License version 3 or later; see LICENSE.txt
 * @author      Cyril Rezé (Lyr!C)
 * @link        http://www.joomlic.com
 *
 * @version 	3.6.0 2016-07-08
 * @since       3.6.0
 *------------------------------------------------------------------------------
*/

// No direct access to this file
defined('JPATH_BASE') or die;

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

/**
 * Corso frontend search filter.
 */
class JFormFieldCorso extends JFormFieldList
{
	/**
	 * The form field type.
	 *
	 * @var		string
	 * @since	3.6.0
	 */
	protected $type = 'corso';

	/**
	 * Method to get the field options.
	 *
	 * @return	array	The field option objects.
	 * @since	3.6.0
	 */
	
		/*public function getOptions()
	{
		return '<select id="'.$this->id.'" value="'.$this->value.'">'.
		       '<option value="confermato" >confermato</option>'.
		       '<option value="non confermato" >non confermato</option>'.
		       '</select>';
	}
}*/


public function getOptions()
	{
		$app            = JFactory::getApplication();
		$params         = $app->getParams();

		$filters_mode   = ($app->getMenu()->getActive()->params->get('search_filters') == 1)
						? $params->get('filters_mode', 1)
						: JComponentHelper::getParams('com_icagenda')->get('filters_mode', 1);

		// Initialize variables. 
		$options = array();

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

		$query->select('id, slug, value');
		$query->from('#__icagenda_customfields_data AS c');
		//$query->where('state = 1'); AND 'slug = filter_corso'
		$query->where('slug = "filter_corso"');
		$query->group('value');

		// Search in menu filtered list - Cerca nell'elenco dei menu filtrati
		if ($filters_mode == 1)
		{
			$value = $params->get('value', '');
			JArrayHelper::toInteger($value);
			$list_value = implode(',', $value);

			if ($value
				&& count($value) > 0
				&& ! in_array('0', $value))
			{
				$query->where('c.value IN (' . $list_value . ')');
			}
		}

		$query->order('c.value');
		
		
		// Get the options.
		$db->setQuery($query);

		$options = $db->loadObjectList();

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

		return $options;
	}
}



sede.php
<?php
/**
 *------------------------------------------------------------------------------
 *  iCagenda v3 by Jooml!C - Events Management Extension for Joomla! 2.5 / 3.x
 *------------------------------------------------------------------------------
 * @package     com_icagenda
 * @copyright   Copyright (c)2012-2017 Cyril Rezé, Jooml!C - All rights reserved
 *
 * @license     GNU General Public License version 3 or later; see LICENSE.txt
 * @author      Cyril Rezé (Lyr!C)
 * @link        http://www.joomlic.com
 *
 * @version 	3.6.0 2016-07-08
 * @since       3.6.0
 *------------------------------------------------------------------------------
*/

// No direct access to this file
defined('JPATH_BASE') or die;

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

/**
 * Sede frontend search filter.
 */
class JFormFieldSede extends JFormFieldList
{
	/**
	 * The form field type.
	 *
	 * @var		string
	 * @since	3.6.0
	 */
	protected $type = 'sede';

	/**
	 * Method to get the field options.
	 *
	 * @return	array	The field option objects.
	 * @since	3.6.0
	 */
	
/*		public function getOptions()
	{
		return '<select id="'.$this->id.'" value="'.$this->value.'">'.
		       '<option value="da Parma" >da Parma</option>'.
		       '<option value="da Reggio Emilia" >da Reggio Emilia</option>'.
		       '<option value="da definire" >da definire</option>'.
		       '</select>';
	}
}*/

		public function getOptions()
	{
		$app            = JFactory::getApplication();
		$params         = $app->getParams();

		$filters_mode   = ($app->getMenu()->getActive()->params->get('search_filters') == 1)
						? $params->get('filters_mode', 1)
						: JComponentHelper::getParams('com_icagenda')->get('filters_mode', 1);

		// Initialize variables. 
		$options = array();

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

		$query->select('id, slug, value');
		$query->from('#__icagenda_customfields_data AS c');
		//$query->where('state = 1'); AND 'slug = filter_corso'
		$query->where('slug = "filter_sede"');
		$query->group('value');

		// Search in menu filtered list - Cerca nell'elenco dei menu filtrati
		if ($filters_mode == 1)
		{
			$value = $params->get('value', '');
			JArrayHelper::toInteger($value);
			$list_value = implode(',', $value);

			if ($value
				&& count($value) > 0
				&& ! in_array('0', $value))
			{
				$query->where('c.value IN (' . $list_value . ')');
			}
		}

		$query->order('c.value');
		
		
		// Get the options.
		$db->setQuery($query);

		$options = $db->loadObjectList();

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

		return $options;
	}
}



com_icagenda-backend\utilities\list\list.php
riga 260-261
'filter_corso'    => '',
							'filter_sede'     => '',

libraries\ic_library\form\field\sortablefields.php
riga 243-244
elseif (in_array($fieldname, array('filter_category', 'filter_corso', 'filter_sede', 'filter_month', 'filter_year')))

sono andato nel backend di joomla, \ componenti \ icagenda e ho selezionato in alto a destra OPZIONIed controllato impostazioni dei filtri

ho fatto override lingua per mettere il valore alle due costanti
COM_ICAGENDA_FILTERS_SELECT_CORSO
COM_ICAGENDA_FILTERS_SELECT_SEDE

com_icagenda-backend\config.xml
riga 214-240
<field
			name="filter_corso"
			type="hidden"
			rendertype="radio"
			label="COM_ICAGENDA_LIST_SEARCH_FILTERS_CORSO_LBL"
			description=""
			default="1"
			class="btn-group"
			labelclass="control-label"
			>
			<option value="0">JHIDE</option>
			<option value="1">JSHOW</option>
		</field>
		
		<field
			name="filter_sede"
			type="hidden"
			rendertype="radio"
			label="COM_ICAGENDA_LIST_SEARCH_FILTERS_SEDE_LBL"
			description=""
			default="1"
			class="btn-group"
			labelclass="control-label"
			>
			<option value="0">JHIDE</option>
			<option value="1">JSHOW</option>
		</field>

riga 276
da 			default="filter_search,filter_from,filter_to,filter_category,filter_month,filter_year"
a 			default="filter_search,filter_from,filter_to,filter_category,filter_corso,filter_sede,filter_month,filter_year"


file in lingua in administrator
it-IT.com_icagenda.ini
COM_ICAGENDA_LIST_SEARCH_FILTERS_CORSO_LBL
COM_ICAGENDA_LIST_SEARCH_FILTERS_SEDE_LBL

com_icagenda-frontend\views\list\tmpl\default.xml
riga 332
da	default="filter_search,filter_from,filter_to,filter_category,filter_month,filter_year"
a	default="filter_search,filter_from,filter_to,filter_category,filter_corso,filter_sede,filter_month,filter_year"

riga 262-292
<field
				name="filter_corso"
				type="hidden"
				rendertype="radio"
				label="COM_ICAGENDA_LIST_SEARCH_FILTERS_CORSO_LBL"
				description=""
				default=""
				class="btn-group hidden-j25"
				labelclass="control-label hidden-j25"
				useglobal="true"
				showon="search_filters:1"
				>
				<option value="0">JHIDE</option>
				<option value="1">JSHOW</option>
			</field>
			
			<field
				name="filter_sede"
				type="hidden"
				rendertype="radio"
				label="COM_ICAGENDA_LIST_SEARCH_FILTERS_SEDE_LBL"
				description=""
				default=""
				class="btn-group hidden-j25"
				labelclass="control-label hidden-j25"
				useglobal="true"
				showon="search_filters:1"
				>
				<option value="0">JHIDE</option>
				<option value="1">JSHOW</option>
			</field>


Ora devo capire come mettere lo script con la ricerca query al database e la rispettiva visualizzazione dei risultati filtrati..
immagino, ad esempio, di dover fare una richiesta simile al database per quanto riguarda il filtro corso
SELECT *
FROM #__icagenda_customfields_data AS c, #__icagenda_events AS e
WHERE c.parent_id = e.id AND d.value = '[uno dei valori del select]' AND c.slug = 'filter_corso' AND e.state = 1

Ma non so come e dove intervenire e che script mettere in php (sto imparando a scrivere in php).

Potreste, salvo che non comporti uno stravolgimento del codice del programma, e dunque una situazione complessa, suggerirmi una eventuale soluzione?

Grazie.
Ottimo programma, sto aspettando l'uscita della release ICAGENDA 3.8 PRO con impazienza. :-)

In attesa di un vs eventuale riscontro porgo i miei più cordiali saluti. :-)

Si prega Accedi o Crea un account a partecipare alla conversazione.

Moderatori: giusebos
Tempo creazione pagina: 0.098 secondi

Follow Us

Create your Joomla templates with Template Creator CK