Здравствуйте. Помогите, пожалуйста, разобраться, как сделать так, чтобы набрав в адресной строке путь вида:
новости/2012/01/04
получать список новостей за указанный день, и аналогично получать за месяц (новости/2012/01), год (новости/2012), и все (новости),
Вроде бы задача полезная, но вот сколько не искал, а решений не нашел. Точнее для друпал 6 есть похожие трюки, но вот с контекстными фильтрами как ни тыркаюсь - не слушают.
Максимум, чего удалось добиться, это новости/2012-01-04, и они бы меня тоже устроили (ладно уж, раз не умею, то не гордый), но у них постоянная точность, т.е. либо с точностью до дня, либо до месяца, либо до года.
Вообщем помогите, если не сложно.
Комментарии
Pathauto.
Айдар, причем тут pathauto?( С помощью него можно указать путь к конкретному материалу, но не списку. Наверняка нужен views, только как его настроить
Можно создать views.
В Page указать путь /news
Добавить "Страница" и указать путь /news/%/%/%
(почему нужно добавлять страницу так и не понял, но если будет только одна Page с адресом /news/%/%/% то не находит страницы, где перечислены не все аргументы).
После этого выбрать в "КРИТЕРИИ ФИЛЬТРАЦИИ" фильтры
И составить такой запрос:
Setup Code:
<?php
function equilDate($arg, $field){
return (int)$arg == (int)$field;
}
?>
Filter code:
<?php //выводить все новости
//загрузить содержимое node
//извлечь дату из поля формата Unix timestamp
//разложить дату на диапазоны (год, месяц, день..)
//если диапазоны совпадают, то фильтр по прежнему выключен (false), иначе включен (true)
//если год совпал, и указан месяц
$v_filter= false; //получить аргументы
$v_args = $view->args; //если указан год
if(isset($v_args[0])){
$v_node = node_load($data->nid);
$v_field_date = $v_node->field_date_news['und'][0]['value'];
$v_ad = getdate( $v_field_date);
//проверка по году
$v_filter = !equilDate($v_args[0] , $v_ad['year']);
if(!$v_filter && isset($v_args[1])){
//проверка месяца
$v_filter = !equilDate($v_args[1] , $v_ad['mon']);
//если месяц совпал и указан день
if(!$v_filter && isset($v_args[2])){
//проверка дня
$v_filter = !equilDate($v_args[2] , $v_ad['mday']);
}
}
} //true - отфильтровать, false - использовать
return $v_filter;
?>
проблема в постоянной загрузке node, которых может быть очень много. Кто-нибудь может помочь лучшим вариантом?
если никаких аргументов не передано, и нужно вывести все новости за текущий месяц, то можно воспользоваться контекстными фильтрами, как в этом примере, указав запрос:
<?php
$currentYear = date('Y');
$currentMonth = date('m');
$startDate = strtotime($currentYear."-".$currentMonth."-01"); $result = db_query("SELECT fn.entity_id FROM {field_data_field_date_news} fn WHERE
fn.field_date_news_value >= '" . $startDate . "'"); $nids = array();
foreach (
$result as $row){$nids[] = $row->entity_id;
}
return
implode('+', $nids);?>
Но как быть, когда нужно вычислить диапазон дат, на основе указанных в адресной строке?