Счетчик терминов с условием. Нужна помощь

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

Аватар пользователя micro-skrudz micro-skrudz 19 ноября 2014 в 13:50

Люди добры - помогите:

Есть стандартный, я так понимаю, сниппер по подсчёту кол-ва терминов. В моём случае это подсчёт авто по маркам.

<?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);
    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 .= '
  • '.l($term_name[$term], 'taxonomy/term/'.$term);
    if ($show_node_count) {
    $output .= ' ('.$count.')';
    }
    $output .= '
  • '."\n";
    $i++;
    if ($i == $terms_count) {
    break;
    }
    }
    echo $output,'

';
?>

Подскажите - как сделать так, чтобы выдавались не все ноды, а только те, которые были созданы не позднее двух месяцев с текущей даты. Я так думаю дело в SQL-запросе, но никак не пойму какое условие добавить.

Я ещё ДРУПАЛёнок в этом деле (новичок) поэтому прошу сильно не пинать. В SQL я тоже не особо силён. Заранее спасибо.

Комментарии

Аватар пользователя micro-skrudz micro-skrudz 20 ноября 2014 в 11:18

Не поверите. Уже неделю рыскаю по интернету. Никак не могу найти материал по SQL запросам именно в тандеме с датами. Если нетрудно - подскажите ссылки - где искать.

Аватар пользователя micro-skrudz micro-skrudz 20 ноября 2014 в 12:42

drupby wrote:
"ХулиGUN" wrote:
Да ладно... http://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html

зачем в данном случае эти функции mysql?

$time = strtotime('-2 month');

и дальше к примеру

db_query('SELECT nid FROM {node} WHERE created > %d', $time)

[/quote]

А как Ваш запрос сочетать с запросом: $count = db_result(db_query('SELECT COUNT(nid) FROM {term_node} WHERE tid = %d', $term->tid)); - тут я так понял выдаются все непустые ноды из терминов авто, если я правильно понимаю.
Нужно как-то эти два запроса объединить?

Аватар пользователя drupby drupby 20 ноября 2014 в 12:53

"micro-skrudz" wrote:
Нужно как-то эти два запроса объединить?

ну это понятно, что нужен JOIN , таблица term_node не содержит даты создания материала

Аватар пользователя micro-skrudz micro-skrudz 20 ноября 2014 в 13:42

drupby wrote:
ну это понятно, что нужен 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));

Но он выдаёт пустоту. Получается где-то ошибка в синтаксисе или я не так таблицы объединяю.

Аватар пользователя micro-skrudz micro-skrudz 20 ноября 2014 в 14:48

drupby wrote:

$time = strtotime('-2 month');// Эту строку лучше вынести из цикла
$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 в обоих таблицах не имеют ничего общего.

Аватар пользователя drupby drupby 20 ноября 2014 в 15:12

"micro-skrudz" wrote:
Не работает - нули выдаёт переменная count.

у меня работает
"micro-skrudz" wrote:
Поля nid в обоих таблицах не имеют ничего общего.

ты еще чего-нибудь фантастического придумай

Аватар пользователя micro-skrudz micro-skrudz 20 ноября 2014 в 15:35

"ХулиGUN" wrote:

Лучше вообще от цикла избавиться... Получить массив с count, tid и term_name и уже полученный массив разбирать...

Это, кстати, тоже мысль. Надо будет подумать как это правильно сделать.

Аватар пользователя drupby drupby 20 ноября 2014 в 15:11

"ХулиGUN" wrote:
Лучше вообще от цикла избавиться... Получить массив с count, tid и term_name и уже полученный массив разбирать...

ничего не понял, но если тебе как то нужно по другому, то делай

Аватар пользователя micro-skrudz micro-skrudz 20 ноября 2014 в 15:16

Реально нуль выдаёт.

Выполняю такой код:

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

    Нули же

Аватар пользователя drupby drupby 20 ноября 2014 в 15:26

"micro-skrudz" wrote:
Нули же

ну так конечно, ты же не можешь даже код скопировать
я давал код с $term->tid, а у тебя $tid

Аватар пользователя micro-skrudz micro-skrudz 20 ноября 2014 в 15:36

drupby wrote:
"micro-skrudz" wrote:
Нули же

ну так конечно, ты же не можешь даже код скопировать
я давал код с $term->tid, а у тебя $tid

О прикольно. Действительно потерялся хвостик. Хотя и копировал полным выделением.

drupby - огромное спасибо за помощь. Был бы женщиной - поцеловал бы, а так ... могу только руку пожать.

Аватар пользователя micro-skrudz micro-skrudz 21 ноября 2014 в 18:16

А задача-то не решилась до конца.

В моём случае есть ещё подвиды автомобилей.

При коде, что дал 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-ем. Ну или я вообще не понимаю - откуда в подвидах берутся все ноды, вместо отфильтрованных по времени.

Помогите люди добрые.

Аватар пользователя drupby drupby 21 ноября 2014 в 18:36

"micro-skrudz" wrote:
там снова выдаются все ноды без фильтрации по переменной $time

так это же у тебя вьюха taxonomy/term/% , отредактируй ее, установи фильтр по дате создания

Аватар пользователя micro-skrudz micro-skrudz 21 ноября 2014 в 19:21

Тут я уже был. Во всех представлениях стоит фильтр "дата создания материала">= смещение на 60 дней.

http://c2n.me/jkl4xl

Это не помогает.
Может надо в Инструментах кэш вьюхи почистить? Этого я не делал ещё

Аватар пользователя micro-skrudz micro-skrudz 21 ноября 2014 в 19:31

Может я не так объяснил:

После выполнения сниппера появляется такая картина: http://c2n.me/jkl9Fq

К примеру ВАЗ - 2 ноды (Это отфильтрованное по дате значение). Открываю вкладку ВАЗ, а там такая картина: http://c2n.me/jklbp7

Т.е. там все ноды с момента создания, а не 2 штуки как должно быть после фильтра

при нажатии на любой подвид вступает в действие фильтр вьюхи и выдаёт правильно. Либо ничего , либо эти 2 несчастные машины. Не работает именно подсчёт нодов в подтерминах.

Аватар пользователя micro-skrudz micro-skrudz 22 ноября 2014 в 8:55

Вьюха там не причём. Не могу понять где обрабатывается код вызова подтермина. В сниппере я так понимаю только главный термин обрабатывается. Т.е. название авто. А вот когда кликаешь по нём и открываются модели авто - это где? Не пойму. Там и надо фильтр ставить. А вьюхи только на выборку из базы влияют. Т.е. когда на подвид термина кликаешь. А вот это среднее звено вообще непонятно где.....

Может есть какие-нибудь инструменты для отладки кода? С точками прерывания и возможностью просмотра значений переменных? Как в Дельфи например. А то я Друпал плохо знаю.

Аватар пользователя micro-skrudz micro-skrudz 24 ноября 2014 в 16:05

micro-skrudz wrote:
Вьюха там не причём. Не могу понять где обрабатывается код вызова подтермина.

Не прошло и 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));

И все пошло.

Спасибо всем, кто мне помогал. "Вклинился". А вьюхи тут не при чём. Они только список нод выдают. И фильтр можно поставить именно на выборку из базы.

А термины кодом сниппера прописаны.