1. Главная
  2. Форумы
  3. Техподдержка Drupal
  4. Решение проблем

Путь к списку новостей состоящий из года/месяца/дня

Главные вкладки

Здравствуйте. Помогите, пожалуйста, разобраться, как сделать так, чтобы набрав в адресной строке путь вида:

новости/2012/01/04

получать список новостей за указанный день, и аналогично получать за месяц (новости/2012/01), год (новости/2012), и все (новости),

Вроде бы задача полезная, но вот сколько не искал, а решений не нашел. Точнее для друпал 6 есть похожие трюки, но вот с контекстными фильтрами как ни тыркаюсь - не слушают.

Максимум, чего удалось добиться, это новости/2012-01-04, и они бы меня тоже устроили (ладно уж, раз не умею, то не гордый), но у них постоянная точность, т.е. либо с точностью до дня, либо до месяца, либо до года.

Вообщем помогите, если не сложно.

Комментарии

Аватар пользователя g78knl6cvxf0 g78knl6cvxf0 28 января 2012 в 21:10

Можно создать views.
В Page указать путь /news
Добавить "Страница" и указать путь /news/%/%/%
(почему нужно добавлять страницу так и не понял, но если будет только одна Page с адресом /news/%/%/% то не находит страницы, где перечислены не все аргументы).

После этого выбрать в "КРИТЕРИИ ФИЛЬТРАЦИИ" фильтры

  • "Опубликовано" (уже есть по умолчанию),
  • по типу содержимого (в моем случае "Новости"),
  • глобальный PHP (модуль Views PHP).

И составить такой запрос:

Setup Code:

<?php
function equilDate($arg, $field){
return (int)
$arg == (int)$field;
}
?>

Filter code:

<?php //выводить все новости
$v_filter= false; //получить аргументы
$v_args = $view->args; //если указан год
if(isset($v_args[0])){ //загрузить содержимое node
$v_node = node_load($data->nid); //извлечь дату из поля формата Unix timestamp
$v_field_date = $v_node->field_date_news['und'][0]['value']; //разложить дату на диапазоны (год, месяц, день..)
$v_ad = getdate( $v_field_date); //если диапазоны совпадают, то фильтр по прежнему выключен (false), иначе включен (true)
//проверка по году
$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, которых может быть очень много. Кто-нибудь может помочь лучшим вариантом?

Аватар пользователя g78knl6cvxf0 g78knl6cvxf0 5 февраля 2012 в 15:56

если никаких аргументов не передано, и нужно вывести все новости за текущий месяц, то можно воспользоваться контекстными фильтрами, как в этом примере, указав запрос:

<?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);
?>

Но как быть, когда нужно вычислить диапазон дат, на основе указанных в адресной строке?

Логотип drupal.ru

Содержимое сайта публикуется на условиях CreativeCommons Attribution-ShareAlike 3.0 или более поздней версии. Программные коды в тексте статей — на условиях GNU GPL v2 или более поздней версии.

Документация по совместной работе с репозиторием drupal.ru – https://docs.drupal.ru/code

Drupal – торговая марка Дриса Бёйтарта

12+

AltStyle によって変換されたページ (->オリジナル) /