Динамический фильтр на основе таксономии

Прислано: 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,
 * если ноль то не показывать ссылку с термином. 
 * Интересует сам запрос правильно создан
 * А то у меня что то не работает.
*/

}
Вообщем уперся и не могу сдвинуться, помогите может кто решал подобный алгоритм по другому или есть готовые решения.

Комментарии


Настройки просмотра комментариев

Выберите нужный метод показа комментариев и нажмите "Применить"
Опубликовано t3hk0d3 в пн, 06/09/2010 - 10:58.

Как построить блок

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

За работоспособность кода не отвечаю, писал прямо в форме ответа на сайте :)


Опубликовано t3hk0d3 в пн, 06/09/2010 - 10:46.

Как построит вывод отфильтрованных нод

Создаем 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


Опубликовано dys@drupal.org в пн, 06/09/2010 - 11:06.

Спасибо, получается вы одним запросом вытащили сумму для всех термов?а я в цыкле.


Опубликовано t3hk0d3 в пн, 06/09/2010 - 14:31.

dys@drupal.org написал(а):

Спасибо, получается вы одним запросом вытащили сумму для всех термов?а я в цыкле.

Кстате, можно сделать выбор фильтров через view, нужно просто хорошенько оттемизировать вывод только.


Опубликовано t3hk0d3 в пн, 06/09/2010 - 14:34.

dys@drupal.org написал(а):

Спасибо, получается вы одним запросом вытащили сумму для всех термов?а я в цыкле.

Вообще в цикле делать SQL запросы категорически противопоказано. Если API не даёт вам инструментов этого избежать то нафиг такое API тогда надо его обходить ниже. 1 умеренно сложный запрос гораздо быстрее чем 10 простых запросов.


Опубликовано orangeudav в пн, 06/09/2010 - 16:34.

пример работы подобного фильтра см на http://rigel.com.ua/ (слева блок)
за подробностями - в личку


Опубликовано dys@drupal.org в вт, 07/09/2010 - 09:37.

это виевс а мне надо сделать динамический фильтр который создается автоматически в зависимости от параметров товара
например будет 300 категорий и в каждой категории сви фильтры
монитор-- расширение
...
дрели --мощность
...
фотоопараты - пиксели
...


Опубликовано t3hk0d3 в вт, 07/09/2010 - 11:09.

dys@drupal.org написал(а):

это виевс а мне надо сделать динамический фильтр который создается автоматически в зависимости от параметров товара
например будет 300 категорий и в каждой категории сви фильтры
монитор-- расширение
...
дрели --мощность
...
фотоопараты - пиксели
...

В чем проблема? В представлении "фильтров" есть аргумент Parent Term


Опубликовано dys@drupal.org в вт, 07/09/2010 - 11:57.

t3hk0d3 написал(а):
dys@drupal.org написал(а):

это виевс а мне надо сделать динамический фильтр который создается автоматически в зависимости от параметров товара
например будет 300 категорий и в каждой категории сви фильтры
монитор-- расширение
...
дрели --мощность
...
фотоопараты - пиксели
...

В чем проблема? В представлении "фильтров" есть аргумент Parent Term

drupal 5, views 5-x 1.8, там тоже есть?
а вообще хочется как тут, блок слева


Опубликовано t3hk0d3 в вт, 07/09/2010 - 12:14.

dys@drupal.org написал(а):

drupal 5, views 5-x 1.8

Ну тогда ничем помочь не могу, Остаётся писать модуль для вывода фильтров :)


Опубликовано dys@drupal.org в вт, 07/09/2010 - 12:22.

t3hk0d3 написал(а):
dys@drupal.org написал(а):

drupal 5, views 5-x 1.8

Ну тогда ничем помочь не могу, Остаётся писать модуль для вывода фильтров :)

))Спасибо и так многое показали


Опубликовано orangeudav в вт, 07/09/2010 - 16:24.

"dys@drupal.org" написал(а):

это виевс а мне надо

о чем вы - блок фильтров написан мной руками - это модуль
товарвы выводятся тоже без вьюсов (но это уже скорее косяк сайта)

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


Опубликовано dys@drupal.org в ср, 08/09/2010 - 09:10.

"orangeudav" написал(а):

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

да примерно я себе так и представляю логику
Фильтры формируются на основе таксономиии(дочерние термы раздела, пользователь задает любые по необходимости)
при переходе по ссылке */*/term, модуль выводит дерево таксономии с головой в точке term ( это и будут фильтры),каждый фильтр( ссылка получает урл ввида */*/term,tid(фильтра)
и обратно генерируются страница только дерево фильтров строиться с учетом урла */*/term,tid
если есть товары у которых есть термы term,tid+ tid2 то выводим и присваиваем ссылку ввида */*/term,tid,tid2
Если терм фильтра уже присутствует в урле ему присваиваем класс подсвеченный и урл ввида */*/term,tid


Новое на сайте