динамически создаю фильтр в view, пример с офф сайта друпала node_data_field_date.field_date_value_month друпал не понимает почему??
$view->filter[] = array(
'vid' => $view->vid,
'tablename' => '',
'field' => 'node_data_field_date.field_date_value_' . $part,
'value' => ${$part},
'operator' => '>=',
'options' => '',
'position' => count($view->filter),
'id' => 'node_data_field_date.field_date_value_' . $part,
Комментарии
Это полный текст или фрагмент? В конце - запятая и не закрыты скобки array.
нет, это фрагмент. вот весь код:
<?php
if ($args[0]){
$month = date("m");
$year = floor($args[0] / 12);
$mon = $args[0] % 12;
// Generate the date parts, using our stamp OR the arguments passed in to the view
$year = date('Y')-$year;
$month = date('m')-$mon;
foreach (array('year', 'month') as $part) {
$view->filter[] = array(
'vid' => $view->vid,
'tablename' => '',
'field' => 'node_data_field_published.field_date_value_' . $part,
'value' => ${$part},
'operator' => '==',
'options' => '',
'position' => count($view->filter),
'id' => 'node_data_field_date.field_date_value_' . $part
);
}
// IMPORTANT: Invalidate the cached query for this view, as it'll need to be regenerated on each request
$view->is_cacheable = 0;
}
?>
код изменился
в общем, мне нужно получить из параметра количество месяцев, которые нужно отнять от текущего, и вывести посты только за этот полученный месяц (1 - текущий месяц, 2 - предыдущий и т.п.). Пришел я вот к такому:
<?php
if ($args[0]){
$args[0]--;
$year = date("Y") - floor($args[0] / 12);
$month = date("m") - ($args[0] % 12);
$from = mktime(0,0,0,$month,1,$year);
$args[0]--;
if ($args[0]<0) $to = time();
else{
$year = date("Y") - floor(($args[0]) / 12);
$month = date("m") - (($args[0]) % 12);
$to = mktime(0,0,0,$month,1,$year);
}
$view->filter[] = array(
'vid' => $view->vid,
'tablename' => '',
'field' => 'node.created',
'value' => "'".$from."'",
'operator' => '>=',
'options' => '',
'position' => count($view->filter),
'id' => 'node.created'
);
$view->filter[] = array(
'vid' => $view->vid,
'tablename' => '',
'field' => 'node.created',
'value' => "'".$to."'",
'operator' => '<',
'options' => '',
'position' => count($view->filter),
'id' => 'node.created'
);
// IMPORTANT: Invalidate the cached query for this view, as it'll need to be regenerated on each request
$view->query='';
$view->is_cacheable = 0;
}
?>
пришлось делать ошибки в запросах - как иначе проверить правильность кода не знаю - таймштампы оказались правильными,
сделал один неправильный фильтр, чтобы посмотреть на SQL-запрос, он оказался вот таким:
SELECT DISTINCT(node.nid) FROM node node
WHERE (node.type IN ('anews')) AND (node.created >= -1 + 0) AND (node.created < -1 + 0) LIMIT 0, 10
причем если я делаю поле не node.created, а что-то отфанарное, то в значение как и надо подставляется таймштамп, а если node.created - то подставляется чушь какая-то! почему??
оказывается ей нужно подставлять дату YYYY-mm-dd, в таймштамп она ее сама переводит...
вот мой код для это вьюхи, может кому-то будет полезно
<?php
if ($args[0]){
$args[0]--;
$year = date("Y") - floor($args[0] / 12);
$month = date("m") - ($args[0] % 12);
$from = $year."-".$month."-01";
$args[0]--;
if ($args[0]<0) $to = date("Y-m-d");//time();
else{
$year = date("Y") - floor(($args[0]) / 12);
$month = date("m") - (($args[0]) % 12);
$to = $year."-".$month."-01";
}
$view->filter[] = array(
'vid' => $view->vid,
'tablename' => '',
'field' => 'node.created',
'value' => $from,
'operator' => '>=',
'options' => '',
'position' => count($view->filter),
'id' => 'node.created'
);
$view->filter[] = array(
'vid' => $view->vid,
'tablename' => '',
'field' => 'node.created',
'value' => $to,
'operator' => '<',
'options' => '',
'position' => count($view->filter),
'id' => 'node.created'
);
// IMPORTANT: Invalidate the cached query for this view, as it'll need to be regenerated on each request
$view->query='';
$view->is_cacheable = 0;
}
?>
что-то совсем не работают эти фильтры
хочу вывести ноды определенного типа "usernode"
добавил фильтр, сделал экспорт и увидел что надо добавить в аргумент-код
добавляю
<?php
$view->filter[] = array (
'tablename' => 'node',
'field' => 'type',
'operator' => 'OR',
'options' => '',
'value' => array ( 0 => 'usernode',)
);
$view->is_cacheable = 0;
?>
а оно не работает никак - пишет
user warning: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'IN ('usernode'))' at line 1 query: SELECT count(node.nid) FROM node node INNER JOIN users users ON node.uid = users.uid LEFT JOIN profile_values profile_siteurl ON users.uid = profile_siteurl.uid AND profile_siteurl.fid = '6' LEFT JOIN profile_values profile_sitename ON users.uid = profile_sitename.uid AND profile_sitename.fid = '5' LEFT JOIN profile_values profile_kratkoe ON users.uid = profile_kratkoe.uid AND profile_kratkoe.fid = '12' LEFT JOIN profile_values profile_siteban88x31 ON users.uid = profile_siteban88x31.uid AND profile_siteban88x31.fid = '9' INNER JOIN usernode usernode ON node.nid = usernode.nid LEFT JOIN users usernode_users ON usernode.uid = usernode_users.uid WHERE (. IN ('usernode')) in /home/site/includes/database.mysql.inc on line 172.
ясное дело что запрос неправильный - но что написать что-б стал правильным?
Удалось ли с этим разобраться?
Столкнулся именно с такой проблемой
подскажите как добавить элементарный динамический фильтр в views?
и еще - если добавляю с < ? php ... ? > то ошибки нет, но он все равно не работает.
Сам не пробовал, но недавно появился модуль viewsphpfilter.
спасибо, viewsphpfilter проверил - работает так:
выбираем фильтр по node->nid
там появляется доп тип php-filter
в теле фильтра пишем программу например такую
$ids[] = 84;
$ids[] = 83;
$ids[] = 82;
return $ids;
в результате получаем фильтр с отбором нод id 82 83 84, если что глючит - нажимаем "clear views cache".
но это-ж сложно такой код писать, хотелось-бы фильтры делать научиться.
нет, не разобрался, просто взял модуль node_profile - а он создает полноценную CCK ноду - ну и с ней можно что угодно уже в views птичками делать.
...