ВопросКаким способом лучше добавить свой счетчик нод в пунктах меню?
Здравствуйте! Дайте совет каким образом лучше это сделать, сейчас объясню как я сделал пока, но мне интуитивно кажется, что это не очень правильно.
На сайте есть небольшое главное меню с пунктами (категории таксономии). Выводится стандартными средствами через блок меню. Но мне необходимо к каждому пункту вывести кол нод из данной категории, причем при подсчете мне нужно учитывать некоторые факты. Я написал функцию:
function count_nodes($tid, $tid2) { $query = db_query("SELECT nid FROM term_node WHERE tid='".$tid."'"); $count = 0; while($nids = db_fetch_object($query)) { if (db_result(db_query("SELECT count(nid) FROM {node} WHERE nid='".$nids->nid."' AND status='1'")) > 0) { $date_expire = db_result(db_query("SELECT field_expdate_value FROM {content_type_stock} WHERE nid='".$nids->nid."'")); if ($date_expire >= time()) $count = $count + db_result(db_query("SELECT count(nid) FROM term_node WHERE nid='".$nids->nid."' AND tid='".$tid2."'")); } } return $count; }
и через jquery append() просто в каждую ссылку меню вставляю
<?php print count_nodes(1, $city_tid); ?>
Все работает, но возможно есть более изящное решение?
- Гость
- 17.12.2011
- 3941
Комментарии
Решение изящнее есть конечно. Только вы сначала объясните, почему сначала из {term_node} выбираются ноды для одного термина, а потом для другого. Как только объясните - будет вам кошерное решение)
Спасибо за советы! Объясняю: Первый $tid это категории на сайте, ну к примеру Яблоки, Груши и т.д., а второй $tid2 - город. Через фильтр views у меня запоминается текущий id города и его же подставляю в функцию. Чтобы выводило кол нод именно для конкретного города, а не все.
И кстати, никогда не пишите такие запросы:
Это прямой путь к sql-инъекциям. Пишите так:
И ещё лучше таблицу оборачивать в фигурные скобки. Т.к. в этом случае, если в settings.php у вас появятся префиксы, Друпал перепишет эти скобки с префиксами и запрос будет по-прежнему правильный:
И ещё :) Если выбирается одна запись, пользуйтесь db_query_range() вместо db_query() - так запрос будет работать быстрее.
Последний вариант совсем правильный :)
Я бы это написал так:
В итоге всего 2 запроса, вместо неизвестного, но явно большого количества.
Хотя можно попробовать вообще одним запросом обойтись:
сейчас попробовал первый вариант, но что-то не сработал. Выводит 0 в том месте где по идее должно вывести больше 0. Но меня больше всего смущало, что вставляю значения через jQuery, это можно сделать друпаловскими методами? Мне по сути надо перехватить вывод нужного меню и вставить в тег свои счетчики
Для этого вам надо имплементировать hook_menu_link_alter(). И да, jquery - это не выход :)
А как именно достучаться до нужного пункта меню?
Вывело массив, но без каких либо путей. Что-то нигде не могу найти даже примеров. Вот, что выводит:
Ну тут же самый первый элемент массива - title. Просто добавьте к нему число в скобках
Все равно не понимаю =) Как мне выбрать меню, которое я создал через админку, например называется mymain-menu и уже конкертно к его пунктам добавлять цифры. Хотя мне не просто скобки нужно добавить а типа такого:
<span>0</span>
Если я не ошибаюсь, то так:
Не работает :( Вот и я не могу понять как это сделать...
print_r($menu); выводит все пути в друпале. Мне нужно как раз для терминов таксономии изменить, наверное здесь:
попытался посмотреть, что покажет print_r( $item ), если $menu = 'taxonom/term/%' и ничего. То есть условие if ($menu == 'taxonom/term/%') не срабатывает.
А, у вас это через вьюс сделано.. Тогда это меняет дело.. Наверное, придётся темизировать. Во вьюс эсть такой параметр как Темизация (theming). Вам нужно счёлкнуть на него, выбрать необходимый уровень слоя, положить в корень темы файл с названием слоя и его исходным кодом (это вам всё предоставит Views), а дальше немного дописать своего кода в этом шаблоне :)
Комментировать