четверг, 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 секунд.

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

понедельник, 22 июня 2009 г.

Модули по организации совместной работы

Органайзер:
http://drupal.org/project/storm

Обсуждение "группового планировщика": http://www.drupal.ru/node/28865#new

И http://justparty.ru/about/ вот чего хотелось бы добиться ;)

Полезные ссылки по организации соц.сетей

Найдено на Хабре:
Мудрость толпы и социальные сети
http://habrahabr.ru/blogs/wisdom_of_the_crowds/62276/#habracut

Блог им. msalomatin → Законы сетей (памятка, грубо)
искать по ссылке http://habrahabr.ru/tag/социальные%20сети/page2/ и далее

и
Why some social network services work and others don't — Or: the case for object-centered sociality
http://www.zengestrom.com/blog/2005/04/why_some_social.html

понедельник, 15 июня 2009 г.

Мобильный Drupal Mobile

Чтобы перевести ваш сайт на Друпал в мобильный режим (то есть сделать его удобным для просмотра через мобильные устройства типа телефонов-коммуникаторов-IPHone-ов-BlackBerry) есть несколько основных подходов:

1. Завести отдельный поддомен, в котором выложить тему, оптимизированную под мобильное устройство. Оповестить всех мобильных пользователей, что лучше всего пользоваться версией сайта http://m.site.com вместо http://www.site.com
Минусы: не на всяком хостинге есть возможность создавать поддомены. Оповещение пользователей - тоже отдельный ресурсоемкий процесс.

2. Определять при подключении пользователя через какой браузер он подключился (через $_SERVER["HTTP_USER_AGENT"]).

Дальше варианты:
  • предлагать выбрать другую тему
  • перенаправлять на другой сайт
  • просто предлагать другую тему, без вопросов.
Минус этого подхода: число мобильных клиентов растет каждый день, нужно постоянно обновляться.


Для своего сайта я выбрала решение "определить агента пользователя, перенаправить на другую тему". Этот функционал отлично реализует новый модуль Mobile Tools и темаMobile.

Модуль Mobile Tools понравился своей гибкостью в настройке:
  • что именно делать при определении пользователя как "мобильного" клиента: перенаправлять на другой сайт, менять тему, спрашивать;
  • выбором разных тем для разных мобильных клиентов (для Opera Mini поставить одну, а для IPhone - Другую)
  • возможностью создать отдельные роли для мобильных пользователей и указать для них определенные права.