Welcome, Guest
Username: Password: Remember me
  • Page:
  • 1

TOPIC:

[ tutorial | how make your own filter ] 10 Oct 2011 17:33 #186

  • doob
  • doob's Avatar Topic Author
  • Offline
  • Junior Member
  • Junior Member
  • Posts: 22
  • Thank you received: 2
Change 'com_calendar' and 'events' for your names...

You need those files:

MODEL :
(M1) - components/com_calendar/models/events.php

HELPER :
(H1) - administrator/components/com_calendar/helpers/helper.php

VIEW :
(V1) - components/com_calendar/views/events/tmpl/default_filters.php
(V2) - components/com_calendar/views/events/view.html.php

CONTROLLER :
(C1) - components/com_calendar/controllers/events.php


(M1)
class CalendarModelEvents extends CalendarModelList
{
...
function _buildQueryWhere()
	{
		$where = array();

		$app = &JFactory::getApplication();
		$db=& JFactory::getDBO();
		$option	= JRequest::getCmd('option');
		$view	= JRequest::getCmd('view');
		$layout	= JRequest::getCmd('layout', 'default');

		$baseUserState = $option . '_' . $view . '.' . $layout . '.';

		if ($this->_active['filter'])
		{
			$filter_type = $this->getState('filter_type');
			if ($filter_type != '')	$where[] = "a.type = " . $db->Quote($filter_type);

			$filter_category = $this->getState('filter_category');
			if ($filter_category != '')	$where[] = "a.category = " . $db->Quote($filter_category);
>>> JUST ADD THOSE CODE ( CHANGE ANY DATE FOR YOUR FIELD NAME )
>>>			$filter_date = $this->getState('filter_date');
>>>			if ($filter_date != '')	$where[] = "a.date = " . $db->Quote($filter_date);
>>> END
		}


(H1)
class CalendarHelper
{
 ...
>>> ADD THOSE CODE ( CHANGE ANY DATE FOR YOUR FIELD NAME )
	function dbList($ctrl, $fieldName)
	{
		$db =& JFactory::getDBO();
		$query = 'SELECT *,'. $fieldName .' FROM #__' . 'calendar_'.$ctrl;

		$db->setQuery( $query );

		$list = $db->loadObjectList();

		$lists[$ctrl][$fieldName] = array();
		$id = 1;
		foreach($list as $l ){
			$lists[$ctrl][$fieldName][$id] = array("value" => $l->date, "text" => $l->date);
			$id++;
		}	

		return $lists[$ctrl][$fieldName]; 

	}

>>> ....


(V1)
...
<script language="javascript" type="text/javascript">
<!--

function resetFilters()
{
	if ($('filter_type') != null)
	    $('filter_type').value='';
	if ($('filter_category') != null)
	    $('filter_category').value='';
>>>>>>>>>>>>>>>>>>>>
>>>	if ($('filter_date') != null)
>>>	    $('filter_date').value='';
>>>>>>>>>>>>>>>>>>>>

....

window.addEvent('domready', function()
{
	//Reset broken filter (if selected value is not anymore available)
	if (  !checkFilter('filter_type', ("<?php echo($this->filters['type']->value); ?>" == ''))
		|| !checkFilter('filter_category', ("<?php echo($this->filters['category']->value); ?>" == ''))

>>>>>
	>>>	|| !checkFilter('filter_date', ("<?php echo($this->filters['date']->value); ?>" == '')))

>>>>>
....
<legend onclick="toggle_div('filters_wrapper');"><?php echo JText::_( "JSEARCH_FILTER_LABEL" ); ?></legend>
>>>>>
>>> <!-- SELECT : Datee  -->

	<div class='filter filter_date'>
			<label for="filter_date"><?php echo(JText::_("CALENDAR_JSEARCH_DATE")); ?> :</label>			
			<?php echo JHTML::_('select.genericlist',  $this->filters['date']->list, 'filter_date', " onchange = 'this.form.submit()'", 'value', 'text', $this->filters['date']->value);?>

		</div>

>>>>>>>> 

....



(V2)
class CalendarViewEvents extends JView
{
	function display($tpl = null)
	{

....
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>_________HERE......
	$statesVars = array('limit', 'limitstart', 'filter_order', 'filter_order_Dir', 'filter_date', 'filter_type', 'filter_category');

.... 

function display_default($tpl = null)
{
.....
// table ordering
		$lists['order'] = $model->getState('filter_order');
		$lists['order_Dir'] = $model->getState('filter_order_Dir');

	>>>>	$lists['enum']['events.date'] = CalendarHelper::dbList('events', 'date');

.....

		//Filters
		//Date
		$this->filters['date'] = new stdClass();
		$this->filters['date']->list = $lists['enum']['events.date'];
		array_unshift($this->filters['date']->list, array("value"=>"", "text" => JText::_("CALENDAR_FILTER_NULL_DATE")));
		$this->filters['date']->value = $app->getUserState( $option . "_events.default.filter_date");

.....







(C1)
class CalendarControllerEvents extends CalendarController
{
	var $ctrl = 'events';
	var $singular = 'event';

	function __construct($config = array())
	{

		parent::__construct($config);

		$app = &JFactory::getApplication();


		// Register the filtering request variables
		$app->getUserStateFromRequest( $this->namespace . 'filter_type',		'filter_type',		'',	'varchar' );
		$app->getUserStateFromRequest( $this->namespace . 'filter_category',	'filter_category',	'',	'varchar' );
	>>>>>	$app->getUserStateFromRequest( $this->namespace . 'filter_date',		'filter_date',		'',	'date' );


....

		//Predefine fields depending on filters values
		$get = array();
		$app = &JFactory::getApplication();

>>>		//Date
>>>		$filter_date = $app->getUserState( $this->namespace . "filter_date");
>>>		if ($filter_date) $get[] = "filter_date=" . $filter_date;                
                
		//Type
		$filter_type = $app->getUserState( $this->namespace . "filter_type");
		if ($filter_type) $get[] = "filter_type=" . $filter_type;

The following user(s) said Thank You: JoomGuy

Please Log in or Create an account to join the conversation.

Last edit: by doob.
  • Page:
  • 1
Time to create page: 0.089 seconds

Although I found this tool some time ago I just started learning experimenting and building this first component on Monday and now on Thursday afternoon it's already online. Although I already had a working version done with another tool this is much easier to build and at the end you have the freedom to own your own component. Once you know how to use Cook you will boost your productivity as the learning curve is really moderate compared to many other tools.
Giori (Forum)

Get Started