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

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

Аватар пользователя g78knl6cvxf0 g78knl6cvxf0 16 января 2012 в 22:40

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

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

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

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

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

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

Комментарии

Аватар пользователя g78knl6cvxf0 g78knl6cvxf0 17 января 2012 в 8:14

Айдар, причем тут pathauto?( С помощью него можно указать путь к конкретному материалу, но не списку. Наверняка нужен views, только как его настроить

Аватар пользователя 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_filterfalse;

//получить аргументы
$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);
?>

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