четверг, 24 февраля 2011 г.

Дисклеймер

В связи с тем, что автор данного блога в настоящий момент занимается проектом, отличным от построения социальной сети на Drupal, оперативный ответ на сообщения не гарантируется.

пятница, 26 марта 2010 г.

Модуль массового импорта данных

Для заполнения справочников и массового импорта анкетных данных (не в соц.сеть, но в смежный проект) открыла для себя модуль Node Import
С его помощью таксономия и пользователи отлично импортировались.
Пришлось поработать напильником с импортом данных для модуля Content Profile, т.к. Node Import по ему только известной причине не импортировал корректно CCK поля с датами, e-mail адресами и просто текстом. Ноды с типом profile Node Import создал, и на том спасибо.
Пришлось выкладывать данные в отдельную таблицу, и из нее "дергать" данные, обновлять ноды и получать нужный результат.

В целом - хороший модуль, только вот сыроват немного.

Грабли с справочниками

Когда мы только-только запускали сеть, решили что справочник городов пользователи будут пополнять сами, если не найдут то, что нужно.
Через весьма короткий промежуток времени в справочнике было по 4-5 названий на каждый крупный город (старое название, новое название, короткое название, английский вариант и т.д.), из-за чего при поиске "себе подобных" возникало множество проблем.
Привести в порядок справочник оказалось весьма трудоемким по времени занятием, поскольку пришлось фактически вручную выяснять, как еще можно обозвать уже однажды забитый в справочник город.

Дальше - больше. Аналогичным образом пополнялся справочник университетов - автозаполнением пользователями. Читающим эти строки: никогда не делайте подобного. Найдите список университетов вашей страны, добавьте контакты для предложений новых значений и не позволяйте пользователям самим забивать значения, иначе бардак и анархия вам гарантированы. У нас ушел почти целый рабочий день на приведение в соответствие к единому стандарту справочник с 1000 значениями.

ЗЫ: Остались еще автозаполняемые справочники компаний и школ. Пока оставим их как есть. )

понедельник, 8 февраля 2010 г.

Taxonomy в типе данных списка интересов

При создании сайта мы особо не думали про то, какой будет тип поля "увлечения", "любимые книги", "часто бываю" и т.д. Поставили текстовое поле, и зря, как выяснилось. ;)
Появилась потребность автоматизировать поиск "похожих" людей, людей, со схожими интересами, одинаковыми любимыми книгами, фильмами, и чтобы выводить все это в едином списке: например: "4 совпадения по книгам, фильмам с пользователем Имярек".

Возникла интересная задача - как разобрать и закешировать всю информацию, что пользователи о себе в этих полях ввели, отбросив окончания, очепятки, предлоги и местоимения.
После разбора данных появилась другая задача - как обезопасить поиск по введенным пользовательским данным.
А потом и третья, как сделать так, чтобы все это работало сразу: только поменял профиль и можешь искать себе подобных.

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

Был написан модуль и (хвала 5 mysql) хранимые процедуры с триггером. Триггер отвечает за вызов хранимой процедуры, хранимая процедура кеширует данные, модуль занимается отображением. И все довольны, от админа до пользователей.

Таксономия - отличная штука. Очень советую не наступать на наши грабли ;)

четверг, 12 ноября 2009 г.

Выпадающее меню через suckerfish dropdown

Сайт растет, забот с ним все больше и больше ;) Одна из последних - куда разместить то огромное количество ссылок на важные и полезные пункты, количество которых выросло в 2 раза с момента запуска системы?

Ответ пришел сразу: сделать верхнее меню, что выводится через Primary Links, выпадающим.

Сказано - сделано. Поиск по Drupal.ru дал ссылки на модуль nice_menu, который, по обещаниям, обещал мир во всем мире, и выпадающее меню за 2 клика.

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



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

  • В Mozilla FireFox 3 все работает отлично

  • В GoogleChrome, через который работаю я ;) зайти в выпадающие меню невозможно - меню пропадает, как только уводишь мышь с родительского пункта.


