Блог пользователя - gWashington

Работа с Facet API и Apache Solr. Часть 4

6 мая 2012 в 2:08

Всем привет.

Как и обещал, расскажу, как включить возможность поиска по части слова, а не по целому. Дело в том, что по умолчанию Solr не понимает wildcard (не знаю, как это слово правильно перевести на русский). Извращается народ по разному, но, фактически, правильное решение одно - установка Solr версии 3.х. Дело в том, что в Solr 3-ей версии по умолчанию есть обработчик поисковых запросов Extended DisMax (edismax), в то время, как в Solr 1.x - обычный DisMax. Поддержка Solr 3.х в модуле Apachesolr Search Integration, насколько я знаю, достаточно давно сделана, поэтому даже не пишу, с какой версии ниженаписанное актуально. По большей части заметка будет об установке Solr 3.x. Итак, поехали.

Работа с Facet API и Apache Solr. Часть 3

24 апреля 2012 в 16:29

Привет.

Продолжаю свои заметки про работу с поисковиком Solr. В прошлых постах я писал о том, как добавлять в индекс дополнительные поля, как управлять процессом индексации определенного поля и как научить solr искать в этих полях. Сегодня расскажу о том, как можно договориться с solr'ом о том, что индексировать, а что нет. Оговорюсь, что нижеприведенный способ работает адекватно только начиная с версии apachesolr-1.x-beta19, раньше этого не было. Итак, рассказываю.

Работа с Facet API и Apache Solr. Часть 2

14 апреля 2012 в 9:05

Всем привет. В предыдущем посте я рассказал, как можно "повлиять" на процесс индексации, добавляя дополнительные поля в индекс, и создавать свои фасеты (фильтры) с помощью Facet API. Сегодня я хочу рассказать об альтернативном способе индексирования полей и возможности поиска по дополнительным полям. Дело в том, что Solr не ищет по всем полям, а только по тем, о которых его просят. Итак, поехали.

Работа с Facet API и Apache Solr. Часть 1

17 марта 2012 в 20:16
1

Всем привет.

Так сложилось, что передо мной встала задача создать библиографическую систему для хранения научных публикаций в большом количестве. Ну и как в любой нормальной библиографической системе, мне нужен поиск. На момент начала работы я уже был знаком с модулями Apachesolr search integration и Facet API, работающими в связке, и у которых довольно много возможностей из коробки, а помимо них есть ведь и API. Так вот некоторые мои задачи из коробки не решались, пришлось пообщаться и с разработчиками, и поковыряться в коде, поэтому я таки решил написать о решении некоторых задачек здесь. Возможно, кому-то будет полезно, возможно кто-то предложит, как сделать лучше.

Редирект на ошибке 404 [РЕШЕНО]

13 ноября 2011 в 17:55

Довольно простая задача, но решение почему-то не нагугливается.
Есть два пути добавления материала на сайт:
node/add/place
node/add/person
Но добавлять материал могут только зарегистрированные пользователи. Таким образом мне надо:
1. Если при переходе на эту страницу вываливается 404, редиректнуть их на форму входа со словами в стиле "зарегься/залогинься, потом добавишь"
2. После реги/логина редиректнуть обратно в форму добавления материала.
Как это сделать красиво?

Несоответствие типов в запросе при работе с PostgreSQL

25 октября 2011 в 15:21

Вот что внезапно выяснилось интересного.
При работе с MySQL запрос типа SELECT * FROM node WHERE nid = 'all' выдает пустой результат. При работе с PostgreSQL - ругается не соответствие типов, что логично, ведь тип поля nid - числовой.

Проявляется эта кака при работе с Views, когда есть аргумент (или сейчас контекстный фильтр) типа Содержимое: NID. Подставляем вместо значения какой-нибудь текст и если при работе с MySQL получаем просто пустой результат, то при работе с PostgreSQL вываливается ошибка, чего явно быть не должно.

А обнаружил я это косвенно (это, похоже, вторая проблема): когда я создаю этот контекстный фильтр, я хочу, чтобы когда вместо значения передается all, выводились все результаты. Дело в том, что начала вываливаться ошибка. Я стал пробовать на другом сайте, где СУБД - MySQL, там ошибки нет и все нормально выводится. Но что любопытно, ведь когда вместо значения аргумента стоит all, то по идее это условие в запросе вообще появляться не должно.

Импорт связей с помощью модуля Feeds

11 октября 2011 в 13:47

Приветствую.

Работаю над автоматизацией импорта материала на сайт. Поставил модуль Feeds, настраиваю экспорт из CSV файлов.
Весь материал на сайте - это 4 типа содержимого и 5 словарей таксономии.
Типы содержимого пока не трогаю, хочется рассмотреть словари таксономии. Дело в том, что в седьмом друпале к терминам можно привязывать поля. У терминов словаря "Издательства" есть поле "Страна", которое является ссылкой на термин словаря "Страны". И вот тут самое интересное - как это все дело импортировать?
Когда настраиваю маппинг, делаю name -> Название, все хорошо. Затем ввожу имя CSV поля - country, выбираю то самое поле-ссылку из списка, жму Добавить. Оно говорит, что изменения сохранены, но в списке полей ничего не появилось, как было одно название, так и осталось. Кто-нибудь делал такое? Знает кто, как победить?
И еще момент. Похоже, что импортер не учитывает обязательность/необязательность полей, умудряется оставлять обязательные поля пустыми. Это странно и неправильно. У всех так, или я чего-то не настроил?

