Люди добры - помогите:
Есть стандартный, я так понимаю, сниппер по подсчёту кол-ва терминов. В моём случае это подсчёт авто по маркам.
<?php
$vid = 3; // Номер словаря
$terms_count = 0; // Сколько терминов отображать, 0 - все
$show_node_count = true; // Показывать или нет количество нод
$show_min_count = false; // Показывать термины с большим количеством нод, -1 - все ноды
$sort = false; // Сортировать в порядке возрастания при true, а при false в порядке убывания
$output = '
- ';
- '.l($term_name[$term], 'taxonomy/term/'.$term);
if ($show_node_count) {
$output .= ' ('.$count.')';
}
$output .= '
$items = array();
$term_name = array();
$terms = taxonomy_get_children(0, $vid);
foreach ($terms as $term) {
$count = db_result(db_query('SELECT COUNT(nid) FROM {term_node} WHERE tid = %d', $term->tid));
$items[$term->tid] = $count;
$term_name[$term->tid] = $term->name;
}
if ($sort) {
asort($items, SORT_NUMERIC);
} else {
arsort($items, SORT_NUMERIC);
}
$i = 1;
foreach ($items as $term => $count) {
if ($count == $show_min_count) {
break;
}
$output .= '
'."\n";
$i++;
if ($i == $terms_count) {
break;
}
}
echo $output,'
';
?>
Подскажите - как сделать так, чтобы выдавались не все ноды, а только те, которые были созданы не позднее двух месяцев с текущей даты. Я так думаю дело в SQL-запросе, но никак не пойму какое условие добавить.
Я ещё ДРУПАЛёнок в этом деле (новичок) поэтому прошу сильно не пинать. В SQL я тоже не особо силён. Заранее спасибо.
Комментарии
Неужели у моей проблемы нет решения? И придётся чистить саму базу данных? Не хотелось бы.
Не поверите. Уже неделю рыскаю по интернету. Никак не могу найти материал по SQL запросам именно в тандеме с датами. Если нетрудно - подскажите ссылки - где искать.
О! Спасиб. Углубился в чтение
О! Спасиб. Углубился в чтение
ну это понятно, что нужен JOIN , таблица term_node не содержит даты создания материала
Поправьте пожалуйста, что не так.
Поднатужился и родил такой вот запрос:
$time = strtotime('-2 month'); // Преобразовать строку в дату
foreach ($terms as $term) {$count = db_result(db_query('SELECT COUNT(nid)
FROM {term_node} tn INNER JOIN {node} n ON n.nid = tn.nid
WHERE tn.tid = %d and n.created > %d', $term->tid, $time));
Но он выдаёт пустоту. Получается где-то ошибка в синтаксисе или я не так таблицы объединяю.
$count = db_result(db_query('SELECT COUNT(tn.nid) FROM {term_node} tn INNER JOIN {node} n ON n.nid = tn.nid WHERE tn.tid = %d and n.created > %d', $term->tid, $time));
Не работает - нули выдаёт переменная count.
Но хотя бы понятен маршрут - куда копать.... Буду копать. Там скорее всего надо объединять таблицы не по полю nid. nid - если я правильно понимаю - идентификатор таблицы. Поля nid в обоих таблицах не имеют ничего общего.
у меня работает
ты еще чего-нибудь фантастического придумай
Это, кстати, тоже мысль. Надо будет подумать как это правильно сделать.
ничего не понял, но если тебе как то нужно по другому, то делай
Реально нуль выдаёт.
Выполняю такой код:
<?php
$vid = 3; // Номер словаря
$terms_count = 0; // Сколько терминов отображать, 0 - все
$show_node_count = true; // Показывать или нет количество нод
$show_min_count = false; // Показывать термины с большим количеством нод, -1 - все ноды
$sort = false; // Сортировать в порядке возрастания при true, а при false в порядке убывания
$output = '
';
$items = array();
$term_name = array();
$terms = taxonomy_get_children(0, $vid);
$time = strtotime('-2 month'); // Преобразовать строку в дату
echo 'Значение time: ',$time,'
';
foreach ($terms as $term) {
$count = db_result(db_query('SELECT COUNT(tn.nid) FROM {term_node} tn INNER JOIN {node} n ON n.nid = tn.nid WHERE tn.tid = %d and n.created > %d', $tid, $time));
$items[$term->tid] = $count;
$term_name[$term->tid] = $term->name;
echo 'Значение каунт: ',$count,'
';
}
?>
Поставил метку: echo 'Значение каунт: ',$count,'
';
Вот результат выполнения кода: http://c2n.me/jjMRc1
Нули же
ну так конечно, ты же не можешь даже код скопировать
я давал код с $term->tid, а у тебя $tid
О прикольно. Действительно потерялся хвостик. Хотя и копировал полным выделением.
drupby - огромное спасибо за помощь. Был бы женщиной - поцеловал бы, а так ... могу только руку пожать.
А задача-то не решилась до конца.
В моём случае есть ещё подвиды автомобилей.
При коде, что дал drupby главные термины выводятся правильно. Но только я выбираю (кликаю) мышкой на главный термин (к примеру автомобиль Лада - 1 штука) - раскрывается подтермин (лада Калина и т.д.) и там снова выдаются все ноды без фильтрации по переменной $time
Если я правильно понял, то переменная
$terms = taxonomy_get_children(0, $vid); - это массив всех дочерних терминов
И в цикле
foreach ($terms as $term) {
$count = db_result(db_query('SELECT COUNT(tn.nid) FROM {term_node} tn INNER JOIN {node} n ON n.nid = tn.nid WHERE tn.tid = %d and n.created > %d', $term->tid, $time));
$items[$term->tid] = $count;
$term_name[$term->tid] = $term->name;
}
перебираются все дочерние термины с записью результата в переменные массивы items и term_name
Пробовал в код добавить условие, чтобы писать только не нулевые термины
foreach ($terms as $term) {
$count = db_result(db_query('SELECT COUNT(tn.nid) FROM {term_node} tn INNER JOIN {node} n ON n.nid = tn.nid WHERE tn.tid = %d and n.created > %d', $term->tid, $time));
if ($count == 0) {
continue;
}
$items[$term->tid] = $count;
$term_name[$term->tid] = $term->name;
}
Но это не помогает.
Подскажите - где искать. Получается нужно в запрос ещё и третью таблице впихивать INNER JOIN-ем. Ну или я вообще не понимаю - откуда в подвидах берутся все ноды, вместо отфильтрованных по времени.
Помогите люди добрые.
так это же у тебя вьюха taxonomy/term/% , отредактируй ее, установи фильтр по дате создания
Упс, а для особо тупых - как это сделать - есть мануал. Не забывайте - я же Друпалёнок.
Точнее - не как фильтр поставить - это я смогу и сам, а где искать то место - где он ставится. taxonomy/term/% - где это?
/admin/build/views
Тут я уже был. Во всех представлениях стоит фильтр "дата создания материала">= смещение на 60 дней.
http://c2n.me/jkl4xl
Это не помогает.
Может надо в Инструментах кэш вьюхи почистить? Этого я не делал ещё
Может я не так объяснил:
После выполнения сниппера появляется такая картина: http://c2n.me/jkl9Fq
К примеру ВАЗ - 2 ноды (Это отфильтрованное по дате значение). Открываю вкладку ВАЗ, а там такая картина: http://c2n.me/jklbp7
Т.е. там все ноды с момента создания, а не 2 штуки как должно быть после фильтра
при нажатии на любой подвид вступает в действие фильтр вьюхи и выдаёт правильно. Либо ничего , либо эти 2 несчастные машины. Не работает именно подсчёт нодов в подтерминах.
Вьюха там не причём. Не могу понять где обрабатывается код вызова подтермина. В сниппере я так понимаю только главный термин обрабатывается. Т.е. название авто. А вот когда кликаешь по нём и открываются модели авто - это где? Не пойму. Там и надо фильтр ставить. А вьюхи только на выборку из базы влияют. Т.е. когда на подвид термина кликаешь. А вот это среднее звено вообще непонятно где.....
Может есть какие-нибудь инструменты для отладки кода? С точками прерывания и возможностью просмотра значений переменных? Как в Дельфи например. А то я Друпал плохо знаю.
Не прошло и 5 дней 2 часа - как нашёл я то место, где обрабатывает код.. В шаблоне, млин.... Там примерно такой же сниппер прописан.
Дальше дело техники:
Заменил код:
$t_child_count = db_result(db_query("SELECT COUNT(nid) FROM {term_node} WHERE tid = %d", $child->tid));
на:
$t_child_count = db_result(db_query('SELECT COUNT(tn.nid) FROM {term_node} tn INNER JOIN {node} n ON n.nid = tn.nid
WHERE tn.tid = %d and n.created > %d', $child->tid, $time));
И все пошло.
Спасибо всем, кто мне помогал. "Вклинился". А вьюхи тут не при чём. Они только список нод выдают. И фильтр можно поставить именно на выборку из базы.
А термины кодом сниппера прописаны.
И нет ответа.....