Поиск по англоязычным ресурсам подсказал более изящное решение, с ипользованием возможностей suckerfish dropdown.


Что такое suckerfish dropdown?

Если коротко - то это возможность сделать выпадающее меню путем подключения jquery скрипта и использования css стилей. Легко, красиво, изящно.

Я воспользовалась инструкцией, приведенной вот тут: http://alankinney.com/?tag=suckerfish-dropdowns (там же можно скачать модифицированный автором статьи Garland с меню) и ура, на сайте появились нормальные, работающие в моем зоопарке из браузеров, выпадающие меню из Primary Link.


Итак, что нужно сделать:


1. Найти где в вашей теме в файле page.tpl.php происходит вызов вывода PrimaryLinks. Обычно это строка вида

print theme('links', $primary_links, array('class' => 'links primary-links'))


Эту строку нужно заменить на следующее:


$my_menu = menu_tree('primary-links');//load the formatted menu_tree from drupal  
$my_menu = str_replace("leaf", "", $my_menu );//strip the leaf class
$my_menu = str_replace("active-trail", "", $my_menu );//strip the active trail class
$my_menu = str_replace("menu", "", $my_menu );//strip the menu class
$my_menu = str_replace("active", "", $my_menu );//strip the active class
$my_menu = str_replace("expanded", "", $my_menu );//strip the expanded class
$my_menu = str_replace(" first", "", $my_menu );//strip the first tags (w and w/o space)
$my_menu = str_replace("first", "", $my_menu );//strip the first tags (w and w/o space)
$my_menu = str_replace(" last", "", $my_menu );//strip the last tags (w and w/o space)
$my_menu = str_replace("last", "", $my_menu );//strip the last tags (w and w/o space)
$my_menu = str_replace(" class=\"\"", "", $my_menu );//strip the now empty class attribute and quotes
$my_menu = "<ul class=\"sf-menu\">" . substr($my_menu, 4, strlen($my_menu));//replace the <ul> with a ul tag thats classed for Superfish
 
print ($my_menu);


Обращаю ваше внимание на "<ul class=\"sf-menu\">" - в оригинале статьи тег не был выведен, а стал тегом, и из-за этого из простого копирования кода с экрана в первый раз у меня ничего не получилось.

Что этот код делает? Он убирает из меню все ненужные классы, что добавлены в него Друпалом, и превращает меню в нормальный список из тегов ul и Li.


2. Далее, сразу после ?>, которым вы закрыли вывод меню, нужно добавить скрипт вызова jQuery.

 <script type="text/javascript"> 
 
$(document).ready(function() {
$('ul.sf-menu').superfish({
delay: 500, // one second delay on mouseout
animation: {opacity:'show',height:'show'}, // fade-in and slide-down animation
speed: 'normal', // faster animation speed
autoArrows: true, // disable generation of arrow mark-up
dropShadows: true // disable drop shadows
});
});
</script>


3. С модификацией page.tpl.php закончено. Теперь займемся модификацией style.css и script.css


Скачайте дистрибутив http://users.tpg.com.au/j_birch/plugins/superfish/superfish-1.4.8.zip, из архива которого нам понадобятся 2 файла: js/Superfish.js и css/Superfish.css. Содержимое js файла нужно вставить в ваш script.js, содержимое css-файла - в файл style.css.


4. Все ;) Можете очистить кеш Друпал и наслаждаться вашим меню. Да, возможно вам понадобится еще стемизировать сами ссылки, но на это - FireBug вам в руки ;)


Еще пара полезных ссылок по теме:


http://www.cssplay.co.uk/menus/

http://www.master-web.info/dropdownmenu-css-gquery/

http://www.digifuzz.net/archives/2008/06/suckerfish-style-menus-in-drupa...