Дополнение функционала модуля node_reference. Кастомный вывод и создание нод на лету.

10 октября 2011 в 14:22

Приветствую всех, кто читает.
Появилась задача, которую я пока что не знаю, как решить. Задача связана с полем node_reference. Дело в том, что я работаю над базой публикаций, где одна публикация может ссылаться на N других (этакий список используемой литературы). Для этой задачи я таки поставил модуль node_reference, создал поле, виджет выбрал "autocomplete field", но вот в чем засада: когда пользователь вводит несколько букв, поиск нод и вывод предлагаемого списка идет по заголовку. Мне же надо как-то переопределить вывод, чтобы выводились пара-тройка авторов (авторов у публикации может быть хоть сорок) и год публикации, например вот так:

1997, Иванов А. И., Петров С.С., "Расчленение слонов в лабораторных условиях"
2003, Смирнова Л.П., Матвеев И.Н., Ресницын Л.О., "Компиляция минеральной воды в пластиковых сосудах ниже уровня моря"

Ну и поиск тоже надо сделать кастомный, чтобы и по авторам, и по году искало. Немножко покопал модуль node_reference, но пока еще не разобрался. Вопрос: можно ли такое делать без написания своего модуля? Второй вопрос: если нельзя, то какие функции стоит посмотреть, чтобы их переопределить где-то у себя? Нужно ли js скрипт вывода как-то ковырять?

Хак корзины в уберкарте - количество товара

11 апреля 2011 в 15:52

Еще задачка по уберкарту.
Так как я продаю лицензии, мне нет смысла продавать их по куче за раз одному человеку. Один пользователь - одна лицензия.
Поэтому хочется сделать кнопочку не "Добавить в корзину", а как бы сразу "Купить лицензию", чтобы пользователь попадал на страничку оформления заказа лицензии в кол-ве 1шт. Как это сделать?

Чекбокс поле в профиле пользователя [РЕШЕНО]

7 апреля 2011 в 11:05

Использую модуль content_profile. Нужно в профиль добавить галочку как у ноды "Опубликовать на главной" и чтобы доступ регулировался тоже к ней. Как сделать?

Продажа лицензии с помощью Уберкарта [РЕШЕНО]

6 апреля 2011 в 13:32

Добрый день.

Возникла задача, че т не могу придумать как лучше сделать. Есть друпал 7 с уберкартом, нужно продавать с помощью него программные лицензии. Как это выглядит:
1. Пользователь качает софту с сайта, запускает, та выдает ему код активации.
2. Пользователь идет на сайт, покупает лицензию и каким-то образом указывает код активации.
3. После оплаты код активации попадает в БД, софта уже обращается к спец. скрипту, который говорит, активирована она или нет. Ну и если он оплатил - софта запустится.

Продать лицензию - это все легко, как лучше сделать указание кода активации?
Кстати еще нужен сервис возобновления лицензии, т.е. раз в месяц пользователю можно менять код активации. Я к чему - может быть проще будет привязаться к профилю пользователя? Т.е. код активации сделать полем, изменение которого разрешать лишь раз в месяц, а оплачено/не оплачено тоже разруливать с помощью какого-нибудь недоступного для редактирования поля в профиле?

Вывод данных разного типа вместе

6 апреля 2011 в 11:14

Добрый день.

Возник вопрос, как выводить данные разного рода вместе.
Например у меня сейчас стоит задача вывести автора, инфу о нем, а ниже список его статей. Или вывести топ авторов и топ статей (определяются вручную администратором).
Также была задача вывести смесь из терминов таксономии и принадлежащих им нод.

Как это вообще делается? Вручную то на ПХП я всегда напишу, интересно модулями.

Альтернативная форма добавления материала

25 февраля 2011 в 20:44

Добрый день.
Встала задача создать альтернативную форму создания материала. Причем именно для определенного типа материала надо.
Форма планируется достаточно навороченной, много JS, но это ладно, разберемся. Вопроса, собственно, два:
1. Как таки создавать альтернативные формы?
2. Как это сделать максимально гибко? Например выбор термина таксономии планируется сделать в виде линка "Добавить категорию", при нажатии открывать список терминов, где пользователь выбирает нужный, жмет "Добавить" и выбранный термин где-то отображается.
Заранее спасибо за советы.

Вывод поля Imagefield [РЕШЕНО]

17 января 2011 в 14:06

Добрый день.
У меня есть Node ID. Надо каким-то образом по этому айдишнику вытащить ноду и изображение, привязанное к ноде с помощью imagefield. Сколько ни пытаюсь и ни гуглю - что-то не выходит. Как это правильно сделать?
Заранее спасибо.

