Динамический фильтр на основе таксономии
Прислано: dys@drupal.org
пн, 06/09/2010 - 09:53
Хочу создать фильтр как тут например
есть словарь
категория 1
категория 2
подкатегория 21
подкатегория 22
параметры 1
параметры 2
параметр21
параметр22
напрмер урл вида type/catalog/подкатегория 22
на этой странице выводим блок в котором выводим дерево таксономии с корнем в подкатегория 22
$terms = taxonomy_get_tree($vid,$parent = arg(2), $depth = -1, $max_depth = NULL);
всем параметрам присваиваем ссылки типа
type/catalog/подкатегория 22/параметр1
при нажатиии попадаем на эту же страницу только теперь мне нужно отсеять те термы в которых нет нод удолетворяющих условию( наличие параметра1)
урл вида /type/catalog/term1/terms2/ --- terms2 это термины через запятую 1,2,45
$terms = taxonomy_get_tree($vid,$parent = arg(2), $depth = -1, $max_depth = NULL); foreach ( $terms as $term ) { $count = db_result(db_query("SELECT COUNT(t.nid) FROM {term_node} t INNER JOIN {node} n ON t.nid=n.nid WHERE t.tid = %d AND t.tid = '1' AND t.tid = '2' AND t.tid = '45' AND n.type = 'price_item' AND n.status = 1", $term->tid, price_item )); /*Этим запросом я хочу подсчитать количество нод * у которых есть термы 1,2,45 и термин $term->tid, * если ноль то не показывать ссылку с термином. * Интересует сам запрос правильно создан * А то у меня что то не работает. */
}
Вообщем уперся и не могу сдвинуться, помогите может кто решал подобный алгоритм по другому или есть готовые решения.
- dys@drupal.org's blog
- Для комментирования войдите или зарегистрируйтесь
Как построить блок
SELECT td.tid, name, parent, COUNT(tn.nid) as nodes FROM `term_data` as td LEFT JOIN `term_node` as tn ON tn.tid = td.tid LEFT JOIN `term_hierarchy` as th ON tn.tid = th.tid GROUP BY td.tid
А потом ручками строим дерево, например через рекурсивную функцию или таблицу указателей
Например:
<?php
$res = db_query("SELECT td.tid, name, parent, COUNT(tn.nid) as nodes
FROM {term_data} as td
LEFT JOIN {term_node} as tn ON tn.tid = td.tid
LEFT JOIN {term_hierarchy} as th ON tn.tid = th.tid
GROUP BY `tn.tid`
ORDER BY `th.parent` ASC, `nodes` DESC"); //сортировка по parent'у необходимо чтобы правильно построить дерево
$tree = array();
$leafs = array();
while($row = db_fetch_array($res)){
if(!$row->parent){
$tree[$row->tid] = $row;
$leafs[$row->tid] = &$tree[$row->tid];
} else {
$leafs[$row->parent]['children'][$row->tid] = $row;
$leafs[$row->tid] = &$leafs[$row->parent]['children'][$row->tid];
}
}
return $tree;
?>За работоспособность кода не отвечаю, писал прямо в форме ответа на сайте :)
- Для комментирования войдите или зарегистрируйтесь
Как построит вывод отфильтрованных нод
Создаем View, в аргументах:
Tаксономия Term Id, включаешь Allow multiple terms per argument.
соответственно все ноды которые подпадают под фильтр нужных терминов можно получить так
/1+2+3+4+5 (или 1,2,3,4,5)
если фильтруется по tid 1, 2, 3, 4 и 5
- Для комментирования войдите или зарегистрируйтесь
Спасибо, получается вы одним запросом вытащили сумму для всех термов?а я в цыкле.
- Для комментирования войдите или зарегистрируйтесь
Спасибо, получается вы одним запросом вытащили сумму для всех термов?а я в цыкле.
Кстате, можно сделать выбор фильтров через view, нужно просто хорошенько оттемизировать вывод только.
- Для комментирования войдите или зарегистрируйтесь
Спасибо, получается вы одним запросом вытащили сумму для всех термов?а я в цыкле.
Вообще в цикле делать SQL запросы категорически противопоказано. Если API не даёт вам инструментов этого избежать то нафиг такое API тогда надо его обходить ниже. 1 умеренно сложный запрос гораздо быстрее чем 10 простых запросов.
- Для комментирования войдите или зарегистрируйтесь
пример работы подобного фильтра см на http://rigel.com.ua/ (слева блок)
за подробностями - в личку
- Для комментирования войдите или зарегистрируйтесь
это виевс а мне надо сделать динамический фильтр который создается автоматически в зависимости от параметров товара
например будет 300 категорий и в каждой категории сви фильтры
монитор-- расширение
...
дрели --мощность
...
фотоопараты - пиксели
...
- Для комментирования войдите или зарегистрируйтесь
это виевс а мне надо сделать динамический фильтр который создается автоматически в зависимости от параметров товара
например будет 300 категорий и в каждой категории сви фильтры
монитор-- расширение
...
дрели --мощность
...
фотоопараты - пиксели
...
В чем проблема? В представлении "фильтров" есть аргумент Parent Term
- Для комментирования войдите или зарегистрируйтесь
это виевс а мне надо сделать динамический фильтр который создается автоматически в зависимости от параметров товара
например будет 300 категорий и в каждой категории сви фильтры
монитор-- расширение
...
дрели --мощность
...
фотоопараты - пиксели
...
В чем проблема? В представлении "фильтров" есть аргумент Parent Term
drupal 5, views 5-x 1.8, там тоже есть?
а вообще хочется как тут, блок слева
- Для комментирования войдите или зарегистрируйтесь
drupal 5, views 5-x 1.8
Ну тогда ничем помочь не могу, Остаётся писать модуль для вывода фильтров :)
- Для комментирования войдите или зарегистрируйтесь
drupal 5, views 5-x 1.8
Ну тогда ничем помочь не могу, Остаётся писать модуль для вывода фильтров :)
))Спасибо и так многое показали
- Для комментирования войдите или зарегистрируйтесь
это виевс а мне надо
о чем вы - блок фильтров написан мной руками - это модуль
товарвы выводятся тоже без вьюсов (но это уже скорее косяк сайта)
список фильтров можно наверное привязать к разделам таксономии, и показывать разные наборы в зависимости от
- Для комментирования войдите или зарегистрируйтесь
список фильтров можно наверное привязать к разделам таксономии, и показывать разные наборы в зависимости от
да примерно я себе так и представляю логику
Фильтры формируются на основе таксономиии(дочерние термы раздела, пользователь задает любые по необходимости)
при переходе по ссылке */*/term, модуль выводит дерево таксономии с головой в точке term ( это и будут фильтры),каждый фильтр( ссылка получает урл ввида */*/term,tid(фильтра)
и обратно генерируются страница только дерево фильтров строиться с учетом урла */*/term,tid
если есть товары у которых есть термы term,tid+ tid2 то выводим и присваиваем ссылку ввида */*/term,tid,tid2
Если терм фильтра уже присутствует в урле ему присваиваем класс подсвеченный и урл ввида */*/term,tid
- Для комментирования войдите или зарегистрируйтесь




Комментарии