http://demo.roopletheme.com/tapestry/content/24-using-suckerfish-menus

http://thedrupalblog.com/suckerfish-css-drop-down-menus-drupal-made-simple !!!

http://alankinney.com/?tag=suckerfish-dropdowns

http://www.alistapart.com/articles/dropdowns

http://users.tpg.com.au/j_birch/plugins/superfish/

http://users.tpg.com.au/j_birch/plugins/superfish/#examples

http://drupal.org/node/34257

http://www.htmldog.com/articles/suckerfish/dropdowns/

вторник, 8 сентября 2009 г.

Отправка почты через сторонний SMTP сервер

Социальная сеть, развитием которой я занимаюсь, стоит на отдельном выделенном сервере с SUSE в качестве операционки. Те, кто ставили на ней систему, установили в качестве отправителя почты на ней sendmail+postfix. Но делать отдельный почтовый сервер на сервере с социальной сетью не хотелось, поэтому искалось решение отправки почты через уже существующие учетные почтовые записи.
Отправка почты с этого сервера постоянно работала с перебоями - то уведомления уходили, то нет, видимо это было связано с настройками сети, в которой стоит сервер.

В качестве промежуточного решения был поставлен модуль Drupal smtp, который позволяет организовать отправку почтовых сообщений через авторизацию на заданном почтовом сервере.
В окончательном варианте пришлось еще и конфигурировать postfix.

Какие шаги в целом были сделаны: (в качестве учетной записи использовалась учетная запись на gmail).
1. В учетной записи на Gmail в Настройках проставлена "точка" напротив "POP включен". Это позволяет отправлять и получать почту с этого аккаунта не только через GMail в браузере.
2. В настройках smtp модуля были прописаны данные о smtp.gmail.com, порте доступа: 465, данные учетной записи, и отмечено, что соединение должно быть защищенным.
3. На веб-сервере должна быть поддержка соединений по протоколу https.
4. В настройках самого сайта в качестве обратного email должен быть тот же самый адрес, от имени которого идет отправка через smtp.
5. Мне пришлось еще и конфигурировать Postfix. Для этого в файле /etc/postfix/main.cf и /etc/postfix/sasl_passwd были сделаны соотвествующие настройки. Хорошая инструкция как это делать есть вот тут: http://postfix.state-of-mind.de/patrick.koetter/smtpauth/smtp_auth_mailservers.html
6. После перезагрузки postfix все заработало - теперь все сообщения, которые отправляются с учетной записи gmail через smtp сохраняются еще и в самой учетной записи. Почта уходит на все почтовые адреса.

Да здравствует GMail, Drupal и иже с ними ;)

вторник, 4 августа 2009 г.

Возникший казус

При обновлении Drupal с 6.11 до 6.12 версии произошел неприятный казус: после положенного выключения всех дополнительных модулей, обновления и подключения модулей обратно, модуль, отвечающий за доступ к определенным нодам UR-Node Access предложил заново определить права доступа к нодам и завис в этом процессе на 85%.
Система рабочая, время пятница вечер.

Быстрый поиск по интернету показал, что проще всего запустить процесс заново. Успехом данная операция не увенчалась. Далее в ход пошла тяжелая артилерия в виде вручную вычищенной таблицы и обнуления переменной Друпала о необходимости пересчитать доступы. Это помогло, но решением не было.

Еще более внимальный поиск по интернету дал подсказку - при пересоздании таблицы происходит создание ноды, затем на основании созданной ноды - выставляются права. И если модуля, который этот тип ноды создает, уже нет, а информация в таблице Nodes - есть, процесс виснет. После того, как были вычищены вручную таблицы с ссылками на такие ноды, все прошло за 5 секунд.

Вывод. Всегда помните, что вы ставили на систему и что удаляли. И всегда смотрите код того, на чем виснет. Там обязательно будет подсказка, почему именно так у вас происходит.