Google Maps Taxonomy

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

Аватар пользователя teamfighter teamfighter 21 октября 2009 в 19:56

Проблема возникает следующая - при использовании выборки по термину таксономии в фильтрах, имеем вот такую ошибку вместо карты:

UNKNOWN COLUMN 'location.vid' IN 'IN/ALL/ANY subquery'

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.

Вопрос извечно-русский - кто виноват и что делать?)

Комментарии

Аватар пользователя manfred manfred 29 октября 2009 в 20:52

Убийственный геморрой. Я конечно обойду его, но не решу задачи. Это бонус к тому, что taxonomy autocomplete depth тоже не работает. Видимо слухи о энергичном комьюнити - слишком преувеличены и остается лишь старый добрый способ: самому всё изучить досконально, причем чую, что начать придется именно с изучения PHP и MySQL. А пользоваться готовыми модулями - как добрыми примерами с историей применения. Наболело. Уже пять подобных историй произошло за 3 дня и я на пределе. Wink

Аватар пользователя manfred manfred 30 октября 2009 в 0:43

ОК. Давайте посмотрим что вызывает эту ошибку (для примера я убрал всё, что к делу не относится):

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
 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? Теперь ясной стало направление проблемы и можно рассчитывать на помощь зубастых товарищей. Товарищи! Покажите свои зубы! Smile

Аватар пользователя PVasili PVasili 30 октября 2009 в 0:43

Без знания что и как в фильтрах вы задали - только телепаты смогут вам помочь...
Скрином было бы неплохо поделиться...

Аватар пользователя manfred manfred 30 октября 2009 в 3:07

Нет, смена стилей тут не помогает. И тут вы чертовски правы, т.к. проблема не в 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. Всё работает на ура.

Аватар пользователя teamfighter teamfighter 30 октября 2009 в 16:40

То есть проблема разрешается простой сменой типа представления?)

До того, что location.vid у нас не существует, я тоже допер) А дальше попросту плюнул на эту тему. Сегодня попробую поменять тип вьюхи, заранее спасибо))

Аватар пользователя teamfighter teamfighter 10 ноября 2015 в 11:46

Пардон, чего то никак не воткну. Создал новую вьюху. Тип представления выбрал Node, как и рекомендовалось. Стиль - Gmap. Задал фильтрацию по типу нодов и по словарю таксономии, а точнее - по Term ID. В полях вывода указал поле Название ноды. Результат - чистая страница, хоть и без ошибок. Хде косяк?) Привожу скриншот.

И еще напрягает меня вот этот SQL:

SELECT node.nid AS nid,
   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 возвращает пустой результат.

Аватар пользователя teamfighter teamfighter 30 октября 2009 в 17:34

И есть у меня подозрение, что неумение мое пользоваться аргументами, а я их не прописал, до бобра не доведет. А дабы довестись до бобра, не мог бы уважаемый manfred привести скрин того, что он наворотил в аргументах вьюхи?

Аватар пользователя manfred manfred 30 октября 2009 в 18:34

Мы не только не умеем пользоваться 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 с привязкой к словарю. Не забудьте, что если вы только что создали его, то материалы еще не имеют связи с терминами и нужно будет эту связь установить, отредактировав созданные материалы.

Аватар пользователя teamfighter teamfighter 30 октября 2009 в 18:45

Стоп стоп стоп. У меня весь поиск на сайте построен на таксономии и на Views. Соответсвенно, ведется он как раз по Content Taxonomy Fields, для которых создано несколько разных словарей, на каждое - свой. То есть материалы у меня как раз-таки связаны с терминами таксономии и замечательно по этим терминам ищутся. Можете даже сами попробовать: http://itblog.ath.cx:82/search

Тоже использован Views, тоже использованы термины таксономии в Exposed. А вот с картами полный швах - смотрите сами: http://itblog.ath.cx:82/maps

Аватар пользователя manfred manfred 31 октября 2009 в 0:23

Совместными с teamfighter усилиями проблема была решена:

Т.к. поле, по которому производилась фильтрация, хоть и являлось по своей сути Таксономией, всё же было внедрено в тип содержимого, как поле CCK и относилось к Content, нежели к Taxonomy. Следовательно, фильтрация должна производится по Content -> ЖелаемоеПолеCCK, а не Taxonomy -> Taxonomy ID (depth).

Тут возникает вопрос: поле стало Dropdown списком, а как сделать этот Content field полем Autocomplete? Но это - предмет отдельной темы.

Думаю, что эту тему можно закрывать.