Проблема возникает следующая - при использовании выборки по термину таксономии в фильтрах, имеем вот такую ошибку вместо карты:
query:
SELECT location.lid AS lid, node.title AS node_title,
node.nid AS node_nid, location.latitude AS gmap_lat,
location.longitude AS gmap_lon, node.type AS gmap_node_type FROM location location LEFT
JOIN location_instance location_instance ON location.lid = location_instance.lid LEFT
JOIN node node ON location_instance.vid = node.vid
WHERE (node.type IN ('arenda', 'exclusive', 'sale'))
AND (location.vid IN ( SELECT tn.vid FROM term_node tn WHERE tn.tid = 214 ))
ORDER BY node_title ASC
LIMIT 0, 10 IN /home/cradle/www2/sites/ALL/modules/views/includes/VIEW.inc ON line 755.
Вопрос извечно-русский - кто виноват и что делать?)
Комментарии
Кстати, есть такой ж багрепорт на оффсайте. Есть у кого что сказать по данному вопросу?)
Убийственный геморрой. Я конечно обойду его, но не решу задачи. Это бонус к тому, что taxonomy autocomplete depth тоже не работает. Видимо слухи о энергичном комьюнити - слишком преувеличены и остается лишь старый добрый способ: самому всё изучить досконально, причем чую, что начать придется именно с изучения PHP и MySQL. А пользоваться готовыми модулями - как добрыми примерами с историей применения. Наболело. Уже пять подобных историй произошло за 3 дня и я на пределе.
ОК. Давайте посмотрим что вызывает эту ошибку (для примера я убрал всё, что к делу не относится):
node.title AS node_title,
node.nid AS node_nid,
location.latitude AS gmap_lat,
location.longitude AS gmap_lon
FROM location location
LEFT JOIN location_instance location_instance ON location.lid = location_instance.lid
LEFT JOIN node node ON location_instance.vid = node.vid
WHERE (___location.vid___ IN (
SELECT tn.vid FROM term_node tn
WHERE tn.tid = 12345
)
Т.к. в SQL я такой же знаток как и PHP, пробуем методом перебора: разбираем на кусочки и проверяем в phpMyAdmin. Благо там есть возможность выполнить любой SQL-код. Ответ был, естественно, тот же что и у Drupal. Геморрой зарылся в том, что система не врубается, как не врубился и я, что за location.vid ищет скрипт. Порывшись в базе локального сайта, обнаруживается, что таблица location содержит lid, а вот соответствие lid и vid определено в таблице location_instance и потому на заявление типа "выбери мне из таблицы location все vid, которые совпадают с… нелепо. Их там просто нет, о чем и сообщает система незамысловатым
Unknown column 'location.vid'
. Этот проблемный кусок я отметил выше (___) в SQL-нотации. При замене 'location.vid' на правильный 'location_instance.vid' и проверке всей этой мутоты в phpMyAdmin я получил желаемую выборку. Хотя еще чутка подумав, я вообще потерялся: а почему это вообще vid берется у location, если термины таксономии привязываются к node? Теперь ясной стало направление проблемы и можно рассчитывать на помощь зубастых товарищей. Товарищи! Покажите свои зубы!Без знания что и как в фильтрах вы задали - только телепаты смогут вам помочь...
Скрином было бы неплохо поделиться...
Ой, а я Вам писал в ICQ. Так что я во все оружия. Телепатирую:
А если сменить стиль GMap сам Views выдаст node?
Нет, смена стилей тут не помогает. И тут вы чертовски правы, т.к. проблема не в Style.
По глупости своей скриншот обрезал сильно, а когда полностью его сделал - всё сам и увидел:
Проблема в том, какой View Type я (и, видимо, другие) выбираю при Add View. Чисто от непонимания и невнимательности происходит следующее. Красным обозначено то, что выбирл ранее, ниже - то что нужно выбирать.
А внизу Views сообщают:
The view type is the primary table for which information is being retrieved. The view type controls what arguments, fields, sort criteria and filters are available, so once this is set it cannot be changed.
Где-то прочитал, дословно: "Если что-то не работает в Drupal - сходи погуляй, вернись и сделай". Пойду порадую ребят на drupal.org. Всё работает на ура.
То есть проблема разрешается простой сменой типа представления?)
До того, что location.vid у нас не существует, я тоже допер) А дальше попросту плюнул на эту тему. Сегодня попробую поменять тип вьюхи, заранее спасибо))
Пардон, чего то никак не воткну. Создал новую вьюху. Тип представления выбрал Node, как и рекомендовалось. Стиль - Gmap. Задал фильтрацию по типу нодов и по словарю таксономии, а точнее - по Term ID. В полях вывода указал поле Название ноды. Результат - чистая страница, хоть и без ошибок. Хде косяк?) Привожу скриншот.
И еще напрягает меня вот этот SQL:
node.title AS node_title,
location.latitude AS gmap_lat,
location.longitude AS gmap_lon,
node.type AS gmap_node_type
FROM node node
INNER JOIN term_node term_node ON node.vid = term_node.vid
LEFT JOIN location_instance location_instance ON node.vid = location_instance.vid
LEFT JOIN location location ON location_instance.lid = location.lid
WHERE (node.status <> 0) AND (node.type IN ('arenda', 'exclusive', 'sale')) AND (term_node.tid = 214)
Напрягает тем, что таблица term_node вообще то пустая, а все термины лежат в term_data, и term_data.tid = 214 действительно имеет значение "Квартира".
Соответственно запрос, выполенный мною непосредственно на сервере MySQL возвращает пустой результат.
И есть у меня подозрение, что неумение мое пользоваться аргументами, а я их не прописал, до бобра не доведет. А дабы довестись до бобра, не мог бы уважаемый manfred привести скрин того, что он наворотил в аргументах вьюхи?
Мы не только не умеем пользоваться Views, мы еще и одинаково ленивы! ;))))
Arguments are parts of the URL of a view that can be used to reduce the result-set. A classic example of an argument would be in the case of taxonomy/term/TID or tracker/UID. In the former case, the view is restricted to posts tagged with the associated taxonomy ID; in the latter case, the view becomes restricted to posts by the specified user.
Т.е. аргументы тут вообще непричем. Ну, только если вы не собрались передавать их через URL. Типа 'http://locahost/maps/Квартиры'. Пока проблема не в этом. У вас нет никакой привязки терминов к конкретной ноде. Таблица 'term_node' содержит поля 'nid', 'vid', 'tid' в которых и задана связь между термином и нодой. Её пустота говорит именно об отсутствии связи терминов и нод. Если бы вы не пользовались CCK, то единственной возможностью принудительного вывода поля выбора таксономии в форме было бы задания его в редакторе словаря: /admin/content/taxonomy/edit/vocabulary/ваш_словарь. Там бы вы задали привязку типов материалов к словарю. Т.к. у вас есть CCK, вы просто должны добавить в материал Content Taxonomy Fields с привязкой к словарю. Не забудьте, что если вы только что создали его, то материалы еще не имеют связи с терминами и нужно будет эту связь установить, отредактировав созданные материалы.
Стоп стоп стоп. У меня весь поиск на сайте построен на таксономии и на Views. Соответсвенно, ведется он как раз по Content Taxonomy Fields, для которых создано несколько разных словарей, на каждое - свой. То есть материалы у меня как раз-таки связаны с терминами таксономии и замечательно по этим терминам ищутся. Можете даже сами попробовать: http://itblog.ath.cx:82/search
Тоже использован Views, тоже использованы термины таксономии в Exposed. А вот с картами полный швах - смотрите сами: http://itblog.ath.cx:82/maps
Совместными с teamfighter усилиями проблема была решена:
Т.к. поле, по которому производилась фильтрация, хоть и являлось по своей сути Таксономией, всё же было внедрено в тип содержимого, как поле CCK и относилось к Content, нежели к Taxonomy. Следовательно, фильтрация должна производится по Content -> ЖелаемоеПолеCCK, а не Taxonomy -> Taxonomy ID (depth).
Тут возникает вопрос: поле стало Dropdown списком, а как сделать этот Content field полем Autocomplete? Но это - предмет отдельной темы.
Думаю, что эту тему можно закрывать.
Подтверждаю. Все отлично работает, ну а остальное - предмет отдельной темы))
или так: http://drupal.org/node/468474