Создание своего фильтра по произвольному полю. Пример решения задачи

Возникла необходимость создания своего фильтра вывода топиков на главной странице, в моем случае — это была необходимость вывода топиков за определенный период, например, с 2010 по 2011 года.

1. Создаем обработку передаваемого параметра, в нашем случае, период лет в виде Y-Y
Правим /classes/actions/ActionIndex.class.php
Находим событие вывода топиков на главную protected function EventIndex()
Создаем паттерн проверки корректности передаваемого параметра:

$re1='(\\d+)';	# Начало периода
$re2='(-)';	# -
$re3='(\\d+)';	# Конец периода

Передаваемый параметр должен содержать только целые числа, и знак "-", т.е., обрабатываем только значения вида ?period=2010-2011

Создаем обработчик и обрабатываем предаваемый параметр:
if (preg_match_all ("/".$re1.$re2.$re3."/is", getRequest('period'), $matches)) {
$sDate1=$matches[1][0].'-01-01 00:00:00'; //начало периода
$sDate2=$matches[3][0].'-12-31 00:00:00'; //конец периода
}


Получаем список топиков в периоде от $sDate1 до $sDate2
Заменяем
$aResult=$this->Topic_GetTopicsGood($iPage,Config::Get('module.topic.per_page'));

на
$aResult=$this->Тopic_GetTopicsGoodByPeriod($iPage,Config::Get('module.topic.per_page'),$sDate1,$sDate2);


Теперь необходимо создать новый метод запроса топиков по нашим параметрам

2. Редактируем модуль топиков /classes/modules/topic/Topic.class.php
Добавляем новый метод с учетом наших фильтров:
public function GetTopicsGoodByPeriod($iPage,$iPerPage,$sDate1,$sDate2,$bAddAccessible=true) {
		$aFilter=array(
			'blog_type' => array(
				'personal',
				'open'
			),
			'topic_publish' => 1,
			'topic_rating'  => array(
				'value' => Config::Get('module.blog.index_good'),
				'type'  => 'top',
				'publish_index'  => 1,
			),
                'topic_period' => array(
                'date1' => $sDate1,
                'date2' => $sDate2,
            ),
            'order' => 't.topic_real_date desc'
   );
	/**
		 * Если пользователь авторизирован, то добавляем в выдачу
		 * закрытые блоги в которых он состоит
		 */
		if($this->oUserCurrent && $bAddAccessible) {
			$aOpenBlogs = $this->Blog_GetAccessibleBlogsByUser($this->oUserCurrent);
			if(count($aOpenBlogs)) $aFilter['blog_type']['close'] = $aOpenBlogs;
		}

		return $this->GetTopicsByFilter($aFilter,$iPage,$iPerPage);
}


3. Добавляем в маппер топиков обработку наших фильтров
Редактируем маппер топиков /classes/modules/topic/mapper/Topic.mapper.class.php

Находим метод обработки условий для постройки SQL запроса в соотв. с переданным фильтром:
protected function buildFilter($aFilter)

добавляем:
//топик имеет дату старше чем date1
        if (isset($aFilter['topic_period']['date1'])) {
			$sWhere.=" AND t.topic_date_add >=  '".$aFilter['topic_period']['date1']."'";
}
        //топик имеет дату младше чем date2
        if (isset($aFilter['topic_period']['date2'])) {
			$sWhere.=" AND t.topic_date_add <=  '".$aFilter['topic_period']['date2']."'";
}


Создание фильтра на этом завершено.
Теперь при заходе на example.com/?period=2010-2011 на главной странице сайта будут отображаться топики, созданные за 2010-2011 гг, что можно применить, например, для создания специфических плагинов под ваши цели.

4 комментария

avatar
оформите код нормально. в одном месте хусок удалили, в другом — в пхп код хтмл теги попали.
  • PSNet
  • 0
avatar
Спасибо! Не усмотрел.
avatar
$aResult=$this->opic_GetTopicsGoodByPeriod($iPage,Config::Get('module.topic.per_page'),$sDate1,$sDate2);


opic?
avatar
Поправил, еще раз спасибо. Не совсем понял почему так обрезает, копирую напрямую из ide.
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.