Создание своего фильтра по произвольному полю. Пример решения задачи
Возникла необходимость создания своего фильтра вывода топиков на главной странице, в моем случае — это была необходимость вывода топиков за определенный период, например, с 2010 по 2011 года.
1. Создаем обработку передаваемого параметра, в нашем случае, период лет в виде Y-Y
Правим /classes/actions/ActionIndex.class.php
Находим событие вывода топиков на главную protected function EventIndex()
Создаем паттерн проверки корректности передаваемого параметра:
Передаваемый параметр должен содержать только целые числа, и знак "-", т.е., обрабатываем только значения вида ?period=2010-2011
Создаем обработчик и обрабатываем предаваемый параметр:
Получаем список топиков в периоде от $sDate1 до $sDate2
Заменяем
на
Теперь необходимо создать новый метод запроса топиков по нашим параметрам
2. Редактируем модуль топиков /classes/modules/topic/Topic.class.php
Добавляем новый метод с учетом наших фильтров:
3. Добавляем в маппер топиков обработку наших фильтров
Редактируем маппер топиков /classes/modules/topic/mapper/Topic.mapper.class.php
Находим метод обработки условий для постройки SQL запроса в соотв. с переданным фильтром:
protected function buildFilter($aFilter)
добавляем:
Создание фильтра на этом завершено.
Теперь при заходе на example.com/?period=2010-2011 на главной странице сайта будут отображаться топики, созданные за 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 комментария
opic?