Сложная фильтрация материалов по полю

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

Аватар пользователя thehil thehil 31 мая 2009 в 20:21

Как в общем случае можно вывести список материалов, отфильтровам по сложному условию (к примеру вывести только те материалы где cck-поле меньше друго cck-поля).

Конкретнее.
Есть тип материала в котором есть 4 числовых поля: день и месяц начала сезона, день и месяц конца сезона (сезоны ежегодно в одно и то же время). Нужно вывести только те материалы где текущая дата попадает в диапазон между началом и концом сезона (если ещё конкретнее - тут будет ещё множество проверок, вроде если начало больше конца - нужно обрабатывать отдельно). Использовать date для этих целей не удалось, т.к. в дате никак нельзя уйти от привязки к году.
В общем случае можно опустить и день. Пусть будет только месяц. Как хотя бы сделать проверку date('n') > field_begin_month && date('n') < field_end_month?

Комментарии

Аватар пользователя Обухов Никита Обухов Никита 1 июня 2009 в 11:41

Можно добавить Computed field, в него заносить либо 1 (если date('n') > field_begin_month && date('n') < field_end_month) либо 0

Поле сделать *hidden* а во views сделать фильтр по нему.

PS> ерунду написал, сорри Smile

Аватар пользователя thehil thehil 1 июня 2009 в 13:35

"Обухов Никита" wrote:
Можно добавить Computed field

Тоже сначала пытался этим занятся, но потом понял что если такое поле сохранять в базе - оно будет недействительно на следующий день, если не сохранять - оно не будет видно во вьюсах.
Пока что решил проблему создав php-блок (но был бы рад другому решению):


<?php
  $sql 
"SELECT np.nid, np.title, n.title as season
  FROM node n, node np, content_field_parent p,
(
select s.nid,
MAKEDATE(YEAR(CURDATE()),1) + INTERVAL s.field_from_month_value - 1 MONTH + INTERVAL s.field_from_day_value - 1 DAY as d1,
MAKEDATE(YEAR(CURDATE()),1) + INTERVAL s.field_to_month_value - 1 MONTH + INTERVAL s.field_to_day_value - 1 DAY as d2
from content_type_season s
) s
 WHERE s.nid = n.nid
   AND n.nid = p.nid
   AND np.nid = p.field_parent_nid
   AND ((d1 <= d2 AND CURDATE() BETWEEN s.d1 and s.d2) OR (d1 >= d2 AND CURDATE() NOT BETWEEN s.d2 and s.d1))"
;

$result db_query_range($sql010);
while (
$node db_fetch_object($result)) {
  
$output[] =  l($node->title"node/$node->nid") . ". $node->season";
}
print 
theme('item_list'$output);
?>

Кстати, использование sql-евского CURDATE() вместо php-шного date() - какие может повлечь проблемы? Могут ли результаты этих функций сильно отличаться (разница +/-день несущественна)?