Taxonomy_Menu и Path

6 января 2011 в 11:45

Добрый день.

Пользуюсь услугами сабжевого модуля. И не могу понять, почему ссылки то вида /taxonomy/term/%, то /category/категория-продукта/% ?
Может кто-нибудь объяснить? Нужно, чтобы всегда был именно первый вариант.

Views и Date Filter [РЕШЕНО]

28 декабря 2010 в 20:49

Есть материал, во вьюшке надо вытащить записи за вчера/позавчера/указанную дату. Для указанной даты создал отдельную страницу, которая принимает аргумент - не могу понять, в каком формате его передавать. А записи за вчера пытаюсь вытащить с помощью фильтра, но ничего не получается. Модуль Views Date Range Filter, который я нашел, так он только для пятого друпала. Что делать?

Вывод терминов таксономии с общим родителем в блок Views [РЕШЕНО]

20 декабря 2010 в 13:38

Задача.
Имеется древовидный словарь таксономии. Термин, содержащий дочерние термины не может содержать продукты, т.е. продукты "лежат" только в "конечных" терминах (хз как правильно их называть). Есть блок для сайдбара, есть блок для контентной области.

Пусть есть словарь вида:
A
--AA
----AAA
----AAB
----AAC
--AB
B
и ссылка: http://example.com/taxonomy/term/AA

В этом случае в блоке в сайдбаре должны отображаться термины, имеющие с термином в ссылке общего родителя - AA и AB (общий родитель - A). В блоке в контентной области же отобразятся дочерние термины - AAA, AAB и AAC.

На чем я застопорился - вывод "братских категорий". Блок делается с помощью Views и как вывести элементы с общим предком при том, что единственный аргумент - это Taxonomy: Term, я не знаю. Есть у кого-нибудь идеи?

CCK - fieldset

10 декабря 2010 в 8:47

Вопрос по CCK. Есть такое понятие, как группа полей - fieldset образуется то бишь. Но вот в списке добавленных полей с помощью CCK не получается вложить один fieldset в другой. Погуглил - ничего путного не нашел. Подскажите, пожалуйста, как таки решить проблему.

Views - использование AJAX для аргументов

9 декабря 2010 в 21:34

Продолжаю свои изыскания с модулем Views.

Теперь задача такая. Есть блок со списком категорий материала, есть блок примерно такого вида:
ВСЕ | Сегодня | Вчера | Позавчера | Указать дату |

И на самой страничке вьюшкой выводится список материалов, удовлетворяющих заданным параметрам (аргументам). Проблема вот в чем - хочется все это сделать на AJAX. Смотрю я на блок Paginator и вижу, что в принципе получение списка материалов и вывод на страничку там реализован. Мне лишь надо как-то сделать, чтобы тот скрипт, что срабатывает при переключении страниц срабатывал бы и при выборе категории и при выборе периода. Тем более, что хочется реализовать множественный выбор категорий.

Что я сделал.
Я нашел файлик ajax_view.js, я нашел там вот такие строки:

// Process pager, tablesort, and attachment summary links.
.find('ul.pager > li > a, th.views-field a, .attachment .views-summary a')

Как я понял, туда нужно добавить через запятую айдишник или класс элемента, к которому будет "привязываться" JavaScript. Недолго думая добавил туда свой кусочек кода:

// Process pager, tablesort, and attachment summary links.
.find('ul.pager > li > a, th.views-field a, .attachment .views-summary a, div#block-menu-menu-categories div ul li ul li a')

Но при нажатии на категорию страничка таки перезагружается. Стал копать дальше.

У Paginator ссылка выглядит примерно так:

Работа с таксономией и вьюшкам - хлебные крошки и дочерние категории

7 декабря 2010 в 9:00

Здравствуйте, уважаемые.

Немножко запарился. У меня есть словарь таксономии с категориями продуктов, древовидный. Есть модуль taxonomy_menu, который этот словарь выводит в виде менюшки. При нажатии на пункт меню - откроется представление - список продуктов в текущей категории.

При создании представления выставил параметры:
Путь: /category/%, где % - аргумент - TermID (идентификатор термина таксономии). По нему и идет выборка продуктов.

Вопрос1: Допустим есть структура такая:

Категория 1
-- Категория 1.1
---- Категория 1.1.1
---- Категория 1.1.2
--Категория 1.2
Категория 2

Как бы так сделать, что при клике на Категория 1.1 я получу все продукты из вложенных категорий 1.1.1 и 1.1.2 в данном случае?

Вопрос 2: См. структуру выше. Мне надо, чтобы при открытии, например, Категория 1.1.2 хлебные крошки выглядели примерно так:

Главная > Каталог продуктов > Категория 1 > Категория 1.1 > Категория 1.1.2

А при выборе продукта конкретного (продукт просматривается тоже с помощью своего представлениея) в конце еще и добавилось имя продукта:

Главная > Каталог продуктов > Категория 1 > Категория 1.1 > Категория 1.1.2 > Мой продукт

BTW, Каталог продуктов - это название меню.