Предупреждение безопасности

Сегодня в 16-45 сайт был обновлён на новое ядро!
Судя по всему, за бэкэндом сайта никто не следит и требуется аудит кода и базы на предмет уязвимостей.
Также предлагаю начать обсуждение миграции на dru.io – сайт устарел и небезопасен.

Источник: http://www.drupal.ru/node/124683

Модуль “exFeedback” – генерация и отправка на сервер скриншота страницы сайта.

Все смеются над анекдотами про программистов, про то как им надо ставить задачи.
Все.. кроме программистов.

Вот, наваял что-то..
Надеюсь сэкономит время, нервы и добавит ясности.

Посмотреть работу: http://feedback.ti-work.ru/
Страница на github: https://github.com/orion76/exfeedback

Принимаются: критика, предложения по усовершенствованию, оскорбления, троллинг.
https://github.com/orion76/exfeedback/issues

модуль exFeedback

======
Предоставляет функционал, подобный Google Feedback: http://www.google.com/tools/feedback/intl/ru/.

Описание

:
1.Выводит на странице кнопку “Feedback” (текст кнопки настраивается), при клике на которой
открывается форма выделения подсветкой необходимых регионов страницы текущей страницы.
2.На следующем шаге генерируется скриншот страницы с выделеными областями, и выводиться
текстовое поле для коментария к скриншоту.
3.При сохранении формы на сервер отправляется:
– url текущей страницы
– сгенерированный скриншот текущей страницы
– коментарий к скриншоту
– html-код текущей страницы
– Информация о браузере пользователя, отправившего сообщение.
4.На сервере полученная информация сохраняется в сущность “Feedback” типа “entityform”.

Использованы js-библиотеки

————-
1. https://github.com/ivoviz/feedback
2. https://github.com/niklasvh/html2canvas
Файлы библиотек в составе модуля.

Установка

————-
1.Загружаем модуль в папку /sites/all/modules
2.Загружаем зависимости модуля (если еще не установлены):
– drupal.org/project/features
– drupal.org/project/link
– drupal.org/project/entityform
– drupal.org/project/image
– drupal.org/project/entity
– drupal.org/project/views
3.Модуль “exfeedback_feathure” уже находиться в папке модуля “exFeedback”.
4.Открываем страницу управления модулями вашего сайта ( /admin/modules )
5.Активируем модуль “exFeedback” и сохраняем изменения.
6.Все

Настройка модуля

————-
1.Конфигурация -> Разработка -> Обратная связь
/admin/config/development/feedback
Тут настраиваются параметры библиотеки-плагина feedback.js
В секции “Видимость” настраивается видимость кнопки на различных страницах (как блоки)

2.Содержимое -> Обратная связь
/admin/content/feedback-list
Тут модулем views выводятся сохраненные сообщения.

3.Пользователи -> Прав доступа
/admin/people/permissions
Секция “Feedback”
Установить для ролей настройки доступа:
1.Доступ к настройкам ExFeedback – например для администраторов.
2.Выводить кнопку ExFeedback для роли – например для тестеров.

TODO

———————
1.Разработать функционал, для “приема” сообщений со сторонних сайтов как на Drupal так и других систем,
путем вставки в html-код страниц сторонних сайтов “специального” кода.
2.Улучшить юзабилити и функционал формы отправки сообщений:
– Минимизация формы при пометке областей страницы.
– Автоматическая категоризация сообщений по словарю таксономии.
– Предоставление возможности пользователю просматривать “историю” сообщений прямо на форме отправки сообщения
,отправленных с текущей страницы.

==============
Автор: orion76, email: gpb@yandex.ru
Лицензия: GPL v3

Источник: http://www.drupal.ru/node/124672

Подсветка синтаксиса (фильтры для кода)

Рано или поздно все в веб-разработке сталкиваются с подсветкой синтаксиса и красивой версткой (на автомате) используемого в материале исходника, будь это sql запросы или команды bash — не суть — важна читаемость, красота; как следствие конверсия и глубина просмотра, а значит качество и вклад в развитие рунета

Я решил посмотреть, что есть готового для седьмой версии друпала, уяснить +/- найденных решений и найти оптимальный для своего скромного сайта со справочной информацией, кейсами прекрасными леди и преферансом.

BUEditor
т.к. WYSIWYG я не перевариваю (мне он не нужен), для собственных проектов использую  bueditor в целях уменьшения ручного ввода разметки. из коробки есть батон CODE, обрамляет указанное в <pre><?php phpinfo(); ?></pre> Подсветки нет (на drupal.ru используется code, точнее это  geshifilter встроенный в редактор. BUEditor позволяет создавать собственные кнопки со сравнительно малыми трудозатратами (капитан очевидность у руля) и использовать библиотеки, например Syntax Highlighter для подсветки в back-end’e. В отличие от тега pre дополнительные пробелы внутри контейнера code не учитываются, так же, как и переносы текста. Но это другая опера.

BUEditor + GeSHi Filter
 geshifilter подключает библиотеку http://qbnz.com/highlighter/

Установка
$drush dl geshifilter
Project geshifilter (7.x-1.2) downloaded to sites/all/modules/geshifilter. [success]
Project geshifilter contains 2 modules: geshifield, geshifilter.
$ drush en geshifilter
The following projects have unmet dependencies: [ok]
geshifilter requires libraries
Would you like to download them? (y/n): y
Project libraries (7.x-2.2) downloaded to sites/all/modules/libraries. [success]
The following extensions will be enabled: geshifilter, libraries
Do you really want to continue? (y/n): y
geshifilter was enabled successfully. [ok]
libraries was enabled successfully. [ok]
GeSHi filter is installed. You should now configure the GeSHi filter and enable it in the [status]
desired text formats.
$ wget http://sourceforge.net/projects/geshi/files/geshi/GeSHi%201.0.8.11/GeSHi…
$ tar -xzf GeSHi-1.0.8.11.tar.gz

В админке переходим к настройке фильтров и включаем поддержку GeSHi. Готово, и танцев с бубном не потребовалось.

3. highlightjs (на клиенте)
 highlightjs

не использовал, если есть что сказать про этот вариант — предлагаю обсудить в комментариях

4.  codefilter
простой и деревянный, то что на d.org

2be continued
давайте перетрем))

Источник: http://www.drupal.ru/node/116500

Кэширование и динамические данные в Drupal. Загружаем с помощью AJAX.

Чтобы сайт работал быстро, очевидно, что контент нужно кэшировать. Но если делать “в лоб”, например, используя модули display cache или закэшировать вывод views, то контент, который должен меняться для каждого пользователя тоже станет статичным.

Выход – часть контента кэшировать, а часть грузить с помощью AJAX.

Делюсь простым способом организовать AJAX подгрузку динамическиго контента после загрузки основного содержимого.

Ссылка на статью.

P.S. Интересно кто как решает эту задачу.

Источник: http://www.drupal.ru/node/116446

Если мучает спам на сайте.

Создавал подобную тему когда-то, сейчас думаю – почему люди не понимают очевидного?

Есть проблема – спам на сайтах. Нужно найти решение, простое, изящное и, самое главное – быстрое. А что, проблема то вроде решилась. Установил модуль, включил…
Заходят потом, ааа обошли! Индусы читают каптчу! Китайцы картинки решают за рис! Аааа!

И опять ищут решение. И опять быстрое, потом всё заново – Аааа! Вот мёд советуют – Аааа!

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

==========================================================================================
Этап 1.
Качаем модуль отсюда: Модуль Mollom

Включаем его и переходим на страницу настройки /admin/config/content/mollom/settings там видим предложение ввести Публичный ключ и Личный ключ Где их взять?
Вот тут многие нубы сливаются и отважно идут на Орг искать модуль попроще.
Поэтому, у кого сдали нервы на пол-пути – рекомендую съездить к маме, выйти покурить, хряпнуть коньячку, дать шефу в морду. Ха ха какой я остроумный. Ладно.
===========================================================================================
Этап 2.
Идём в сердце Генерального Конструктора Сайт Mollom

Сайт на английском, если у вас плохие знания оного, выручит Правая Кнопка Мыши и вызов переводчика Гуглтранслейта на странице сайта.
Здесь необходимо зарегистрироваться.
Скажу по секрету – у сайта есть некоторая подозрительность, знаете фильмы про шпионов, так вот – он вас может в следующий раз не пустить, пох на запоминалку паролей в браузере, защита мама не горюй!
Поэтому – рекомендую создать памятку, адрес сайта, логин в нём, мыло и пароль. Это важно. Бумажку спрячьте.Не шучу.
Переходим на Site manager Там начинаем работу над сайтами. В бесплатном варианте (платные нас абсолютно не интересуют) – можно курировать до ДЕСЯТИ сайтов.
Вводим первый, получаем ключи. Их желательно в txt прятать туда же, приблизительно куда и бумажку, в укромное место.
Может статься вам будет просто некогда пробивать защиту головного сайта с восстановлением пароля а ключи – здорово вас выручат своим наличием. Ну это на аварийный случай.
========================================================================================

Всё, тащим публичный и личный ключи в открытую соседнюю вкладку. Вводим в поля – между сайтами пробегает зелёная искра. Фсё мы победили.
============================================================================================

Но это ещё не всё, ещё немного тугомотины, впрочем её можно отложить хоть на месяц, только спам о новом Монстре на сайте не знает и фигачит по прежнему. Почему?
Тут кроется ещё одна причина, из-за чего мы такие тупые, что не можем хоть что-то доделать до конца. Шутка.
==================================================================================================================
Этап 3. Финальный.

На этой странице – /admin/config/content/mollom Первая вкладка ФОРМЫ, выпадающий список. Заходим и добавляем. В первую очередь Пользователь: Форма регистрации пользователя Далее комментарии и прочее, что считаете важным. Можно поставить защитой своеобразную CAPTCHAmollom или Анализ текста Анализ приятная плюшка для адекватного пользователя, если же он задумает пропиарить интенет-магазин супруги, то нарвётся на отказ. Бот в любом случае нарвётся.

Пробивается ли защита? Да – один раз в месяц можно вычистить пару хитроделанных спамеров, которые извращаются из спортивного, видимо интереса, вплоть до имени пользователя Крыши в Новосибирке Да, и такое бывает.
========================================================================================================

Тут писал кто-то ещё, что на очень крупном проекте нужно платить за укрупнение количества пробоев, так до ОЧЕНЬ крупного ещё дожить надо. А там и ежу понятно за что стоит платить, за что не стоит.
Кстати ссыли мои,не партнёрские, пост создан на основании чистой любви к этому сервису.

Статистика за 359 дней, данные одного личного сайта, клиентские не хочу палить ни в каком виде.

Установка платная, советую взять на вооружение – для элитных клиентов. То есть, умный клиент сам создаст акк и даст ключи, вам нужно просто сделать дело и идти в магазин за колбасой.
Это вариант Каптчи, без анализатора текста. С анализатором впечатление что сайт незащищён, но это впечатление обманчиво.


Спасибо за внимание.

Источник: http://www.drupal.ru/node/116223

Ckeditor и загрузка картинок

Скорее себе на память, но может еще кому сгодится.
Если CKEditor не хочет загружать изображения, то можно использовать связку Insert+CKEditor Insert+CKEditor
Добавить новое поле к типу материала, настроить поле. В настройкахъ отображения поля выставить hidden. Настроить CKEditor Insert. В настройках профиля CKeditor убрать стандартную кнопку “вставить изображение”, включить плагин Insert, добавить кнопку вставки изображения от CKeditor Insert (появляется при включении CKeditor Insert).

Не самое элегантное решение, но как альтернатива монстру IMCE подойдет.

Пример работы – на скрине.

А сам модуль Insert и без визуального редактора работает. Тоже полезно

Источник: http://www.drupal.ru/node/116207

Drupal Code Sprint #6 в Новосибирске

Дорогие друзья и коллеги!

Уже середина марта, а у нас еще ни разу не было весеннего Code Sprint. Исправляемся и приглашаем вас15 марта полезно провести день в веселой компании. Всех участников ждет угощение – пицца и чашечка чая или кофе!

План на Drupal Code Sprint #6 следующий:

Закрыть запрос на функционал в ядре Drupal Path alias filter by system path (core feature request). Исправить баг в модуле Module Filter does not care about anchors in permission links (contrib module bug). Доработать существующие модули: ​Custom entity reference field (development for contrib module); 2gis maps (development for contrib module); Microservices (development for contrib module).

Будем рады видеть вас в наших рядах!

Источник: http://www.drupal.ru/node/116114

[Решение] Простой способ вынести термин таксономии в title материала

1. Устанавливаем Automatic Entity Label
2. Переходим в нужный тип материала, создаем текстовое поле Заголовок (или как вам удобнее).
3. Там же, в управлении полями, переходим во вкладку AUTO LABEL и выбираем Automatically generate the label and hide the label field.
4. В шаблоне для заголовка прописываем [node:field_kategoriya] [node:field_zagolovok], где field_kategoriya – это поле с выбором термина таксономии, field_zagolovok – это созданное Вами поле Заголовок.
В итоге пользователь при создании материала вводит текст в созданное Вами поле Заголовок, выбирает термин таксономии и после получается обычный title, но уже вместе с термином таксономии.

Источник: http://www.drupal.ru/node/115781

DrupalCafe #11 в Москве, 19/02/2015 – 20:00

Друзья, приглашаем на встречу друпалеров в этот четверг, 19.02, в антикафе Бабочки (м. Марксистская/Таганская).

Несколько наших участников подготовили интересные темы для обсуждения:

1. Features
В теории фичи смотрятся очень красиво, но на практике всё сложнее.
2. Drupal+MySQL ==> Drupal + PostgreSQL
Об опыте переноса друпала с одной СУБД на другую.
3. Обзор Backdrop
Наконец, взглянем на форк друпала, который вышел намного раньше восьмёрки.
4. «Мои контрибы»
Кто хотел научиться коммитить на drupal.org? На этом кафе будет отличный шанс втереться в доверие к очень плодовитому друпал-контрибьютеру Андрею Березовскому

Кроме того, с чем-то интересненьким ожидаем гостей из питерского Drupal-сообщества.

Если вы интересуетесь друпалом, смело приходите. Встречи со специалистами-единомышленниками — отличный способ научиться новому и заявить о себе.

Анонс с актуальной информацией: http://drupalcafe.ru/events/drupalcafe-11
Контакт для связи: kalabro@ya.ru, anderspaul@gmail.com

До встречи!

Вложение Размер k1t6fiwwxfs.jpg 22.63 КБ

Источник: http://www.drupal.ru/node/115702

Удаление looping redirects

Есть очень неприятная проблема, когда на сайте появляется запись: “Oops, looks like this request tried to create an infinite loop. We do not allow such things here. We are a professional website!”. Вроде ничего страшного, но страшно раздражает пользователей.

Как избавиться от старых редиректов?

Пишем небольшой drush скрипт:

<?php
// Set up the query using the database API
$query = db_select('redirect', 'r');
$query->join('url_alias', 'ua', 'r.redirect = ua.source AND r.source = ua.alias');
$query->fields('r', array('rid', 'redirect', 'source'));
 
// Execute it and fetch the results, one by one
$result = $query->execute();
$any_results = FALSE;
while($r = $result->fetchAssoc()) {
  // For each result, flag we've got at least one result, notify the CLI user
  // of what we're doing, and delete it using Redirect's own API
  $any_results = TRUE;
  drush_log(dt("Deleting unwanted redirect !r (!s -> !t)",
    array("!r" => $r['rid'], "!s" => $r['source'], "!t" => $r['redirect'])), "success");
  redirect_delete($r['rid']);
}
 
// No results? Report if that's the case
if (!$any_results) {
  drush_log(dt("Nothing to delete!"), "ok");
}?>

Сохраняем переходим в директорию нашего сайта и запускаем:

drush php-script [ПУТЬ_К_СКРИПТУ]

Вуа-ля, все лишние редиректы удалены!

Источник: http://www.drupal.ru/node/115559

Модуль погоды. Текущая, 3/7/10 дней и маленький инлайн блок.

Делюсь модулем погоды.

Показывает текущую погоду, на 3/7/10 дней и имеет в комплекте маленький инлайн блок для встраивания в панели.

Технически:

Забирает погоду с Яндекс. Кэширует на 1 час. Выводит через шаблон.

Исходник: github.com/vital-fadeev/weather

Живая демка: tyumenn.ru/weather

Источник: http://www.drupal.ru/node/115498

Grabber. Граббер сайтов & загрузка в Drupal

В общем. Есть граббер сайтов.
Делюсь.

Практически грабил сайты с расписаниями кино. Грабил сайт с отзывами.

В первом случае,

собирал информацию о расписании сеансов затем брал описание фильма с kinopoisk.ru затем загружал в соответствующие поля и загрузка в поля, было и field collection

Во втором случае

столкнулся с блокировкой IP при 15 запросах к сайту доработан до работы через прокси перебор прокси случайно автоматическая подгрузка списка прокси с сайтов ‘free proxy list’ автоматическая блокировка нерабочих прокси подстановка useragent, разных, случайно запуск в несколько потоков

Задачи были выполнены. Граббер как есть отдаю.

Исходник https://github.com/vital-fadeev/grabber

Детально – на гитхабе.

Источник: http://www.drupal.ru/node/115359

Критическая уязвимость (CVE-2015-0235) у серверов под Linux

Новая уязвимость GHOST ((CVE-2015-0235) в библиотеке glibc (GNU C Library))
Уязвимость в распространенных дистрибутивах Linux может позволить злоумышленнику получить удаленный контроль над системой. Под ударом оказались пользователи Debian 7 (wheezy), Red Hat Enterprise Linux 6 & 7, CentOS 6 & 7, Ubuntu 12.04.
http://habrahabr.ru/company/pt/blog/249097/

проверяем, есть ли она.

от рута:

wget https://gist.githubusercontent.com/koelling/ef9b2b9d0be6d6dbab63/raw/de1730049198c64eaf8f8ab015a3c8b23b63fd34/gistfile1.c gcc gistfile1.c -o CVE-2015-0235 ./CVE-2015-0235

если vulnarable, то

Debian, Ubuntu:

sudo apt-get clean sudo apt-get update sudo apt-get upgrade sudo reboot

остальные:

http://www.cyberciti.biz/faq/cve-2015-0235-patch-ghost-on-debian-ubuntu-…

Источник: http://www.drupal.ru/node/115351

Интенсив по основам разработки на Drupal 7


Добрый день, любители Drupal!

У меня хорошая новость для тех, кто интересуется разработкой на Drupal 7 и желает научиться писать модули и темы.

28 января 2015 я запускаю интенсивный онлайн курс по основам разработки на всеми нами любимом фреймворке. Курс продлится 3 недели. Он включает групповые вебинары, индивидуальные занятия и домашние задания, ну куда же без них.

Тем, кто хочет научиться писать полезные модули, разрабатывать красивые темы и просто хорошо разбираться в API Drupal, этот курс придется очень кстати.

Времени до начала осталось совсем не много, поспешите записаться на курс и зарезервировать себе место в группе!

До встречи на курсе!

Константин Комелин
Ведущий тренер

Вложение Размер morningcurve_drupal_banner.png 129.43 КБ

Источник: http://www.drupal.ru/node/115277

Vkontakte comments widget (D6)

Привет всему друпал сообществу, с удовольствием выкладываю модуль вывода комментариев VKontakte на странице ноды для Drupal 6.
Самому понадобился недавно, но ничего достойного не нашел решил написать.
Ссыллка на sandbox проект:
https://www.drupal.org/sandbox/nextonizh/2410515
GIT clone:
git clone git.drupal.org:sandbox/nextonizh/2410515.git

Вложение Размер vk_comments.zip 9.42 КБ

Источник: http://www.drupal.ru/node/115176

Dru.io — сообщество для Друпалеров


Всем привет! Хочу представить вам своё новое начинание, а именно — DrupalifeCommunity. Как ясно из заголовка, это попытка хоть как-то возобновить и сконцентрировать хоть где-то русскоговорящее сообщество Друпалеров.

Сразу скажу о судьбе проекта. Им я не претендую заменить Drupal.ru, это совершенно отдельное и самостоятельное начинание. Скажем так, альтернативное сообщество, как каким-то пытался стать DrupalSN, но, к сожалению, он не взлетел. Было много причин его гибели, и большая часть заключалась в его закрытости от обычных людей, т.е. это было сообщество для “шарящих”, а другие идут лесом. В этом был фатальный недостаток, ибо у нас нет критической массы профи Друпалеров чтобы такой проект жил, а делать его доступным принципиально не хотели.

Уже много раз тут поднимались подобные темы, обсуждалось сотни раз, начинали делать, но всё это кануло в небытие так и не дойдя до народа. Поэтому, уже давно обдумав решил перед НГ делать, а не обсуждать, а результат смотрите сами.

Так что Welcome, новая “кровь” нам не помешает.

P.s. Если будет спрос, проект продолжу развивать, а если и вовсе заживет своей жизнью, то отделю его в независимый ресурс, а название выберем сами.

Более подробно можно почитать в моём блоге: http://niklan.net/blog/68
Сайт сообщества: http://dru.io/
Мы на GitHub: Репозитарий, обсуждения – присоединяйтесь! Код открыт!

Источник: http://www.drupal.ru/node/115018

Торговая сборка

Краткое описание:
- Адаптивная, резиновая тема;
- Ценовые опции товаров;
- Готовый каталог с зависимыми фильтрами по характеристикам;
- Заказы без регистрации;
- Настроенная стартовая установка (в сборку включены и настроены необходимые дополнительные модули).

Информация, демонстрация и ссылки на загрузку

15-02-19
Как изменить страницу каталога и блок фильтров фильтрами ?
- Для страницы каталога можно скопировать функции template_preprocess_trade_pages_catalog_page из trade.pages.inc в файл template.php переименовав её в mytheme_preprocess_trade_pages_catalog_page
- Для блока использовать функцию template_preprocess_catalog_filters_block из trade.pages.inc таким же способом

15-03-01
- В сборку добавлен и настроен http://drupal.org/project/fivestar для товаров;
- Функционал каталога с фильтрами вынесен в отдельный модуль modules/trade_catalog и может работать c commerce отдельно, без сборки;
- Каталог интегрирован с i18n https://www.drupal.org/project/i18n, лево и право ориентированными языками;
- Для фильтров каталога добавлена поддержка целых и десятичных типов поле товаров;
- На страницы каталога добавлена возможность показа «детских» терминов текущей категории.

15-03-11
- Добавлен module_invoke (hook) на событие «create», «update», «delete» для «заказа», описание – (trade.api.php). Можно использовать это событие из других модулей.
- Для событий «create», «update», «delete» по «заказу» созданы rules(https://www.drupal.org/project/rules) события.
- Созданы token для «Заказа» в ассортименте.

15-03-26
- Добавлен функционал выбора опций товара по умолчанию.

15-04-09
- Добавлена возможность создавать свои виды доставки товара (admin/config/trade/product).

15-04-15
- Добавлена настройка полей для сортировки в каталоге. Можно выбрать поля из товарных типов материала для сортировки в каталоге, указать сортировку по умолчания, их последовательность, названия и начальное направление сортировки (admin/config/trade/trade_catalog_filters).

Источник: http://www.drupal.ru/node/114792

Drupal×Kaliningrad Meetup 2015 | Рождественская встреча 05.01.15 в Калининграде!

Друзья-калининградцы!

Как вам идея собраться на праздничную Drupal-встречу на новогодних каникулах? Со времен прошлой встречи прошла чуть более чем вечность, пора исправлять ситуацию!
Предварительная дата: 5 января (понедельник) 17:00

Организацией сейчас занимаюсь я, Катя Маршалкина. Пишите в почту kalabro@ya.ru или в комменты.

FAQ:

— Хочу прийти! Что делать?
Отпишитесь в этой теме или оставьте свою почту организаторам, чтобы мы смогли сообщить вам точные время/место.

— Не подходит дата.
Есть возможность переноса на 04/01 или 06/01. Обсуждается.

— Хочу выступить с докладом.
Welcome! Ориентируйтесь на краткий формат (10-20 мин), чтобы никого не загрузить на НГ.

— А чего это чувиха из Москвы занимается митапом в Кёниге?
Не надо искать во всём логику. С Наступающим!

Вложение Размер drupalkaliningrad-050115.jpg 42.98 КБ

Источник: http://www.drupal.ru/node/114749

[РЕШЕНО] Защита от ботов fail2ban+csf сервера nginx c друпалом на борту

Ты можешь хорошо оптимизировать сервер, настроить сайт на друпале, но спам-боты могут свести на нет все твои старания, вынуждая тебя переходит на более дорогой тариф, п.ч. они все время хотят больше кушать.

Настроим наш nginx сервер для победы над спам ботами —>>

Установка CFS (ConfigServer Firewall)

1. Качаем архив:

wget http://www.configserver.com/free/csf.tgz

2. Распаковываем:

tar -xzf csf.tgz

3. Устанавливаем:

Если есть другие фаервольные скрипты, например UFW, то нужно их остановить. Правила в iptables удалятся автоматически.

ufw disable   cd csf   sh install.sh

Фаервол теперь установлен и теперь проверим все ли требуемы модули iptable доступны.

perl /usr/local/csf/bin/csftest.pl

Fail2ban будет работать, если при проверки везде OK.

Установка fail2ban

1. Устанавливаем модуль на друпал сайт:

https://www.drupal.org/project/fail2ban

Включаем syslog модуль.

2. Редактируем /etc/fail2ban/jail.conf, добавляем в конец файла:

[drupal-fail2ban] enabled = true port = http,https protocol = tcp filter = drupal-fail2ban action = csf-ip-deny[name=drupal] logpath = /var/log/messages maxretry = 5 findtime = 86400 bantime = 21600

3. Создаем фильтр /etc/fail2ban/filter.d/drupal-fail2ban.conf со следующим содержимым:

[Definition] failregex = \|user\|<HOST>\|.*\|Login attempt failed (.+)\.$ ignoreregex =

4. Создаем фильтр /etc/fail2ban/action.d/csf-ip-deny.conf со следующим содержимым:

# CSF / fail2ban integration from The Digital FAQ (digitalFAQ.com)   [Definition] actionstart = actionstop = actioncheck = actionban = csf -d <ip> Added by Fail2Ban for <name> actionunban = csf -dr <ip>   [Init] name = default   # Read more: http://www.digitalfaq.com/forum/web-tech/5692-fail2ban-csf-blocking.html#ixzz3Jfzkmx00

5. Запуск

Останавливаем сервер:

/etc/init.d/nginx stop

рестартим fail2ban:

service fail2ban restart

Запускаем сервер:

/etc/init.d/nginx start

Смотрим работу командой:

tail -f /var/log/fail2ban.log

должно быть примерно так:

2014-11-24 16:02:22,881 fail2ban.actions: WARNING [drupal-fail2ban] 110.85.100.178 already banned   2014-11-24 16:02:25,884 fail2ban.actions: WARNING [drupal-fail2ban] 110.85.100.178 already banned   2014-11-24 16:11:01,528 fail2ban.actions: WARNING [drupal-fail2ban] 91.200.12.41 already banned   2014-11-24 16:12:10,612 fail2ban.actions: WARNING [ssh] Ban 178.254.22.90   2014-11-24 16:22:11,384 fail2ban.actions: WARNING [ssh] Unban 178.254.22.90

наконец то стало легче дышать, скорость сайта возросла в 10-15 раз, боты прибиты, переходить на более дорогой тариф не надо!

—————————————————————————————————————————————–

Дополнение (для более тонкой настройки):

Обнаружение вражеской подсети:

1. Формат лог файла у fail2ban /var/log/fail2ban.log примерно такой:

...   2006-02-13 15:52:30,388 fail2ban.actions: WARNING [sendmail] Ban XXX.66.82.116   2006-02-13 15:59:29,295 fail2ban.actions: WARNING [sendmail] Ban XXX.27.118.100   2006-02-13 16:07:31,183 fail2ban.actions: WARNING [sendmail] Unban XXX.66.82.116   2006-02-13 16:14:29,530 fail2ban.actions: WARNING [sendmail] Unban XXX.27.118.100   2006-02-13 16:56:27,086 fail2ban.actions: WARNING [ssh] Ban XXX.136.60.164   2006-02-13 17:11:27,833 fail2ban.actions: WARNING [ssh] Unban XXX.136.60.164

2. Генерация простых отчетов:

Группировка ip-адресов:

awk '($(NF-1) = /Ban/){print $NF}' /var/log/fail2ban.log | sort | uniq -c | sort -n

Примерный вывод:

...   4 XXX.124.81.130   5 XXX.248.175.246   8 XXX.29.45.142

Определяем самую зловредную субсеть:

zgrep -h "Ban " /var/log/fail2ban.log* | awk '{print $NF}' | awk -F\. '{print $1"."$2"."}' | sort | uniq -c | sort -n | tail

Примерный вывод:

...   75 83.110.   90 219.95.   154 210.213.

Анализируем зловредную сеть, сколько раз эта зараза появлялась в лог файлах:

zgrep -c 210.213. /var/log/fail2ban.log*

Примерный вывод:

fail2ban.log:39   fail2ban.log.1.gz:129   fail2ban.log.2.gz:55   fail2ban.log.3.gz:78   fail2ban.log.4.gz:22

Зловредную сеть определили, а там уже можно и внести её в фаервол, определить страну (я например, весь Китай забанил) и т.д.

3. Бан подсети:

Доступа SSH:

iptables -I INPUT -p tcp -s XXX.XXX.XXX.XXX/XX --dport ssh -j REJECT --reject-with tcp-reset

Доступа SMTP:

iptables -I INPUT -p tcp -s XXX.XXX.XXX.XXX/XX --dport smtp -j REJECT --reject-with tcp-reset

Доступа HTTP:

iptables -I INPUT -p tcp -s XXX.XXX.XXX.XXX --dport http -j REJECT

Доступа FTP:

iptables -I INPUT -p tcp -s XXX.XXX.XXX.XXX --dport ftp -j DROP

и по аналогии так можно защитить другие службы.

Блокировка страны

Сервер должен включать модуль –with-http_geoip_module

проверяем:

nginx -V

должно быть, примерно, так:

root@server1:~# nginx -V nginx version: nginx/1.2.1 TLS SNI support enabled configure arguments: --prefix=/etc/nginx --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-client-body-temp-path=/var/lib/nginx/body --http-fastcgi-temp-path=/var/lib/nginx/fastcgi --http-log-path=/var/log/nginx/access.log --http-proxy-temp-path=/var/lib/nginx/proxy --http-scgi-temp-path=/var/lib/nginx/scgi --http-uwsgi-temp-path=/var/lib/nginx/uwsgi --lock-path=/var/lock/nginx.lock --pid-path=/var/run/nginx.pid --with-pcre-jit --with-debug --with-http_addition_module --with-http_dav_module --with-http_geoip_module --with-http_gzip_static_module --with-http_image_filter_module --with-http_realip_module --with-http_stub_status_module --with-http_ssl_module --with-http_sub_module --with-http_xslt_module --with-ipv6 --with-sha1=/usr/include/openssl --with-md5=/usr/include/openssl --with-mail --with-mail_ssl_module --add-module=/build/buildd-nginx_1.2.1-2.1-amd64-fMGfEu/nginx-1.2.1/debian/modules/nginx-auth-pam --add-module=/build/buildd-nginx_1.2.1-2.1-amd64-fMGfEu/nginx-1.2.1/debian/modules/nginx-echo --add-module=/build/buildd-nginx_1.2.1-2.1-amd64-fMGfEu/nginx-1.2.1/debian/modules/nginx-upstream-fair --add-module=/build/buildd-nginx_1.2.1-2.1-amd64-fMGfEu/nginx-1.2.1/debian/modules/nginx-dav-ext-module root@server1:~#

также устанавливаем базы данных:

apt-get install geoip-database libgeoip1

Обновляем базы на самые новые:

mv /usr/share/GeoIP/GeoIP.dat /usr/share/GeoIP/GeoIP.dat_bak

cd /usr/share/GeoIP/ wget http://geolite.maxmind.com/download/geoip/database/GeoLiteCountry/GeoIP.dat.gz gunzip GeoIP.dat.gz

Если атака идет от определенной страны, то можно заблокировать доступ к серверу определенной стране, например Китаю:

vi /etc/nginx/nginx.conf

и вставляем в http {} блок:

[...] geoip_country /usr/share/GeoIP/GeoIP.dat; map $geoip_country_code $allowed_country { default yes; CN no; FM no; EH no; } [...]

Коды стран

и вставляем в конфиг нашего сайта (лежат в /etc/nginx/sites-available) в контейнер server {}:

[...] if ($allowed_country = no) { return 444; } [...]

Источник: http://www.drupal.ru/node/114079

DrupalCamp MSK 2014 – 28-29 ноября, Москва, МГУ


Уже совсем скоро, 28 и 29 ноября в Москве пройдет конференция “DrupalCamp MSK 2014″.

В этом году конференция пройдет в главном университете страны – МГУ, при поддержке факультета вычислительной математики и кибернетики (ВМК).

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

В программе 40 докладов, от российских и зарубежных спикеров, в том числе представителей Microsoft и Яндекс, а так же тренинг для новичков и традиционная Drupal-вечеринка.

Основными темами DrupalCamp MSK 2014 станут: Drupal 8, разработка, инструменты разработчиков (DevOps), дизайн и frontend, кейсы и решения для бизнеса.

Все подробности на сайте 2014.drupalcampmsk.ru.

Для Студентов, докладчиков и волонтеров участие в конференции бесплатное.

Есть чем поделиться с сообществом?

Приглашаем выступить с докладом на конференции. Заявки принимаются до 16 ноября.

До встречи на DrupalCamp MSK 2014!

Источник: http://www.drupal.ru/node/113308

Первое DrupalCafe в Томске. 31 мая 2014

В субботу, 31 мая в 15:00 (по местному времени) в Институте Кибернетики Политехнического Университета (ул. Советская 84/3, аудитория 214) состоится первое DrupalCafe в Томске.

Организаторы кафе – сообщество DrupalSib совместно с Центром инноваций Microsoft в ТПУ.

Лозунг Drupal гласит «Come for the software, stay for the community».

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

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

Новосибирские разработчики выступят с ознакомительными докладами о своих масштабных проектах, а также поделятся опытом участия в жизни мирового Drupal-сообщества.

Мы приглашаем всех желающих выступить с небольшими докладами на волнующие их темы.

Ждём всех в субботу, 31 мая, в 15:00 в Институте Кибернетики ТПУ!

Предварительная регистрация на сайте mic.tpu.ru или на Timepad.

Контакты:

В Томске
Виталий Коровкин,
vitaliy.korovkin@gmail.com
тел.раб.8 (3822) 60-60-03
моб. 8 (913) 824-63-39
http://it-university.tpu.ru/Page/Contacts/4

В Новосибирске
Ксения Рогаченко,
rogachenko.k@togoal.ru
тел. 8 (961) 222-20-17

Вложение Размер plakat_dlya_tomska.jpg 331.86 КБ

Источник: http://www.drupal.ru/node/110326

7 июня в Санкт-Петербурге Drupal White Nights 2014

Город, который пронизан своей особой культурой. Город, в котором каждый камень способен рассказать свою уникальную историю. Город, чья летняя ночь светла как день. Все это – наш любимый Санкт-Петербург. И этим летом наш гостеприимный город встречает друпалеров из разных городов и стран.

7 июня большой праздник для нас, в Питере пройдет долгожданный Кемп – Drupal White Nights 2014. Мы шли к этому событию два года, встречаясь на семинарах, спринтах, тренингах и в неформальной обстановке. И вот, время пришло для чего-то большего.

От лица организаторов и всего нашего питерского сообщества я приглашаю вас присоединиться к этому замечательному событию.

Мы готовы принять как минимум 150 человек, нам это с легкостью позволят комфортные залы конгресс-центра ПетроКонгресс. За один день в два потока пройдут порядка 15 докладов о разработке на Drupal, администрировании, управлении проектами, бизнесе и многом другом. Несколько докладов уже заявлено, и мы продолжаем принимать заявки. Если у вас есть интересный опыт, и вы готовы им поделиться, то милости просим.

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

Регистрация на конференцию открыта и идет полным ходом, так что поспешите купить билет. Тем более, в апреле действует ранняя цена.

И на сладкое, специально для сообщества мы приготовили сюрприз и учредили конкурс Счастливый билет на Drupal White Nights 2014. Победитель получит бесплатный билет на конференцию и всеобщую известность

Будем рады видеть и слышать вас!


Соорганизатор конференции Drupal White Nights 2014
Константин Комелин

Источник: http://www.drupal.ru/node/109448

Drupalife Store – сборка интернет-магазина на Drupal Commerce


Всем привет! Рад анонсировать собственную сборку (дистрибутив) интернет-магазина на Drupal Commerce.

Целью данно сборки является простота и скорость установки магазина, сохранив при этом гибкость и не нагружать бесполезными модулями.

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

Более подробно можно почитать в моём блоге: http://niklan.net/blog/57
Демо и загрузка: http://drupalife.com/lab/store
Песочница: http://simplytest.me/project/drupalife_store
Проект на Drupal.org: https://drupal.org/project/drupalife_store

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

Источник: http://www.drupal.ru/node/107941

Drupal@Tomsk первое Drupal Cafe в Томске

Друзья, предлагается активизировать томское друпал-сообщество!
Познакомиться, встретиться, провести доклады.

Инициатива зародилась в чате новосибирского друпал-сообщества.
Мы тут все мечтаем о проведении кемпа в Сибири, и все искали как же показать Сибирь чтоб людям было интересно.
И так появилась мысль что Томск самый сибирский город. Так сказать с душой.
и почему бы не провести кемп в Томске.
К томуже у вас уже есть массовые площадки инновус http://tomskforum.ru/

Готовы выехать к вам и помочь с организацией первого кафе.
Думаю Омичи тоже поддержат.

д.ру содержит информацию о ~220 участников из Томска
http://www.drupal.ru/profile/city/%D1%82%D0%BE%D0%BC%D1%81%D0%BA

Мы тут создали небольшой организационный чатик.
Дата пока не назначена, ориентировочно думаю конец марта, начала апреля.
Присоединяйтесь кому эта тема интересна.
Drupal@Tomsk

skype:?chat&blob=jkD7DpBJtXSAuV-CadKcSJ9QTHHMFzpyEIzyp8uJur4Qtm0XRBolxdHb_OEL3UzNuGZ5cCRGciCCjBix0JECp3qIgg1s

Источник: http://www.drupal.ru/node/107836

[ACHTUNG!] ЗАО “ГосБук”

Проработал там ~полгода, уволился в конце прошлого (2013) года.
Хочу поделиться некоторой инфой:

факт #1: 3/4 (75%) з.п. за ноябрь было выплачено 24 декабря

факт #2: з.п. там белая, но в контракте указана не вся сумма, остальное добивается премиями. При увольнении мне не выплатили, по моим самым скромным подсчётам ~20К рублей, судя по 2НДФЛ ~30К рублей

факт #3: я получил документы (трудовую, 2НДФЛ, и т.д.) только 20 января, из-за чего не мог в течении нескольких рабочих дней оформиться и выйти на новую работу

проектов там много, программистов не хватает, и их постоянно ищут
также, незадолго перед моим уходом, стали привлекать сторонних людей/студии на субподряд

в общем, поимейте всё выше изложенное ввиду, если собрались поработать на ЗАО “ГосБук”

Всем удачи и хорошего настроения!

Источник: http://www.drupal.ru/node/106981

DrupalCafe в Барнауле — 5 октября

Предлагаю провести DrupalCafe в Барнауле — 5 октября, есть чего интересного раскатать и поделиться международным опытом.
Прошу интересующихся отмечаться в комментариях, что придёте и предлагать место встречи.

В общем зову всех желающие пообщаться на тему Drupal встретится на площади Сахарова часов 6 вечера и там уже найти где посидеть и пообщаться. Хочу поближе познакомится с земляками Drupal-ерами и рассказать про себя, про Drupal 8. А так же про друзей Drupal-еров в Новосибирске, Москве, Берлине и Вильнюсе.

Источник: http://www.drupal.ru/node/104145

Встречайте Backdrop CMS – форк друпала.

Форк, который стремится взять лучшее от старого друпала – простоту, гибкость и дешевизну разработки.
На мой взгляд, это еще один симптом грядущих проблем Drupal 8, о которых я уже писал.
Вообще, удивительно, насколько описание этого проекта созвучно моим субъективным ощущениям от проблем друпала. Пример – про проблему обратной совместимости проект заявляет:

Цитата:

Keep APIs Stable (”Major” versions)
We will make the upgrade process easier on end-users by maintaining slower-moving core APIs.

Посмотрим, что из этого выйдет..

http://backdropcms.org/
http://pingv.com/blog/backdrop-forking-drupal

Источник: http://www.drupal.ru/node/103604

Drupal Global Training Day в Санкт-Петербурге [14 июня 2013]


Приглашаем всех желающих принять участие в практическом тренинге под эгидой инициативы Drupal Ассоциации Global Training Days. В этот день по всему миру пройдут тренинги по основам Drupal, и один из них мы проведем в Санкт-Петербурге.

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

Тренинг проведут участники Drupal сообщества в Санкт-Петербурге.

Познакомиться с тренерами, программой тренинга и зарегистрироваться можно на странице мероприятия.

Это уже не первый наш тренинг, посмотреть видео с прошлого можно здесь.

Ждем вас!

Источник: http://www.drupal.ru/node/100508

DrupalCafe #4 в Санкт-Петербурге

Привет всем!

Как вы относитесь к еще одной встрече в Санкт-Петербурге?

Мы решили посвятить ее проектам мечты на Drupal. Каждый сможет поделиться своей мечтой!

Регистрация и детали здесь: http://drupalspb.org/event/drupalcafe-4

Источник: http://www.drupal.ru/node/100189

CodeSprint UA 2013. Зачем и как.

Перед ДрупалКемп Київ 2013 будет проходить очередной CodeSprint UA 2013
Лично меня забрасывают вопросами в сообществе и скайп чатах что это, как это, с чем это.
И самый болезненный вопрос – мотивация участия.
В большинстве случаев – у каждого присутствует как минимум десяток причин не участвовать, и только одна – любопытство – участвовать.
Попробую удовлетворить любопытство этим постом.
Код Спринт – это групповое оффлайн или онлайн событие, в котором группа людей собирается для массового решения определенной задачи. Приоритет именно оффлайн, в живую, так как эффект присутствия достигается только в этом случае. Эффективность соответствует парному программированию. Это не достигается в "сижу дома в чате", так как нет человека, который будет вместе с вами наблюдать за процессом, взаимоисключая ошибки.

В контексте Друпала – группа людей подбирается добровольно.
Для кодспринта нужны:

организатор тимлид возможно менеджеры проектов, программисты контролеры качества специалисты темизации тренеры специалисты по инфраструктуре drupal.org администраторы серверов новички

Зачем? Ответ на этот вопрос можно почитать у Влада Моисеенко, как результат прошлого спринта
С технической и организационной стороной всегда просто.
А вот мотивация(…
Если нет возможности поучаствовать в долгосрочной обучающей программе по друпал, то кодспринт – идеальное место поучиться на практике. Ну кроме того, что друпал сам по себе стоит благодарности за пользу, которую приносит нам, как профессионалам.

Зачем кодспринт новичку?

Всегда можно будет позадавать кучу вопросов по теме спринта.
Можно будет спросить разрешения и посидеть за плечами у более опытного коллеги и даже поработать в паре, что даст определенный опыт для анализа работы другого програмиста и в будущем patch review.
Можно понаблюдать за работой любого из ролей кодспринта, поучится у них, поддержать помощью, приобретая навыки.
Можно рассказать тимлиду о своих навыках и таки получить работу на спринте.

Зачем кодспринт администратору сервера?

Не всегда админы знают, как правильно настроить сервер разработки, сервер для хостинга, сервер для git, сервер для документации doxygen, и вообще любой сервер в контексте друпал разработки.
На спринте есть возможность получить реальные отклики и рекомендации от тимлида и учасников спринта как это сделать и более того – реально настроить и понаблюдать в течении определенного времени как это происходит, тем самым получив бесценный опыт.
Также можно реально пощупать неплохой инструмент админа для разработки.

Зачем кодспринт специалисту по контролю качества?

Во первых – опыт парного программирования. Можно посидеть за печами у любого из участников спринта и управлять процессом, подсказывать ошибки. Не все компании практикуют парное кодирование, а на спринте – это реально.
Также очень легко получить опыт для своей профессии в другом разрезе – наблюдая за тем, как создаются продукты, которые потом приходится тестировать. Это бесценно!

Зачем кодспринт специалистам по инфраструктуре drupal.org?

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

Зачем кодспринт тренерам?

Реальная возможность получить людей на обучающую программу. Сомнительно специальный поход в целях рекламы, но если народ увидит ваш уровень как специалиста, узнают кто вы, то определенно заинтересуются вашей деятельностью вне рамок спринта.
Ну и конечно же – спринт – это способ держать пульс на руках сообщества, ориентироваться в его течениях и потребностях.

Зачем кодспринт специалистам темизации?

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

Зачем кодспринт программистам?

Опыт.
Участвуя в спринтах и обучающих программах реально повысить свой уровень
Работодатели друпала следят за подобного рода мероприятиями и рекомендации от участников спринта – очень помогут вам получить повыше должность и вырасти как специалисту.
Спринты дадут вам опыт работы на друпал.орге.
Вы получите контакты в сообществе людей, готовых отвечать на вопросы и помогать.
Вы получите развитие своего профиля на друпал.орге, что немаловажно и для HR.

Зачем кодспринт менеджеру проектов?

К сожалению менеджер проектов не всегда может успевать за развитием такого активного инструмента, как друпал. Даже ведущие члены сообщества не всегда за этим поспевают. И держать руку на пульсе, чтобы снизить риски проекта – чрезвычайно необходимо.
На спринте реально повысить точность назначения задач, поучаствовав менеджером проекта. Для этого достаточно изучить инфраструктуру друпал и воспользоваться инструментарием друпал.орга. Опыт в таких системах как Agile, SCRUM гарантирован. Особенно в привязке к CMF Drupal.
Любой тимлид и все сообщество будет целовать вам руки за качественно оформленные issue на друпал.орге и своевременное ихнее сопровождение по статусам и приоритетам.

Зачем кодспринт тимлиду?

На спринт приходят активные люди. Чаcто эти участники активнее чем люди, работающие с Вами в команде. И это очень хорошее место для получения дополнительных мотиваций для своих коллег. Научиться сотрудничать с людьми по новому, с большими удовольствием и эффективностью.
Также для спринтов стоит выбирать темы – вызовы для себя, как для участника. Тогда есть возможность подтянуть свои знания в выбранной теме. Знать все – невозможно. Даже через много лет обучения приходит осознание, что есть множество сфер, в которых "плаваешь", и спринт – очень хорошее место для приобретения дополнительной уверенности. Это тоже опыт.

Зачем спринт организатору?

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

получение контактов в сообществе = HR реклама своих мероприятий спонсорство опыт и не только

И в заключение – для участия в спринте очень важно понять собственный мотив. Нельзя участвовать ради кого-то. Это чревато разочарованием.
Стоит хорошо обсудить с тимлидом и организаторами для чего спринт и что именно вы получите в результате. А также очень важно сообщить о своих ожиданиях от спринта, чтобы у других создалось впечатление, что все идут заниматься на спринт тем, что им нужно и это совмесное усилие способно решить глобальные задачи и цели спринта.

Присоединяйтесь – регистрация на спринт

Источник: http://www.drupal.ru/node/100008

Встреча Drupal-Севастополь 16.05.2013

Предлагаю встретиться в четверг (16.05.2013) в каком-нибудь спокойном месте Севастополя и пообщаться на любые связанные с Drupal темы и не только.

Судя по форуму, в городе довольно много друпалистов, так что оретировочно часов на 19.

Место встречи – «Трактир» на Б.Морской 8

ЗЫЖ пост будет редактироваться по мере поступления предложений.

собралось 3 человека, рассказано о 8ке

Источник: http://www.drupal.ru/node/99939

Модуль Style Manager (управление дизайном сайта)

Давно хотелось иметь в друпале некий инструмент который позволит переносить и переиспользовать css заготовки на других сайтах. Что и побудило написать этот модуль

Модуль Style Manager позволяет создавать заготовки для дизайна, например: стиль меню, футера, формы поиска, блоков и т.д. и переносить их с сайта на сайт (аналог модуля features, но для стилей).
Также с помощью модуля можно быстро вносить правки в дизайн сайта прямо в браузере.

Demo

1 – http://www.youtube.com/watch?v=Gg1a_v8tmS8&list=PLQWBmbu7pmqnRenMh2hp6s8… основные функции модуля

2 – http://www.youtube.com/watch?v=_oqzor6cQpw&list=PLQWBmbu7pmqnRenMh2hp6s8… как перекрашивать темы, в отличие от модуля color перекрашивать можно любые темы и предварительно подготавливать тему для этого не нужно

3 – http://www.youtube.com/watch?v=LFzelPWQBN8&list=PLQWBmbu7pmqnRenMh2hp6s8… интеграция с модулем Context, как назначить определенный цвет для раздела сайта

Функции модуля StyleManager

Редактирование CSS
StyleManager позволяет редактирования CSS из браузера и видеть сделанные изменения сразу, без перезагрузки страницы.

Категории
Настройки CSS вносятся в одну из имеющихся категорий, таких как Footer, Pager, Menu.
Категории можно экспортировать и использовать их на других сайтах.
Категории можно создавать и удалять, их количество не ограниченно.

Перенос категорий на другие сайты
В категориях css путь к элементам строится из двух частей «prefix» и «css path».
Если изменить css_prefix, то все стили станут примяться другому блоку на странице. Это удобно при переносе настроек на другой сайт.

Пресеты
Каждая из категорий (например Menu) может содержать неограниченное количество вариантов отображения (пресетов).
Пресеты можно переключать сразу видеть страницу с выбранным вариантом (стили применяются без перезагрузки страницы).
Пресеты можно клонировать и изменять.

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

Как на основе одного цвета можно построить дизайн сайта?
Цвет из глобальных настроек можно не только наследовать, но и модифицировать его.
Пример: у нас указан синий как базовый цвет, нужно сделать цвет ссылок такими как базовый цвет, а при наведении немного светлее, а фон футера должен быть почти черным с синеватым оттенком.
Для таких случаев в модуле есть возможность коррекции базового цвета. Можно менять тон, насыщенность и светлоту (Hue, Saturation, Lightness) и в результате использовать новый цвет который основан на базовом цвете.
В случае из примера нужно будет поставить: цвет ссылок = {базовый цвет}, цвет ссылок при наведении = {базовый цвет / Lightness + 10%}, фон футера = {базовый цвет / Lightness = 10}

Картинки и графика
Бэкграунды, иконки, кнопки и т.д., что с ними?
При экспорте и импорте категорий графика использованная в этой будет упакована в файл, и после импорта появится на новом сайте.
StyleManager может перекрашивать картинки в другой цвет, менять их контраст, делать их светлее или темнее и т.д. Для этого в модуле есть несколько режимов обработки картинок.

—-
Сейчас модуль на стадии разработки, его можно ставить на тестовые сайты, но на живых лучше не использовать
Скачать модуль можно тут – https://github.com/nikolay-shmaleniuk/style_manager
Песочница drupal.org – http://drupal.org/sandbox/n.shmaleniuk/1977500

Источник: http://www.drupal.ru/node/99348

Drupal Café в Одессе №3

Уважаемые друпалеры и друпалерши, мы рады пригласить Вас на Drupal Café в Одессе №3!
Мы собираемся в неформальной обстановке уютного офиса компании Ciklum, которая любезно предоставила помещение и помогает в организации мероприятия.

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

План мероприятия.
- доклад “Google Analytics & Drupal: возможности, интерфейс, технические аспекты.”, уровень – начинающий – Ярослав Крутиков;
- доклад “Drush+Features”, уровень – начинающий – Олег Липовой;
- “Вопросы ответы новичков” – свободный формат. Общение на интересующие темы собравшихся.

Время и место
Дата проведения: 25 апреля.
Начало: 18:30.
Место проведения: г. Одесса, ул. Леха Качинского, 7 (бывшая Польская), офис компании Ciklum.

Форма регистрации на Drupal Café №3 в Одессе – https://docs.google.com/spreadsheet/viewform?formkey=dDJxVUptb0cxSjlCUE5…

Источник: http://www.drupal.ru/node/98189

Обмен данными между Ubercart 3 и 1С Управление торговли на примере модуля importer

Всем привет!

Преамбула: стал вопрос о связи инет магазина на ubercart с 1С. Сам реализовывать пока не брался, решил поискать готовые решения.

Нашёл и рассмотрел несколько:
1. Разработчик из Екатеринбурга, имя домена с упоминанием 1С и drupal. В результате общения, через fededback на сайте, выяснилось, что реальная, запрашиваемая стоимость в два раза больше заявленной на его сайте.
И в результате ещё некоторых моментов в общении с разработчиком было принято решения далее с ним не общаться.
2. Решение, найденное на сайте http://armrus.net/blog/sinkhronizatsiya-drupal-s-1s отображало только авторские идеи, не доведённые до публичного практического решения. Со слов автора решение рабочее. Идея понравилась, но испробовать его, к сожалению, не удалось.
3. Решение, давно замеченное на http://cmlservice.com, первый раз о нём прочёл в статье http://www.drupal.ru/node/62395.

Далее об этом решении.

Это связка модулей, позволяющих загружать из 1С в Ubercart в формате CommerceML2 данные о товарах: каталог, описание, фотографии, цены, остатки, характеристики и свойства. Так же позволяет выгружать в файлы order.xml данные о заказах и контрагентах с сайта.
Порадовало адекватное отношение разработчика – быстрый ответ, помощь в режиме скайп-видео и TeamViewer, наличие документации к модулю и обработке 1С: http://cmlservice.com/docs

Но! Первый камень был брошен со стороны 1С. На сайте http://v8.1c.ru/edi/edi_stnd/90/ опубликованы стандарты формата CommerceML2, принятые самой 1С. Но в последних версиях Управления торговлей, без объявления войны, были вероломно нарушены данные “стандарты”. Такая же реализация была выполнена в конфигурации Штрих-М: Торговое предприятия, с которой нам пришлось налаживать связь для ubercart. Фактически в 1С поменяли “характеристик товара”. Ранее они были в файле import.xml теперь же в offers.xml, хотя версия формата в файле осталась той же – 2.04.
Проект CMLService поддерживал Характеристики, находящиеся в import.xml. В результате обнаруженной нами проблемы было создано issue http://css.mirocow.com/issues/501 которое оперативно было исправлено и закрыто.
Так же в последнее время была добавлена поддержка Ubercart 3, загрузка свойства товаров в поля ноды. Разработчик раскрыл карты на счёт окончания работ над модулем для Commerce – он будет окончен в ближайшее время.

Краткая инструкция по настройке модуля:

Включаем модули: Importer, Import content from CML, Import Offers from CML, Export orders from Ubercart (CommerceML2)

Добавляем атрибуты товара, опции можно не устанавливать, они загружаются из 1С: /admin/store/products/attributes

Идём в настройки модуля Importer: /admin/importer/settings

Настраиваем каталог (в каталоге sites/all/modules/importer/data уже расположен пример, выгруженный из 1С УТ. Права доступа на каталог должны быть 700 (иначе не будут записываться order.xml), поэтому желательно его вынести в корень, или скрыть где-то в недрах files.

Добавляем товару поля типа “Термин таксономии”.
Настраиваем привязки свойств к полям (если нужно), копируя <Ид> свойств из файла import.xml:

Настраиваем привязки характеристик к атрибутам, копируя из файла offers.xml значения ключа <Наименование> из <ХарактеристикаТовара>:

Копируем из файла offers.cml значение ключа <Ид> из необходимого ключа <ТипЦены>:

Запуск импорта по адресу: /admin/importer

Сначала загружаем товары, зачем предложения по товарам (цены, остатки).

Идём в /admin/content, смотрим загруженные товары.

Всё.

Файлы заказов order_<номер>.xml создаются в этом же каталоге после осуществления заказа на сайте. Данный файл можно загрузить в 1С, используя обработку с сайта автора.

В тему приглашается сам разработчик, для ответа на вопросы

Вложение Размер importer1.jpg 24.88 КБ importer2.jpg 35.44 КБ importer3.jpg 30.12 КБ importer4.jpg 17.51 КБ

Источник: http://www.drupal.ru/node/97971

DrupalCafé – чт, 21/03/2013 – 19:00, Россия, Москва

Второе DrupalCafé в Москве, узнаем подробности про Drupal 8 и про микроформаты, подписываемся, отмечаемся

http://drupalcafe.ru/ru/event/s-2013-03-21-150000-po-2013-03-21-170000

P.S.: В прошлый раз столкнулись с таким и на всякий случай обозначу явно – чтобы избежать платы за пользование услугами антикафе, при входе говорите, что вы на мероприятие и по договору с ЗАО “Госбук”.

Источник: http://www.drupal.ru/node/97756

Почему мой сайт так много стоит?

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

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

Для начала примем ряд аксиом, это необходимо нам для полной картины.
1. “Цели – Задачи” – ставит заказчик основываясь на том или ином опыте.
2. “Время – деньги” определяем мы – исполнители, это наши временные затраты определяющие конечную стоимость выпускаемого нами продукта. Для упрощения расчетов будем считать что все расходы (а оно почти всегда так и есть) включены в конечную стоимость часа работы программиста.
3. “Законченность проекта” – определяется заказчиком на основании удовлетворенности клиента. Т.е. проект можно считать законченным в том случае, когда заказчик удовлетворен тем что у него есть в настоящий момент времени (согласно технического задания).

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

Т1-Ф1 или “а что тут делать”

Сначала официально. Т1-Ф1 это базовый функционал друпала + простая темизация либо настройка базовой или бесплатной темы стоимость такого продукта в принципе равна времени затраченного на разворачивание сайта из коробки и настройку темы.
Подробно:
- БТД (базовая тема друпала) + СФ(стандартный функционал из коробки): условно бесплатно
Цена: “дешево до безобразия” обычно от “бесплатно” и до “кто за сколько продаст”.

К примеру студия берет за 1 час работы программиста 20$, значит, если идти по накатанной схеме установки и базовой настройке друпала (разворачивание сборки, или просто движок + модули) примерно 1 час, то можно выдвигать слоган 20$ за сайт и вперед (в дальнейшем все денежные эквиваленты будут браться из расчета 20$ час), но ….
Вы должны как исполнитель сразу объявить заказчику что он получает в конечном итоге за эти деньги и время, в противном случае мы станем свидетелями следующей ситуации:

“а что тут делать” – Многие очень часто сталкиваются с такой формулировкой и на самом деле это действительно так, если заказчика вполне устраивает бюджетное решение основанное на стандартном функционале. Однако, чаще всего это совсем не так. Просто визуальные ожидания заказчика и понимание задачи разработчиком в большинстве случаев изначально находятся в разных плоскостях и существует задача свести их в одну плоскость, а еще лучше совместить для получения итогового качественного продукта .

В качестве примера.
Многие из нас очень часто встречались с задачей “регистрация пользователей на сайте” – казалось бы куда проще = стандартный функционал друпала, что тут обсуждать или пережевывать, но смотрите как одна фраза в ТЗ или просто банальная хотелка – “как там” превращает вполне тривиальную задачу в “головняк” для разработчика:
“По нажатию на клавишу “восстановить пароль” пользователю должно приходить письмо в котором указан его текущий логин в системе и пароль указанный при регистрации, никаких одноразовых ссылок”.
Получается что вполне стандартное с точки зрения заказчика требование (пусть оно и противоречит требованиям безопасности о хранении паролей в явном виде, сейчас мы не об этом) перерастает для нас в дополнительную работу. Написать модуль, который будет перехватывать задаваемый пользователем или генерируемый системой при регистрации пароль, записывать его в отдельную таблицу БД из которой мы по запросу сможем отправлять нашим пользователям забытые пароли.

Вывод: мелочь из примера увеличивает стоимость разработки минимум на 2-3 часа и либо вы это делаете бесплатно угоду клиенту т.е. из 20$ в 80$ и дарите клиенту 60$, либо пытаетесь объяснить что стандартно это не было предусмотрено движком (клиента чаще всего не интересует, что там предусмотрел Дрис и его коллеги а что нет).
В конечном итоге в 90% случаев клиент с недовольной миной отзывается о вас “вот пообещал все сделать за час а в итоге ничего не сделал, функционал не готов, сайт не работает”.

Таких мелочей и нюансов может быть великое множество. Особенно явно это видно на проектах без технического задания, “грамотный” заказчик оперируя фразой “а что тут делать” заставляет разработчика постоянно тратить время на всякого рода мелочи которые соответственно увеличивают конечную стоимость продукта, но эти средства к вам как исполнителю уже не вернутся, вас будут выжимать как лимон

Поэтому для сайтов выходящих на первый этап Т1-Ф1 используются типовые решения с фиксированным ТЗ и зачастую фиксированной стоимостью. Заказчик должен явно понимать что за свои кровные N долларов он получит вот такое чудо света и никак ни больше и ни меньше. Так же заказчик должен изначально знать и быть готовым к тому что любые его “хочу” сверх ТЗ должны просчитываться и оплачиваться отдельно и они переводят продукт в следующую итерацию.

Т2-Ф2 или “а что тут делать – 2”
Сначала официально. Т2-Ф2 это + дизайн с последующим созданием темы + небольшие отдельные хотелки и финтифлюшки реализуемые на этапе темизации, либо написанием мелких кастомных модулей.

Подробно:
- дизайн (400$ 20часов) может быть заменен дизайном заказчика, тогда бесплатно;
- создание темы (до 40 часов 800$, возьмем половину)
- стоимость отдельного функционала (хотелки) в зависимости от задач и почасового рейта компании.
Итого: итого в среднем по стране без хотелок мы из 1 часа превращаемся в 1 недельную работу (40 часов) и стоимостью в среднем в 800$ без учета хотелок.

В качестве примера.
“а что тут делать -2” – во избежании очередных недопониманий о том “что тут делать”
Банальное слайдшоу из 2-100 картинок на главной странице между меню и основным контентом такое “каждый школьнег умеет делать”, но посмотрим на ожидания заказчика:
- он в 100% подразумевает, что картинки можно было удалять и добавлять из админки.
- он в 95% подразумевает, что можно добавить текст если захочешь и он выведется не ломая верстку
- он в 90% подразумевает, что можно из админки регулировать скорость смены слайдов стили смены слайдов или включать – отключать автоматическую прокрутку
- он в 85% подразумевает, что всем этим умеет управлять блондинка-секретарша а не программист.
Список хотелок в слайдшоу можно попытаться продолжать и дальше, но я не буду этого делать.

Итак 4 хочу, которые заказчик ожидает увидеть но нигде об этом явно не говорится превращают 30-40 минутную задачу в работу на целый день. Ведь если мы банально зальем картинки по фтп или в какой-то статик пейдж и на шаблоне добавим свои js и css результат внешне не будет отличаться от сложного функционала реализованного за 8 часов, но если человек захочет что-то поменять в слайдшоу и не сможет то в 99% задача будет считаться не выполненной, функционал с точки зрения заказчика не сделан.

Т3-Ф3 или “ну а тут то что сложного”
Сначала официально. Т3-Ф3 это два предыдущих этапа + реализация не видимого простому глазу функционала требующего написания одного или нескольких модулей реализующих достаточно сложный функционал к примеру расчет стоимости доставки в зависимости от веса, габаритов товара, региона, способа доставки, учета общей стоимости заказа и т.д. начисления процентов менеджеру через которого сделан заказ или по чьей ссылке человек пришел на сайт в общем любую сложную задачу которую вы можете себе представить

Здесь не будет подразделов “подробно”, “цена” и т.д. поскольку в таких частных случаях конечная стоимость формируется только по оценочной стоимости задач специфичных только для этого проекта. Если кастомный функционал оценен разработчиками в 100 часов то и стоимость проекта будет к примеру 2820$ если присутствуют все этапы, может быть вариант и без дизайна и мелких “свистелок”, тогда стоимость составит 2020$

Почему разработка кастомного функционала при казалось бы простой задаче занимает достаточно большое количество времени?
Попробую ответить на этот вопрос на простом примере для интернет магазина.
Мелочь – помечать товары ленточкой “новинка” или “хит продаж” по умолчанию в уберкатре или коммерце из коробки такой функционал не предусмотрен, какие действия должны предпринять мы и что увидит и не увидит конечный заказчик (по умолчанию каталог сделан с помощью вьюсов (если нет, то мне еще страшнее))

Увидит:
- галочку на форме редактирования товара;
- результат вашей работы при включении свойства товара.

Не увидит:
- таблицу в БД которая появится при создании поля типа select (checkbox);
- изменение вьюхи (добавить поле нового товара), вьюх или дисплеев отображения может быть несколько
- перекрытие шаблона вьюхи (добавить дивку с классом для row);
- вырезать или сохранить картинку из PSD (хуже если нарисовать)
- поправить css файлик темы чтоб выводилась картинка;
- проверить корректность отображения в поддерживаемых браузерах.

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

Итак задача в ТЗ повесить ленточку (примерная оценка):
- добавить филд – 10 минут;
- добавить филд на вьюху – 10 минут на каждую если их больше одной или больше одного дисплея;
- перекрытие шаблона вьюхи – в зависимости от архитектуры – от 15 минут;
- картинка – от 10 мин;
- сss – 10 мин;
- тест – 15 мин;
ИТОГО: в идеальных условиях 1час 10мин т.е. ~23$ за какую-то ленточку
А если что-то не так сделал (все люди) и надо исправить проблему?

Эпилог
Какие-же выводы можно сделать из всего этого набора букв и одной картинки
1. Внешняя картинка (морда) в 90% случаях не отражает весь функционал сайта.
2. Одна и та же задача в глазами заказчика и разработчика совершенно разные картины и чем точнее ее решит разработчик, тем довольнее будет заказчик и будет им обоим много счастья.
3. Совершенный (идеальный) проект сделать можно только в теории, на практике нет, потому и график – асимптота т.к. этот идеал возможно где-то есть в перспективе, время и прогресс важные факторы.
4. Техническое задание – неотъемлемая часть любого проекта включая сайт-визитку. Чем точнее задание будет описывать функционал будущего сайта, тем меньше головных болей будет у вас и меньше будет недовольных конечным результатом заказчиков. И самое главное тем точнее предварительная оценочная стоимость будущего проекта.

P.S.
Так сколько же должен стоить сайт на самом деле? Ответ на этот вопрос мы можем дать только в конце создания продукта, так же как и нет ответа на вопрос “сколько стоит дом нарисованный на схеме”?
Мы можем говорить о конечной стоимости только по завершению какого либо этапа работ.
Спасибо

Вложение Размер graph1.png 39.73 КБ

Источник: http://www.drupal.ru/node/96842

DrupalCafe #3 в Санкт-Петербурге

Приглашаем принять участие в очередной встрече Drupal сообщества Петербурга 2 марта 2013.



Место встречи: офис компании Retail Navigator

Бесплатно, необходима регистрация на сайте DrupalSPB.org.

Присоединяйтесь!

Источник: http://www.drupal.ru/node/96803

Ульяновск Друпал-кафе

Приветствую всех активных Drupal-разработчиков города Ульяновска. У меня есть желание организовать встречу всех кто разрабатывает сайты на данной платформе в нашем городе. Всех кого заинтересует данная тема, отпишитесь, пожалуйста, в комментариях. Если выскажут заинтересованность ну хотя бы несколько человек, может даже хотя бы один(просто других drupal-программистов лично я не знаю), то проведем первую в истории нашего города встречу Drupal Cafe.

С уважением,
Константин

Источник: http://www.drupal.ru/node/96102

Новый сезон: Алматы Друпал-кафе 9

Привет, друпалеры,

В Алматы мы начинаем новый сезон встреч – ближайшая намечена на 10е февраля в 16:00. Там будут осуждаться следующие темы:

1. Создание мультиязычных сайтов – рассказывает Дарья ‘Tochka’
2. Compass + Sass на Друпал – проведет Айрат ‘Dakanca’
3. И наконец-то обзор модуля Правила – Арман ‘Zil’

Детали здесь. До встречи!

Источник: http://www.drupal.ru/node/96079

Drupal Café’2013 в Москве. 6 февраля.

Планируется очередное DrupalCafé 6 февраля в Москве.
Место проведения – антикафе Бабочки, рядом с м. Марксистская (Таганская)
В этот раз Вас ждут интересные обсуждения на темы:

Что нас ждет в Drupal 8?. рассказывает и показывает Андрей Постников, активист сообщества Drupal. Напоминаю, что 1 февраля разработчиками Drupal 8 будет проводится подведение итогов по нововведениям в движке. Эта тема очень обширная, Андрей будет рассказывать в этот раз о наиболее заметных изменениях, а в следующих DrupalCafé будет постепенно раскрывать все больше и больше подробностей. Не пропустите, будет интересно! От руководителя проекта Госбук, Юрия Родионова, будет представлен обзор перспектив развития Drupal в России. Каким образом компании-разработчики, используя Drupal, могут помочь его развития, какие для это есть способы, как лучше это делать? Какие плюсы от сотрудничества с сообществом получит компания? На многие подобные вопросы можно будет получить ответ, пообщавшись на этом DrupalCafé.

Источник: http://www.drupal.ru/node/95966

Приглашаем на DrupalCafe в Одессе

Уважаемые друпалеры и друпалерши, мы рады пригласить Вас на Первое Drupal Cafe в Одессе!
Мы собираемся в неформальной обстановке уютного офиса компании Ciklum, которая любезно предоставила помещение и помогает в организации мероприятия.

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

План мероприятия.
Первый доклад (тема уточняется)*.
Перерыв.
Второй доклад(тема уточняется)*.
Перерыв.
“Вопросы ответы новичков” – свободный формат. Общение на интересующие темы собравшихся.

Время и место
Дата проведения: 27 февраля.
Начало: 18:30.
Место проведения: г. Одесса, ул. Леха Качинского, 7 (бывшая Польская), офис компании Ciklum.

Форма регистрации – https://docs.google.com/spreadsheet/viewform?formkey=dGROSVM4N2JMWHBRMHJ…

Если у вас есть вопросы или предложения — обращайтесь к Олегу Липовому по тел. (050) 924 97 71 или пишите в группы http://vk.com/drupalcafeodessa
http://www.facebook.com/groups/550668878279686/

Источник: http://www.drupal.ru/node/95952

Модуль Украинские курсы валют Drupal 7


Написал простой модуль курсов валют для Drupal 7. Может кому-то окажется полезным.
Работает просто:

по крону смотрим в xml файл на http://bank-ua.com парсим нужные нам курсы (в моем модуле это USD, EUR, RUB) полученные курсы заносим в БД выводим на сайте как блок

Приятные фишки:

через .tpl доступна темизация. все курсы заносим 1-запросом к БД получаем так же.

Неприятные фишки:

блок с курсами валют не кешируется в админке нельзя выбрать тип валюты для показа.

Пример работы модуля: http://www.bestnews.in.ua/ (данные берутся с другого источника палить не могу.)

Установка:

залили на сайт включили вывели в блоках в нужном регионе запустили крон.

Чуть не забыл: курсы валют по отношению к .грн Украина.

любые дельные советы по улучшению кода, приветствуются.

Вложение Размер ua_courses_7.x.3.0.zip 23.88 КБ

Источник: http://www.drupal.ru/node/94015

Проводим семинары по Drupal в Самаре! Вход free

Всем привет! Решил написать про наши посиделки с кружкой горячего кофе перед экраном проектора с обучающий контентом… Все началось банально с отсутствия прямо растущих рук у желающих получить работу в нашей молодой, но активно растущей компании. Вместо того чтобы манить-переманивать мамонтов друпала с засиженных (порой чересчур) мест, мы решили влить пациенту немного свежей крови и смелых решений. А решили мы проводить Воскресенские семинары по друпалу (прям как в церковно-приходской школе). Началось все с занятия по верстке макета под друпал, присутствало всего 5 человек, включая ведущего. Вроде бы не пошло и мы решили попробовать отвести второй семинар. На нем собралось уже 9 человек вместе с ведущим (уже неплохо решили мы). Через уикэнд мы пригласили на Саппорт не безызвестного самарского спеца даниэля (Dan), который всех порадовал доходчивым рассказом про views… Вобщем решили мы с нового года перевести все это дело на более-менее постоянную основу, а именно решили что будем проводить 1 занятия длинною в 2 час раз в 2 недели. Мы распивали график и последовательность подачи информации (могу скинуть посмотреть на почту кому интересно). Ждем новые горящие глаза, надеемся на положительное влияние на ваши разумы. Welcome

Все справки по тел: 89270195120

Источник: http://www.drupal.ru/node/93941

Новогодний Google+ Hangout o разработке ядра Drupal 8, сегодня, 25 декабря!

Добрый день, друзья.

Приглашаем вас на новогодний Google+ Hangouts посвященный Drupal 8 с Андреем Постниковым и Владом Моисеенко. Мы поговорим о том, что нового будет в Drupal 8, а также ребята расскажут подробнее о своем участии в разработке ядра системы.

Участие
Если вы принимали участие в разработке Drupal 8 и вам есть, что сказать, то подключайтесь к нам. Для этого оставьте в комментариях ссылку на свой Google+ профиль и добавьте меня в круги (https://plus.google.com/111053704258459064817). Начало hangouts для участников за пол часа до трансляции.

Трансляция
Если вы хотите смотреть онлайн трансляцию, то это можно будет сделать на моем канале (http://www.youtube.com/user/dealancer?feature=mhee). По началу трансляции мы вставим видео фрейм в этот пост.

Вопросы
Еслу вы хотите задать участникам вопросы вы можете это сделать написав в Google+ по тегу #drupal8hangout (https://plus.google.com/u/0/s/%23drupal8hangout).

Время и место
25 декабря 2012
21:15 – 22.30 (Москва)
19:15 – 20:30 (Киев)

Hangout будет проводится одновременно с Drupal Café в Донецке.

Источник: http://www.drupal.ru/node/93857

Приглашаем на DrupalCafe #2 в Санкт-Петербурге

Приглашаем выступить с докладом или просто послушать других на очередной встрече DrupalCafe #2 в Санкт-Петербурге.

Подробности читайте на странице регистрации.

Источник: http://www.drupal.ru/node/92466

Вебинар API Яндекс.Карт для интернет-магазинов декабрь 2012, участие бесплатное.

11 декабря 2012 года мы проведем очередной вебинар, посвященный использованию Яндекс.Карт на сайтах. На этот раз весь вебинар будет посвящен исключительно картам для интернет-магазинов.

Катя Текунова (Ekaterina Tekunova, @tekunova), маркетолог API, расскажет, какие разделы сайта интернет-магазина можно значительно улучшить с помощью карты, а также покажет простые инструменты для создания такой карты.

Участие в вебинаре бесплатное, но нужно зарегистрироваться. Дополнительно о вебинаре можно почитать на сайте events.yandex.ru.

В этот раз мы попробуем новый формат. Подключайтесь, будет интересно!

Источник: http://www.drupal.ru/node/92286

Награждение победителей конкурса статей от проекта SoftInterGroup и студии Aquanther

Награждение

Баранок Артур Витальевич (ник: musical_art), статья по Adaptive Templates (Создание собственной темы с использованием AdaptiveTheme – http://la.by/blog/sozdanie-sobstvennoy-temy-s-ispolzovaniem-adaptivetheme, Создание собственной подтемы с использованием Tundra. Сравнение Adaptive Theme и Tundra – http://la.by/blog/sozdanie-sobstvennoy-podtemy-s-ispolzovaniem-tundra-sr…, Полезные инструменты для веб-дизайнера при создании тем в Drupal 7 – http://la.by/blog/poleznye-instrumenty-dlya-veb-dizaynera-pri-sozdanii-t…). Получает 150$ на долларовый кошелёк вебмани.

Игорь Челединов (ник: chilic), статья по поиску (http://www.aquanther.ru/wettbewerb/search_api.doc). Получает 150$ на долларовый кошелёк вебмани. При этом автор обещал дописать продолжение про настройку Solr и SearchAPI которую ждём от него в рамках конкурса.

Семен (ник: semasping), получает приз за участие в 1500 рублей, статья Самописный импорт (http://www.drupal.ru/node/92339, часть темы которую нужно было раскрыть) на рублёвый кошелёк вебмани.

Поздравительное слово от коллектива Softintergroup

Пришло время подвести предварительные итоги нашего конкурса.
Выражаем благодарность всем тем, кто так или иначе принял участие.
Отдельная благодарность студии Aquanther в лице Касихина Вячеслава за партнерство в проведении конкурса.
Итак, победителей у нас двое: Баранок Артур Витальевич и Игорь Челединов. Победители получают по 150 $.
Так же, в качестве утешительного приза, вручается 50 $ semasping Семёну.
В будущем подобные конкурсы будут проводиться регулярно при поддержке нашего сообщества.

С уважением,
коллектив Softintergroup.

Поздравительное слово от Касихина Вячеслава и коллектива Aquanther

Идея конкурса возникла неожиданно, одни мои коллеги предложили хорошие темы (ребята из Aquanther), а другие (коллектив Softintergroup) выделил призы. Так же это мероприятие было освещено в одном из выпусков Drupal-подкастов.
Статьи получились хорошие, до финиша дошли не все участники и по крайней мере ещё 1,5 статья находится на этапе написания – это хороший повод продолжить традицию конкурсов статей на полезные темы.
Спасибо всем кто принимал участие.

С этого места и далее: условия проходившего конкурса

Уважаемые Коллеги – Профессиональные Разработчики и Друпалисты!

Рады представить вам Конкурс, который планируется проводить на постоянной основе, дающий возможность получить гарантированные денежные Гранты в размере 150 USD за выполнение определенных заданий.

«Drupal 7» предоставил множество возможностей, однако без определенного опыта разработки, понять суть данных возможностей и научиться их использовать довольно сложно. Нам хотелось бы, чтобы данным опытом, профессиональные разработчики поделились с начинающими разработчиками Drupal. Однако не исключено, что даже опытные бойцы найдут что-то новое для себя.

Как будет проводиться конкурс

Желающий (или группа желающих, если тема пишется в соавторстве) заявляет о себе в качестве автора одной из тем. Создаёт новый топик на форуме, указав в данном сообщении ссылку на него, и начинает прорабатывать каждый раздел из темы. В течении двух дней должен быть готов и выложен в соответствующий топик, один из разделов темы с описанием и соответствующими скриншотами. В случае, если автор не может в течении 4 дней продолжить написание темы, любой другой может вступить в соревнование, как автор продолжения ранее заданной тематики, и в течении 2-х дней прислать ее следующий раздел. В случае возникновения технических затруднений (примеры кода и т.п.), всегда можно обратиться к пользователю с ником Irbis, который осуществляет проектную поддержку конкурса. По завершении написания каждого раздела темы, от пользователя Irbis будут приходить рекомендации по улучшению материала. По завершении конкурса, Авторы получат вознаграждение, которое будет разделено между авторами, участвовавшими в написании статьи.

Как писать статьи

Пишите так, как будто Вы пишите для вашей Мамы, Бабушки, близкого человека; Не стоит напрямую обращаться к пользователю: “возьмите, установите”, лучше используйте: “возьмём, установим”. Так, как будто Вы вместе проходите по всем этапам установки и настройки; Подробное описание – это хорошо, но оно всегда должно быть снабжено скриншотом.

Список тем:

1. Panels
– Общее описание Panels, Mini panels, Panels everywhere, Page manager и почему их использование предпочтительнее блоков;
– Сборка сложной страницы интернет магазина с применением Panels everywhere + Mini panels;
– Сложный вывод полей контента с помошью Panels, Custom content panes и Views внутри Panels everywhere;
– Сложный вывод полей контента с помошью Fieldgroup + DS как альтернатива Panels, внутри Panels everywhere;
– Создание своего плагина для вывода данных в Panels.

2. SearchAPI
– Общее описание Search API, Search facets, Search views, Search pages, Facet API, Database search;
– Настройка Search API + SOLR / Sphinx / Database search и настройка фасетов;
– Настройка Search views + Search pages и подключение альтернативных плагинов – Search ranges и т.п.;
– Альтернативная схема: Custom Search + DS Search + Views для поиска, блоки фасетов для каталога;
– Написание своего плагина фасета.

3. Migrate, Feeds и свой вариант импорта и обновления данных.
– Самописный импорт (получение данных из *.CSV, БД или XML; проверка данных; выборка данных дял импорта; создание очереди для импорта; импорт или обновление: нод, фото, терминов, файлов, товаров; обновление поискового индекса);
– Migrate: те же пункты импорта, доп. обработка импортируемых полей при импорте, доп. обработка данных после добавления, обновление данных;
– Feeds: те же пункты, что и в разделах выше;
– Импорт по Cron или из Drush;
– Оптимизация импорта: общие рекомендации по настройке сервера.

4. Adaptive Templates
– Tundra vs AdaptiveTheme, когда какой вариант выгоднее;
– Tundra, создание подтемы и настройка её;
– AdaptiveTheme, создание подтемы и настройка её;
– AT Panels Everywhere, когда нужно, что бы Panels Everywhere была адаптивной: описание настроек;
– Набор рекомендуемых плагинов и расширений для браузера, а также методов кастомизации или разработки темы для новичков.

5. Разработчикам сервисов посвящается
– Flag и Rules, примеры из жизни при создании сервисов;
– Entity Reference и Entity Reference View Widget, примеры из жизни при создании сервисов;
– Chaos Tools Modal Dialog и Chaos Tools multi step forms, примеры из жизни при создании сервисов.
– Views, то что не могло прийти Вам в голову, но то, что умеет Views и его плагины, примеры из жизни при создании сервисов;
– Список полезных модулей для администратора и пользователя большого портала, примеры из жизни.

Успейте вписать своё имя в историю «Drupal» и запомниться тысячам людей благодаря Вашей статье. Скоро Новый Год – это отличный повод порадовать сообщество хорошей инструкцией и ещё раз заявить о себе, как об опытном специалисте.

Сопровождение конкурса

Информационная и финансовая поддержка в размере 150 USD на грант за написание статьи предоставлена Проектом SoftInterGroup (http://softintergroup.ru/); Менеджерская поддержка по написанию статей осуществляет пользователь с ником Irbis, при поддержке студии Aquanther (http://www.aquanther.ru/).

P.S.: Если есть желание, но нет опыта, то обращайтесь – пришлю о чём писать, где копать и что переводить (вводный мини-тренинг, который Вы должны развить в большой материал).

Источник: http://www.drupal.ru/node/91933

Великолепный слайдер Nivo Slider для друпала 7.x


Ранее я писал как сделать слайдер Великолепный слайдер Nivo Slider для друпала 6.x. Сегодня речь пойдет о слайдере Nivo-Slider для Друпал 7.

Совсем недавно опубликовал обзор и инструкцию по установке/настройке слайдера Field Slideshow: Простой слайдер картинок материала для друпал 7.хх, но из-за его ограниченного применения возникла необходимость установки и настройки старого и доброго Nivo Slider, но уже на 7ке.

Основное отличие Nivo-Slider от других слайдеров в том, что с помощью него можно создать слайдер с слайдами различных нод. По умолчанию создается слайдер с тизерами последних материалов.
Аналогичное преимущество у слайдера Views Slideshow, обзор по нему подготовил Гавриил Заславский

Установка и настройка

1. Устанавливаем модуль  Views Nivo Slider

Обязательные для работы модули  Libraries,  Views,  Chaos tools;
(советую ставить стабильную Recommended releases версию для нормальной работы)
Скачиваем Nivo Slider jquery plugin версии 2.7.x или 3.x, распаковываем в папку sites/all/libraries/nivo-slider

2. Создаем новое представление Views

Задаем формат вывода “Views Nivo Slider”

Указываем количество материалов для вывода

Также можно указать тип материала для вывода, ограничить вывод по тегам и т.д. – все это на ваше усмотрение легко делается стандартными средствами Views

Добавляем вывод поля картинки Формат -> Показать -> Настройки (Настройки стиля “Строка”)

Важный момент – чтобы размер картинок слайдера корректно отображался нужно указывать одинаковые стили вывода изображения в Поле картинка и в настройках формата Views Nivo Slider – Image field style

3. Выводим views в блок.

В итоге у меня получилась вот такая картина

Вложение Размер dr6.jpg 32.2 КБ dr5.jpg 103.38 КБ dr1.jpg 42.95 КБ

Источник: http://www.drupal.ru/node/91340

Web Standards Days в Москве 24 ноября 2012 года в Яндексе

24 ноября 2012 года в Москве состоится встреча Web Standards Days, организуемая совместными усилиями Яндекса и объединения разработчиков «Веб-стандарты» при поддержке W3C.

Разработчики Яндекса, Opera Software, Badoo, Creative People, Getwear, один талантливый фрилансер и эксперты из самого W3C расскажут вам много интересного о технологиях фронтенд-разработки и веб-стандартах.

Из докладов вы узнаете:

Над какими CSS-чудесами сейчас работают в W3C.

О семантическом вебе и будущем интернационализации.

Зачем Яндекс вступил в W3C и как делать веб-стандарты.

Как можно уменьшать SVG в разы с помощью новой утилиты.

Что такое «Ретина», как и, главное, зачем под неё верстать.

Почему стоит использовать паттерны JavaScript.

Как наладить эффективную сборку проектов с помощью Grunt.

Чем отзывчивый веб-дизайн отличается от адаптивного.

Как работать с тач-событиями на мобильных устройствах.

О дизайнере, который живёт в каждом технологе.

А также вы сможете задать вопросы экспертам во время круглого стола.

Выступления пройдут как на русском, так и на английском языке.

Участие, как всегда, бесплатное, но зарегистрироваться необходимо.Регистрация на мероприятие заканчивается 20 ноября в 18:00 по московскому времени.Количество мест ограничено.

24 ноября, в субботу, с 9 утра ждём участников по адресу: Москва, ул. Льва Толстого 16, офис Яндекса, зал Экстрополис.

Для тех, кто не попадёт в число участников или не сможет лично присутствовать на мероприятии, на этой странице будет организована онлайн-трансляция.

С программой конференции можно ознакомиться здесь

Источник: http://www.drupal.ru/node/90895

[Коллективное спонсирование] Кому нужен модуль SMS рассылок?

** Данный топик изучает спрос на модуль **

В данный момент приступил к разработке модуля для интеграции СМС шлюза smsc.ru
Мне понадобилась фича отправки оповещения при:

– регистрации пользователя в магазине (Друпал коммерц)
– после оформления заказа. СМСка с деталями заказа
– после смены статуса заказа
– по желанию администратора, своё сообщение

Я проверил несколько СМС провайдеров и остановился на smsc.ru, так как у них:
– Обильный опыт работы (с 2003)
– Хорошие цены (для Украины даже несколько ниже, чем у наших локальных провайдеров)
– Быстрые сервера
– Внятное, обильное и простое АПИ, которое заводится с полпинка
– Адекватный саппорт

*smsc.ru не платит мне денег за пиар

Короче в ходе всего я решил, что это может быть более универсальным решением, нежели то, что мне реально надо.

Это будет аддон к SMS Framework

Кто хочет проспонсировать разработку данного модуля?

Ориентировочная сумма разработки весьма скромна – 200$ в базовой версии + за хотелки

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

UPD: прикрепил опрос

Attached poll “Вы бы хотели проспонсировать разработку данного модуля?”.
Register or login to poll
Results:
Да: 14 голосов
Нет: 6 голосов
Поддержал бы морально: 34 голоса

Источник: http://www.drupal.ru/node/90314

Скрытые фичи Panels: использование хитрого view display под названием “view context”

Сегодня в очередной раз был приятно удивлен возможностями Panels и View context в Drupal. Оказалось, однако, что на Drupal 7 эти возможности никто почти не использует, видимо потому, что про них просто мало кто знает (ну а конкретно ту штуку, которая нужна была мне – вообще никто не юзал с момента релиза D7, так как там в прицнипе был нерабочий код).
Старясь исправить ситуация хотя бы чуть-чуть, решил написать об этом тут.

Во Views есть такой вариант Display под названием “Context”. Никогда раньше им не пользовался, но оказалось он делает офигенно полезные вещи.

Допустим стоит задача разместить на панели что-то, что как-то и достаточно хитро связано с уже имеющимися на панели контекстами, но с помощью Views в принципе вытаскивается. Можно конечно создать view типа content pane, параметаризовать её контекстом, и разместить на панели. Но хорошо, когда контекст уже есть, а что если нет? Что если стандартных, достаточно тривиальных контекстов, как то Node from Node (по поляем), Taxonomy from Node (по полям) (из ctools relashionships) не достаточно? Тут два варианта:

1) притягиваемые views panes параметаризовать имеющимся контекстом и строить сложный view, пока “не доберешься” до нужных данных (через views relashioships)
2) как-то добавить новые контексты которыми параметаризовать views panes, которые становятся теперь простыми, поскольку им сразу даются нужные параметры.

И вот, как раз второе можно сделать с помощью дисплея views context.

1. Сначала вы создаете display типа context, который вам вытаскивает нужные объекты (которые позже станут контекстами на панели)
2. Теперь в панелях в разеле контексты > relashionships добавляете эту появившуюся вьюху и она сама становится контекстом, но плюс
3. расширяет список relashionships, через который теперь можно притянуть то, что тащит уже сама вьюха. И вот это то – тоже становится контекстом!

Я не проврял пока ничего кроме притаскивания таким образом taxonomy terms (которые сперва не заработали – см. ссылку вверху – там блин был stuff из D6 ), но полагаю работать должно как минимум для нодов.

Теперь, у вас есть возможность

1) Также просто размещать на панели куски притянутого контекста, поля – да всё что угодно.
2) Использовать притянутые контексты для параметаризации других вьюх

А также, будучит притянутой таким вот образом (через view context), вьюха становится доступной для операции Вы можете вывести любую часть вьюхи где угодно в панели, на любой pane. Скажем, можно header вывести в панели слева, footer – сверху, результаты – в середине, а листалку – еще где-нибудь. Можно также разбить притянутую по номерам строк, выводя, скажем нечетные строки – слева, а четные – справа. Или вывести рекламу между 3 и 4-ой строкой. Еще можно вывести только отдельные поля из результатов.

В общем, спасибо Мерлину, он сегодня просвятил. Я пообещал ему поделиться с кем-нибудь. Делюсь.

p.s. Сорри что сумбурно, но просто нет времени.

best
OnkelTem

Источник: http://www.drupal.ru/node/90144

Алматы Друпал-кафе 7

Привет, алматинские друпалеры!

Через неделю – 4-го ноября – будет очередное Друпал-кафе в нашем городе, где мы продолжим обсуждение следующих тем:
1. GIT и Features- Айрат ‘Dakanca’
2. И модули Drupal Commerce и Rules – Арман ‘Zil’

Детали и предложения здесь.

До встречи! : )

Источник: http://www.drupal.ru/node/89717

Реализация релевантного поиска с использованием phpmorphy

Всем добрый день (утро, вечер, ночь)
Много читал жалоб на поиск в друпале. И вот наконец с ним столкнулся. Да что уж тут скрывать поиск ужасный.
Видел много пожелание про phpmorphy, ну думаю а что бы нет, потыркаю.
Сразу говорю код привожу как пример реализации, всегда готов принять критику и пожелания по оптимизации.
Работу поиска можно посмотреть тут: Справочник Норильск

Поехали. Весь поиск у меня реализован одним PHP файлом+Вьюха, без модулей и прочего.
Распишу что да как.

Сначала я рисую формочку с поиском и расширенным фильтром:

<script type="text/javascript"> jQuery(document).ready(function(){ jQuery('.spoiler-body').hide() jQuery('.spoiler-head').click(function(){ jQuery(this).toggleClass("folded").toggleClass("unfolded").next().slideToggle() }) }) </script> <form> <span style="font-size:12px; padding-left:20px;"> <input type="checkbox" value="1" name="h" <?php if (isset($_GET['h'])) echo 'checked'; ?>>только дома <input type="checkbox" value="1" name="p" <?php if (isset($_GET['p'])) echo 'checked'; ?>>только организации </span> <div class="azure_block" style="margin-top:0; padding:10px;"> <input type="text" name="str" style="width:90%;" value="<?php print $_GET['str']; ?>"> <input type="submit" style="width:8%;" value="Найти"> </div> <div class="spoiler-head folded" style="cursor:pointer; color:#D63E03; font-weight:bold; padding-right:15px;" align=right>Расширенный поиск</div> <div class="spoiler-body"> <div class="yell_block"> <input type="checkbox" value="1" name="all" <?php if (isset($_GET['all'])) echo 'checked'; ?>> Искать только те материалы в которых присутствуют все поисковые слова <br /> <input type="checkbox" value="1" name="nomrph" <?php if (isset($_GET['nomrph'])) echo 'checked'; ?>> Искать только введенную форму слов (Не использовать склонения) <br /> <input type="checkbox" value="1" name="like" <?php if (isset($_GET['like'])) echo 'checked'; ?>> Искать по наличию части слова (Например: свал = самосвальный) </div> </div> </form>

Инициализируем phpmorphy. Скачать её можно по поиску в гугле, я взял версию словарей без Ё

<?php
$limit = 50;    
    
include_once('/бла-бла-бла/nprsu/phpmorphy/src/common.php');
$dir = '/бла-бла-бла/nprsu/phpmorphy/dicts';  
$lang = 'ru_RU';
$opts = array('storage' => PHPMORPHY_STORAGE_FILE,); #Экономим на ресурсах сервера не грузим в память.
try {$morphy = new phpMorphy($dir, $lang, $opts);} catch(phpMorphy_Exception $e) 
{die('Error occured while creating phpMorphy instance: ' . $e->getMessage());}

?>

Переменную $limit я используя для вывода только 50 результатов, но вот не надо мне больше, не хочу =( на самом деле грабли это из-за views по коду ниже будет пояснение, очень буду рад подсказке как обойти эти грабли.

Сам код и комментарии:

<?php
if ($_GET['str'] != '') #поисковая строка
{
#Фильтр по типам материалов у меня для вьюхи используется
$filter = 'all'; 
if (isset($_GET['h'])) $filter = 'house';
if (isset($_GET['p'])) $filter = 'place';
if (isset($_GET['h']) && isset($_GET['p'])) $filter = 'all';

$words = $_GET['str'];
#заменяем все Ё на Е, так как качали пхпморфи без Ё
$words = mb_strtoupper ( str_ireplace ( "ё", "е", $words ), "UTF-8" );
#Здесь мы делим строку в массив на слова либо цифры, остальное нам не нужно вообще, 
#плюс к этому в sql запрос не попадет грязи.
preg_match_all ( '/([a-zа-яё0-9]+)/ui', $words, $word_pma); 
#Получаем все формы слов из массива
$words_mor_all = $morphy->getAllForms($word_pma[1]); 
$sSQL_where = array();
$arMorphy = array(); #это массив в котором ключ слово а значение его ID 
if ($words_mor_all) #поехали
    {
    #Здесь мы заменяем равно на лайк если выбрана галочка искать по наличию части слова.    
    if (isset($_GET['like'])) {$sep = "LIKE"; $pr = '%';} else {$sep = "="; $pr = '';}
    #вот это порядковый номер который будет у всех словоформ образованных от одного слова 
        #и у него включительно равен 
    $vv = 0;
    foreach ($words_mor_all as $word=>$word_mor) #крутим все слова
    {        
        #если в словаре нашлись словообразования или нет галочки не использовать склонения то далее
        if (is_array($word_mor) && !isset($_GET['nomrph']) )
        {
            $sSQL_or = array();
            foreach ($word_mor as $word_m)
            {
            $arMorphy[$word_m]=$vv; #собираем массив слов и их ID
            $sSQL_or[] = "word {$sep} '{$pr}{$word_m}{$pr}'"; #собираем условие для запроса
            }
        $sSQL_where[] = "
                        (".join(' OR ', $sSQL_or).")"; #собираем where
        }
        else 
        {
            #В этом блоке обрабатываются слова у которых не нашлось словоформ
            $arMorphy[$word]=$vv; 
            $sSQL_where[] = "
                        (word {$sep} '{$pr}{$word}{$pr}')"; #собираем where
        }
    $vv++; #Увеличиваем ID слова, т.к. для этого слова условие выборки готово
    };
    $sSQL = "SELECT sid, word FROM {search_index} WHERE type = 'node' AND 
            ".join(" OR ", $sSQL_where)."
            "; #вот сам запрос. Таблицу я использую от стандартного поиска, значит нужен рабочий Cron
    #echo "<pre>".$sSQL."</pre>";
    $arIdsV = array();
    $arId2Mor = array();
    $arIdAll = array();
    $search_result = db_query($sSQL);
    #Крутим результаты и вычисляем вес материалов по релевантности
    while($ar_ids = db_fetch_object($search_result))
        {
            if (isset($arIdsV[$ar_ids->sid])) #Вот сам массив ID нод
            { #Все подымаем в верхний регистр т.к. пхпморфи работает с ним
                if (isset($arId2Mor[$ar_ids->sid][$arMorphy[mb_strtoupper($ar_ids->word, "UTF-8")]]))
                {
                    $arIdsV[$ar_ids->sid]++;
                }
                else 
                {
                    #Вообщем вот тут идет увлечение релевантности ноды в 10 раз, если она(нода) 
                    #содержит в себе несколько разных слов в любой форме склонения 
                    $arIdsV[$ar_ids->sid] = ($arIdsV[$ar_ids->sid]+1)*10; 
                    #Этот массив будет использоваться только в том случае, если стоит галочка 
                    #искать только те материалы в которых есть все слова из запроса.
                    $arIdAll[$ar_ids->sid]++;
                }
            } else
            {
                $arId2Mor[$ar_ids->sid][$arMorphy[mb_strtoupper($ar_ids->word, "UTF-8")]] = 1;
                $arIdsV[$ar_ids->sid]++;
            }        
        }
    #Если есть галочка искать только те материалы в которых есть все слова    
    if (isset($_GET['all'])) 
    {
        arsort($arIdAll); #Вот тут массив упорядочивается по убыванию веса релевантности нод. 
        $arIdsVAll = array();
        foreach ($arIdAll as $k=>$v)
        {
            if (($v+1) == $vv) #проверяем все ли слова есть в ноде
            {
            $arIdsVAll[$k] = $v;     
            }
        }
        $arIdsV = array_slice($arIdsVAll,0,$limit,true); #Я режу результаты до 50-ти
    }
    else 
    {
        arsort($arIdsV); #Вот тут массив упорядочивается по убыванию веса релевантности нод.
        $arIdsV = array_slice($arIdsV,0,$limit,true); #Я режу результаты до 50-ти
    }
    
#Вот и все мы имеем массив упорядоченный по убыванию веса нод и с ним уже можно делать что угодна. 
#Можно извлекать прям запросом и выводить. Я пошел по не совсем правильному пути и использовал вьюху. смотрим далее
    
    if ($arIdsV)
    {
        $ids = join(',', array_keys($arIdsV));
    
           $v_nprsearch = views_get_view ('nprsearch');
           $v_nprsearch->set_display('default');
        #Отдаю вьюхе ID нод через запятую. и тип материала по которому ищу, либо all если по всем.
           $v_nprsearch->set_arguments(array($ids,$filter));
        #буду выводить только 50, на всякий случай, хотя массив я итак порезал.
           $v_nprsearch->display_handler->set_option('items_per_page', $limit);
        $v_nprsearch->display_handler->set_option('use_pager', false);
        $v_nprsearch->preview();              
           $v_nprsearch->execute();

           if ($v_nprsearch->result) 
            {
                #Вот внимание сами грабли. Отдаю я значить вьюхе ID нод и он по ним выдаем 
                #мне ноды применяя к ним фильтр по типу материала из аргумента. 
                #Использует views их в запросе как where nid in (1,2,3 и т.п.) и соответствено сортировка
                 #то теряется и мне приходиться крутить еще раз два массива. Чтобы востановить искомую сортировку.
                $isset_result = array(); 
                   foreach ($v_nprsearch->result as $v_result)
                {
                    #Берем Ноду и говорим что она есть в фильтре.
                    $isset_result[$v_result->nid] = 1;
                }
                $new_result = array();
                #Крутим наши массив отсортированных нод
                foreach (array_keys($arIdsV) as $pre_ids)
                {
                    #и если нода в нашем массиве, есть в массиве результатов вьюхи 
                    #загоняем её в массив объектов как у вьюхи
                    if (isset($isset_result[$pre_ids])) 
                        $new_result[]->nid = $pre_ids;
                }
                #Подменяем массив уже с нашей сортировкой.
                   $v_nprsearch->result = $new_result;
           
           
                echo "<hr />";
                print $v_nprsearch->render(); #Рисуем вьюху. Вуаля!
                echo "<i>Показано до {$limit}-ти результатов.</i>";
            }
    } else echo "Нет результатов.";
} else echo "Нет результатов.";
} else echo "Введите поисковой запрос.";
?>

Немного о вьюхе.
Она простая до безобразия в аргументах Материала: Nid с функцией “Разрешить несколько терминов в аргументе” и Материал: Тип.
Стиль строки просто материал. по дефолту. можно по полям выводить ели кому надо.
И в фильтрах на Материал Тип чтобы искать только по тому по чему мне надо. Ну вот и все.

Итоги.
Поиск мне в принципе нравиться, еще бы замутить “возможно вы имели ввиду”, если есть орфографическая ошибка в словах.
Поиск я думаю будет весьма неплохой заменой стандартному, на не крупных проектах, у которых нет root доступа к серверу и прочее. виртуальных хостинг короче.
Писав код старался избегать большого количества итераций при вращении циков, использовал isset для проверки в массивах, так как он обращаеться напрямую к ячейке.
Готов выслушать критику и пожелания, дороботать я его всегда рад.

Источник: http://www.drupal.ru/node/89392

Конкурс статей от Template Monster и Drupal Россия


Кому-то друпал нравится, кому-то не нравится. Вот вам конкретно нравится или нет? Так не молчите, скорей напишите об этом! Templatemonster представляет конкурс на лучшие статьи, в которых вы можете рассказать почему Drupal лучшая CMS и почему он kicks you cms’ ass. Друпал не нравится? Ну ок… мы толерантные. Напишите чем он вам не нравится! Денег правда не получите и вообще катитесь куда-нибудь в джумлу. Такие вот простые и равные условия.

Первое место: сертификат, $100, шаблон TM в подарок. Второе место: $70, шаблон TM в подарок. Третье место: $50, шаблон TM в подарок. С четвертого по последнее место: любой из шаблонов категории CMS Drupal в магазине TemplateMonster Russia в подарок.

Срок конкурса до 11/11/12 (до 21/12/12 успеете потратить призовые или порадоваться полученному шаблону). Все подробности >>> http://tmcontest.drupal.ru.

Статью можно разместить где угодно — на своем сайте или на форуме drupal.ru (с тегом “конкурс статей”). Все статьи удовлетворяющие условиям конкурса, независимо от занятого места, гарантированно получат шаблон для друпала от TemplateMonster.

Устроители конкурса:
* templatemonster.com — качественные готовые темы оформления для Drupal и других CMS.
* drupal.ru — это мы.

Информационная поддержка:
* drupalsn.ru — профи друпала объединяются здесь
* drupalogy.ru — только самое красивое на друпале из рунета
* cmsmagazine.ru — лучший инструмент для выбора CMS

UPD

Результаты конкурса

Поздравляем победителей конкурса!
1. http://seodacha.ru/blog/rukovodstvo-drupal-dlya-novichkov
2. http://x-coders.net/new/1589-novichkam-na-polzu-perenos-i-zapusk-sayta-n…
3. http://la.by/blog/cms-drupal-dlya-sozdaniya-internet-portalov

Далее подшивка статей, опубликованных на drupal.ru:

Источник: http://www.drupal.ru/contest/2012/templatemonster

Drupal Cafe’2012 в Москве. Встреча в октябре

Итак, снова планируется провести Drupal Cafe в Москве.

В этом году я побывал на DrupalCamp Kiev, встречался со многими интересными людьми, общался на БОФах и получил несколько полезных подсказок. Опишу некоторые из них и планируемую встречу в октябре. Итак, вот некоторые выкладки – все эти моменты конечно можно обсудить и покритиковать.

1. Мероприятие будет проводиться в один и тот же день месяца.
Я подумал и решил, что самое удобное время для этого – последняя пятница месяца. Почему так? В этот день у большинства офисных сотрудников раньше заканчивается рабочая неделя, что только способствует продуктивному общению. Это также последний будний день перед выходными, когда многие захотят провести время со своими друзьями и родными.

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

3. После проведения DrupalCafe с дискуссиями и чаем-кофе также планируется проводить небольшие посиделки, но уже в более неформальной обстановке.
Как я это вижу – провести 2-3 часа за обсуждениями, затем дойти до ближайшего злачного места и посидеть уже за столиками, употребляя пиво и кушанья. Это будет способствовать более тесному обсуждению некоторых идей – иногда люди в “пылу” дисскусий не всегда приходят к правильной мысли. И за кружкой пива с жареной картошечкой может прийти озарение.
При этом посещение непосредственно DrupalCafe будет бесплатно для всех участников, но вот с пивом и едой в кафе – за свой счет (что заказал, то и оплатил).

4. Настольные игры?

Подвожу итого. В этом месяце, в последнюю пятница октября будет проводится очередное DrupalCafe.
Это будет 26 октября. Ориентировочно начало встречи в 18:00 – 18:30.
Предварительно, встреча пройдет там же, где была в прошлый раз. Напоминаю, что это место находится недалеко от м. Китай-Город, Лубянка, здание по адресу Бол. Спасоглинищевский пер., 8. Называется это “коворкинг GLINE”, произносить как “Глина”. Зайти внутрь через магазин «Этношоп» и турбюро.
Рядом через дорогу есть неплохое место и для неформальных посиделок – клуб “Странное место”.

Чуть позже будет уточнены названия тем для обсуждения, сейчас проводится сбор данных. Предварительно могу сказать, что возможно будет организована видеоконференция с Егором (gor, IT-Patrol inc.) с обсуждением интересной темы.

1 тема для обсуждения – логин пользователей на сайт через социальные сети (внешняя аутентификация). Дисскусию предложил автор модулей uLogin и HybridAuth 7.x-2.x.

Также, у желающих будет возможность высказать свои пожелания по организации подобных мероприятий. Чего вам не хватает, какие возможности хотелось бы иметь под рукой? Например, поступало предложение о создании возможности подписки на новости по мероприятия – возможно у вас что-то еще будет, я с удовольствием готов это обсудить.

Источник: http://www.drupal.ru/node/88919

Drupal Cafe’2012 в Москве. 26 октября, м. Чистые пруды / Тургеневская.

Итак, снова планируется провести Drupal Cafe в Москве.

В этом году я побывал на DrupalCamp Kiev, встречался со многими интересными людьми, общался на БОФах и получил несколько полезных подсказок. Опишу некоторые из них и планируемую встречу в октябре. Итак, вот некоторые выкладки – все эти моменты конечно можно обсудить и покритиковать.

1. Мероприятие будет проводиться в один и тот же день месяца.
Я подумал и решил, что самое удобное время для этого – последняя пятница месяца. Почему так? В этот день у большинства офисных сотрудников раньше заканчивается рабочая неделя, что только способствует продуктивному общению. Это также последний будний день перед выходными, когда многие захотят провести время со своими друзьями и родными.

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

3. После проведения DrupalCafe с дискуссиями и чаем-кофе также планируется проводить небольшие посиделки, но уже в более неформальной обстановке.
Как я это вижу – провести 2-3 часа за обсуждениями, затем дойти до ближайшего злачного места и посидеть уже за столиками, употребляя пиво и кушанья. Это будет способствовать более тесному обсуждению некоторых идей – иногда люди в “пылу” дисскусий не всегда приходят к правильной мысли. И за кружкой пива с жареной картошечкой может прийти озарение.
При этом посещение непосредственно DrupalCafe будет бесплатно для всех участников, но вот с пивом и едой в кафе – за свой счет (что заказал, то и оплатил).

4. Настольные игры?

Подвожу итого. В этом месяце, в последнюю пятница октября будет проводится очередное DrupalCafe.
Это будет 26 октября. Ориентировочно начало встречи в 18:00 – 18:30.
К сожалению, забронировать GLINE не удалось. Мероприятие будет проводиться в месте под названием “[хорошая] республика”, находится она недалеко от м. Чистые пруды или м. Тургеневская.
Как пройти и адрес написан на сайте клуба тут
Дублирую тут на всякий случай
«Адрес: 101000, г. Москва, ул. Мясницкая 13, стр. 20
м. Чистые пруды
1.Последний вагон из центра, выход на Мясницкую улицу (в центр).
2.200 метров пешком по Мясницкой.
3.Свернуть в арку 13 дома с вывеской-стрелкой.
4.Прямо до белого здания и направо.
5.В тупичке — наше желтое здание с вывеской.»
Предварительно, встреча пройдет там же, где была в прошлый раз. Напоминаю, что это место находится недалеко от м. Китай-Город, Лубянка, здание по адресу Бол. Спасоглинищевский пер., 8. Называется это “коворкинг GLINE”, произносить как “Глина”. Зайти внутрь через магазин «Этношоп» и турбюро.
Рядом через дорогу есть неплохое место и для неформальных посиделок – клуб “Странное место”.

1 тема для обсуждения – логин пользователей на сайт через социальные сети (внешняя аутентификация). Дискуссию предложил автор модулей uLogin и HybridAuth 7.x-2.x. – Андрей Березовский.
2 тема для обсуждения – для продвинутых. “Выработка стандартов, рекомендаций и обмена опытом по профессиональной разработке на Drupal (web-разработка)” – Виктор Степаньков.

Также, у желающих будет возможность высказать свои пожелания по организации подобных мероприятий. Чего вам не хватает, какие возможности хотелось бы иметь под рукой? Например, поступало предложение о создании возможности подписки на новости по мероприятия – возможно у вас что-то еще будет, я с удовольствием готов это обсудить.

Источник: http://www.drupal.ru/node/88919

Спецвыпуск журнала Linux Journal о Друпале

Linux Journal’s Special Drupal Issue brought to you by NewRelic
http://www.linuxjournal.com/content/drupal-special-edition
На английском, есть что почитать

Установка с нуля, создание тем, начала программирования, обзор сборок и т.д.

Кстати, сайт журнала на друпале.

Ссылки на прямое скачивание сознательно не размещаю, дабы не провоцировать сам журнал – не зря же они их “скрыли”. Кто ищет – тот найдёт.

Источник: http://www.drupal.ru/node/88806

Кнопка Google+ на drupal.ru


Под нодами на drupal.ru при просмотре их полного вида появилась кнопка g+. Можно голосовать за посты и расшаривать их в Google+. Кнопка реализована модулем http://drupal.org/project/google_plusone. Планируется также добавить кнопку для Facebook. Остальные соцсети идут лесом, хватит этих двух. Или не хватит?

Чего не понял, так это как в параметрах гугловского JS уточнять, какой блок текста брать за дексрипшн для расшариваемой статьи? Т.к. не всегда оно берет текст ноды, иногда промахивается и захватывает текст комментария. А картинку к ноде упорно тащит из левой колонки сайта, а там сейчас висит баннер IT patrol (то-то Гор порадуется).

Очень короткий FAQ

Q. Я ненавижу соцсети и не хочу видеть эту кнопку.
A. Решается плагинами в броузере — см. советы тут http://habrahabr.ru/post/136009/ (thx bdagames за хабрассылку).

Источник: http://www.drupal.ru/node/88746

[Решено][Ссылка] Настройка резервного копирования: Amazon S3 и Drupal

Привет!

По мотивам обсуждения вот тут, я решила написать как легко и просто можно настроить резервное копирование на облака Амазон С3.

Пошаговый гид на моем блоге

Источник: http://www.drupal.ru/node/88733

Drupal Party или посидим поболтаем, Москва, 13 октября, суббота, 14:30, Елки-палки, м. Охотный ряд

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

Встреча пройдет в кафе Елки-палки возле м. Охотный ряд. Адрес Тверская ул., 5/6 – пересечение с Никитским переулком. Карта нарисована тут
Столик забронирован на имя Алексей, начиная с 14:30.

Источник: http://www.drupal.ru/node/88656

Сообщество в Питере

Здравствуйте, друзья!


Некоторое время назад мы с Александром всерьез решили организовать Drupal сообщество в Санкт-Петербурге.

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

В наших и ваших силах это исправить.

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

Приглашаем поучаствовать в опросе и присоединиться к нашей затее!

Подробная информация на главной странице сайта.

Источник: http://www.drupal.ru/node/88641

Обзор модулей

Бывает периодически нахожу очень полезные модули, которые многим давно уже известны… и думаю… почему же мне они не попадались раньше… Многие из перечисленных ниже модулей давно всем известны… но думаю кто-то всё-таки сможет найти что-то новое и полезное для себя. Все модули актуальны для Drupal 7 и используются периодически мною.

Разработка и обслуживание

Хорошая административная тема – Rubik Супер административное меню – Administration menu Удобный просмотр модулей – Module Filter Отобразить список изменений, внесённых каждым модулем на сайте – ModuleInfo Автоперевод интерфейса сайта и модулей – Localization update Отображать время до завершения режима разработки – Maintenance Countdown Сделать сайт доступным только для чтения – Read only mode Резервное копирование – Backup and Migrate Авто-генерация html-версий страниц – Boost Автоматически обновить сгенерированную модулем Boost html-страницу после редактирования материала – Boost Expire Автоматически сортировать и переименовывать загружаемые файлы – File (Field) Paths Отключить загрузку любого CSS-файла, генерируемого любым модулем (в том числе модулем ядра) – Disable css files

Юзабилити и упрощение интерфейса

Скрыть системные сообщение для определённых ролей – Disable Messages Отображать системные сообщения в виде уведомлений во всплывающих подсказках – Purr Messages Отображать системный статус посредством Ajax – System Status AJAX Сделать поля форм компактнее – Compact Forms Кнопка “Наверх” при прокручивании страниц – Back To Top Добавить классы odd / even к строкам таблиц – Table Alternate Rows Авто-включение добавления ссылок материалов в меню – Auto Menu Title Удобное добавление ссылок на сайте – Linkit (для корректного отображения адресов ссылок требуется модуль pathologic, после установки нужно включить в форматах текста фильтр pathologic) Удобное добавление изображений на страницы – Insert. В топку IMCE и elFinder! Удобный предпросмотр страниц – Page preview Удобное добавление видео с youtube на сайт – Googtube

СЕО

Подтвердить права на управление сайтом – Site Verification Автогенерация xml карты сайта для поисковых систем – XML sitemap Добавить мета теги к страницам – Meta tags (quick) (позволяет добавлять тип поля “Meta” для типов материала) Настроить заголовки для страниц – Page Title Убрать продублированные адреса страниц – Global Redirect Настройка автогенерации псевдонимов url-адресов – Pathauto Красивые адреса для административных страниц – Sub-pathauto (Sub-path URL Aliases) Автоматическая транслитерация адресов страниц и загружаемых файлов – Transliteration Спрятать email адреса со страниц от спам-ботов – Invisimail Отчищать поле пароля в форме авторизации – Clear saved password field Сделать CSS классы, генерируемые ядром системы короче – Fences

Источник: http://www.drupal.ru/node/88424

Алматы Друпал-кафе 6

Привет, алматинские друпалеры!

7го сентября будет очередное Друпал-кафе в нашем городе!

В этот раз планируем совместно рассмотреть:
1. Модули по SEO – Hossein J. Saroui
2. GIT и Features- Айрат ‘Dakanca’
3. И модули Drupal Commerce и Rules – Арман ‘Zil’

Детали здесь.

До встречи! : )

Источник: http://www.drupal.ru/node/88317

Почему я участвую в выборах Drupal Association

Как вы, наверно, знаете, в этом году Drupal Association во второй раз проводит открытые выборы в совет директоров.
(если еще не знаете, самое время зайти на https://association.drupal.org/nominations)
Голосование начинается завтра, 24 сентября, и продолжится 2 недели.

Update: Линк для голосования https://association.drupal.org/vote2013

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

Участие в выборах – это редкая возможность сформулировать свое видение будущего сообщества, и как пути решения хотя бы части проблем. Попробуем вырваться из ежедневной рутины и необходимости зарабатывать деньги, деньги и еще раз деньги (блин!)?

Возьмем одну из самых острых проблем Друпала – дефицит кадров. Существует ли она? или

«не существует дефицита кадров. Существует пропасть между тем, где живут кадры, и где их ищут заказчики»

Я подписан на добрую дююжину рассылок, связанных с поиском работы.
И знаете что? Большая часть постов и ответов к ним напоминает разговор двух глухих. Одни и те же компании (из условных Нью-Йорка, Лондона и Мюнхена) ищут работников, и одни и те же компании (из условных Одессы, Хайдарабада и Нью-Дели) предлагает себя в качестве подрядчика.
Поскольку сообщения повторяются, я делаю вывод, что работники и работодатели друг друга не находят.

Причин масса – и разница в часовых поясах, и плохое (зачастую) знание английского языка, и разная ментальность.
Конечно, все эти причины не присущи исключительно Друпалу, но для Друпала ситуация усугубляется относительно высоким входным техническим барьером.

Я вижу решение в создании гибрида компании-разработчика, Друпал-академии и агенства по найму.
Поскольку единственный известный мне способ овладеть технологией (и Друпал тут не исключение) – это сделать с ее помощью что-то реальное, упомянутый гибрид должен работать с реальными проектами, и платить сотрудниками реальную зарплату. Возможно, меньшую чем средняя на рынке, но тем не менее.
Единственная попытка действовать в этом направлении, которую я знаю – это Acquia U, но она рассчитана только на жителей США.
Мне же кажется, что нужно действовать на рынках, богатых талантами, но относительно “оторванных” от основных денежных потоков – в первую очередь, Восточная Европа, Индия и Китай.

Это непростая задача. Поддержка Drupal Association могла бы дать толчок – и в виде информационной поддержки, и как “гарант качества обучения”. Польза для ассоциации и сообщества тоже очевидна – увеличение количества людей, профессионально занимающихся Друпалом.
И да – мне нужна ваша поддержка.
Процесс простой – в любой день, начиная с завтра, заходите на https://association.drupal.org/nominations, логинитесь с вашим именем пользователя drupal.org (аккаунт должен быть зарегистрирован до 31 августа 2012), и участвуете в голосовании.
За кого я предлагаю голосовать, надеюсь, понятно
Искренне ваш,

Источник: http://www.drupal.ru/node/88228

[Состоялась] 25 сентября встреча друпалеров в Кирове

Знакомый организует небольшую встречу друпалеров в Кирове.

Кому интересно – отписывайтесь http://kirovnet.ru/forum/index.php?topic=795322 и присоединяйтесь

//Цитата ON

Привет тебе, читающий эту тему.

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

Что?
Буду регулярно проводить в Кирове встречи, подобные DrupalCafe.

Зачем?
Хочу поделиться знаниями с начинающими и не только. Новые люди, новые знакомства, новые интересы. Just for fun

Где?
Предлагаю собраться во вторник, 25 сентября, в кафе Ботаник, с 17.30 до 19 часов (время/место обсуждаемо).

Для кого?
Если ты начинающий в сайтостроении – приходи, я умею понятно и просто объяснять сложные вещи.
Если ты используешь другой инструмент (Bitrix/Umi/Netcat/MODx/Yii/Symfony) – приходи, обсудим плюсы и минусы.
Если ты уже используешь Drupal, то мы точно найдем о чем поговорить.

Кратенько о себе:

5 лет работы с друпалом (начинал с версии 4.6, помню что такое флексиноды, товарищей акселя, вадбарса, и разгонку)
Дофига знаний о contrib-модулях. Галереи изображений, гостевые, форумы, WYSIWYG, Commerce-инетмагазин, импорт/экспорт инфы, и прочая-прочая.
Работал в drupalhosting.ru (IT-Patrol) – домены, хостинг, DNS, перенос сайтов, drush, highload, sphinxsearch, оптимизация, поднятие из бэкапов, поиск ошибок, и т.п.
Участвовал в DrupalCamp.
Сейчас работаю по удаленке на московскую фирму, пишу модули на заказ.

Сфера нынешних интересов: деплой и автоматический перенос сайтов (aegir, vagrant, drush), тестирование (simpletest / selenium), RESTful API, анализ на уязвимости.

P.S. приветствуется репост, ретвит, и прочие способы сарафананного радио и сообщения своим друзьям об этом мероприятии.
Крайне желательно отписаться в этой теме о том, что придете (а также сообщить свой уровень знаний, чтобы я подготовил интересные темы).

//Цитата OFF

Источник: http://www.drupal.ru/node/88068

Изменить ( любой ) или ( все ) в select.

Допустим Вам надо изменить ( любой ) или ( все ) не на всем сайте, а только в одном месте.
Всё очень просто.
В Вашей теме создаете файл template.php

<?php
function phptemplate_select($element){
    // Выбираем нужный нам select
    if( $element['#name'] == 'field_sanuzel_value_many_to_one')
        // меняем All option в select
        $element['#options']['All'] = 'Неважно';
    // для примера меняем Any
    $element['#options']['Any'] = 'Неважно';
    dpm( $element );
    // отправляем измененный select дальше на рендринг
    return theme_select($element);
}
?>

Допустим Вам надо изменить ( любой ) или ( все ) не на всем сайте, а только в одном месте.
Всё очень просто.
В Вашей теме создаете файл template.php

<?php
function phptemplate_select($element){
    // Выбираем нужный нам select
    if( $element['#name'] == 'field_sanuzel_value_many_to_one')
        // меняем All option в select
        $element['#options']['All'] = 'Неважно';
    // для примера меняем Any
    $element['#options']['Any'] = 'Неважно';
    dpm( $element );
    // отправляем измененный select дальше на рендринг
    return theme_select($element);
}
?>

Не забудьте правильно изменить условия (if) и оставить либо измененный All или Any.
P.S. если что-то не получается используйте Devel

<?php
function phptemplate_select($element){
    dpm( $element );
    return theme_select($element);
}
}
?>

Источник: http://www.drupal.ru/node/88049

Ищу идеи статей для перевода

Есть свободное время. Могу перевести статьи/мануалы/ и тд. Жду ваших предложений

Источник: http://www.drupal.ru/node/88039

Правильное скругление углов для браузеров не поддерживающих border-radius в CSS

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

В статье описывается как грамотно скруглять углы для браузеров, которые не поддерживают CSS свойство border-radius. “Правильно” в данном контексте значит не перегружая код страницы дополнительными элементами.

Способ повторяемый, т.е. скрипт можно использовать как универсальный для любого сайта, без изменения верстки самого сайта.

Рекомендуется базовые знания html + javascript.

Ссылка на статью “Скругление углов без CSS и border-radius“

Источник: http://www.drupal.ru/node/88019

Модуль “Подача данных счётчика воды”

Добрый день!

Предлагаю на всеобщее обозрение свой модуль.

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

Использование – городские сайты, сайты ТСЖ, управляющих компаний.

Возможности:

Предосталяет форму для заполнения данных счётчика воды (адрес http://ваш-сайт/water-meter) Отправляет форму на указанный email Сохраняет запись в логах Позволяет настраивать email, на который отправляются данные Позволяет просматривать логи отправки в админке

Установка

Установите модуль Настройте email, на который будут отправляться данные на странице admin/config/water-meter

Исходники
https://github.com/vitalyzhakov/water-meter

Демо
http://test.vnytve.ru/water-meter

Буду рад конструктивным замечаниям.

Возможна платная доработка под ваш сайт (пишите в личку).

Источник: http://www.drupal.ru/node/87844

Typo — Drupal 7 модуль для борьбы с опечатками на сайте

Разработал новый модуль для Drupal 7, который позволяет пользователю выделить мышью найденную в тексте опечатку и нажатием Ctrl + Enter отправить сообщение о ней администратору сайта. Модуль не зависит от внешних сервисов типа Орфуса и тесно интегрирован с популярными модулями Друпала такими как Rules, Token, Views и Views bulk operations.

Интеграция с модулями Rules и Token, позволяет, например, настроить отправку сообщений о найденных ошибках по е-мейлу, в системный журнал или вызвать любое другое действие, доступное в модуле Rules. С помощью токенов [typo:url], [typo:text] и [typo:comment] в текст сообщения можно включить информацию об опечатке.

Интеграция с Views позволяет сделать вывод списка ошибок на странице, в комплекте с модулем уже идет настроенное представление, а интеграция с Views bulk operations позволяет удалять из этого представления обработанные сообщения.

По умолчанию, все сообщения старше 3 дней автоматически удаляются, но это действие можно отключить в настройках модуля.

Popup-окно с формой отправки опечатки выводится модулем Ctools и его вид может быть изменён как правкой CSS-файла, так и правкой соответствующего tpl-файла. Ctools — это единственная зависимость модуля, остальные модули (Rules, Views, etc) нужны только если вы хотите использовать соответствующий функционал.

Скачать модуль можно на странице проекта: http://drupal.org/project/typo.

Испытать этот модуль вы можете на моем сайте, список отправленных отчетов об опечатках доступен всем посетителям здесь: http://romka.eu/typo-reports (на реальном сайте доступ к этому представлению анонимам лучше не давать).

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

P.S.

Встроенная в модуль вьюха по пока непонятной мне причине по умолчанию возвращает ошибку 404 после активации, чтобы избавиться от ошибки необходимо зайти в настройки вьюхи и пересохранить её.

Источник: http://www.drupal.ru/node/87839

Drupal поиск по русски

Представляю Вашему вниманию свой велосипед для поиска на русском языке в Drupal 7

Хотя я и являюсь сторонником поиска на Sphinx, однако не у всех есть возможность его использовать в силу тех или иных причин.

За основу был взят модуль search_api_db и приделан русский стемминг от Котерова.
Получился поиск, использующий БД и умеющий искать по части слова.

Что такое Search API?

Проект Search API реализует АПИ, который позволяет создать на сайте поиск по любым объектам Друпала, используя любые типы поисковых систем.

Для управляющего сайтом, этот модуль очень удобен тем, что он содержит поддержку и возможность использования модуля Views для показа результата поиска, настройки фильтров и так далее. Кроме того, интеграция с Apache Solr позволяет использовать на сайте эту очень быстродействующую поисковую систему.

Для разработчика, этот модуль очень удобен своей гибкостью и бесчисленными способами расширения возможностей. Растущее количество дополнительных модулей (смотрите список ниже), даёт возможность подробно настроить различные аспекты поиска.

Подробнее про Search API можно почитать тут

Спасибо за тестирование Георгию.

Багрепорт приветствуются. Спасибо.
Оригинал и страница для загрузки тут.

Источник: http://www.drupal.ru/node/87754

Схема БД Drupal 7

Время от времени задают вопрос “где увидеть схему таблиц и отношений БД друпала?”, а вот оно на drupal.org: http://drupal.org/files/er_db_schema_drupal_7.png Разумеется это только схема для модулей ядра.

Ссылку на схему на Google+ выложил Kostas Silas, новость тут.

Перетащил на drupal.ru, пусть себе хранится.

Прикрепленный файл Размер er_db_schema_drupal_7.png 1.87 Мб

Источник: http://www.drupal.ru/node/87080

Модуль фильтра таксономии для Views по типу Hierarchical Select

Модуль добавляет к Views фильтр таксономии с ajax. Т.е. как и Hierarchical Select – зависимые селекты, по одному на каждый уровень словаря таксономии. Работает с включенным ajax для представления, но не работает с включенным autosubmit в настройках стилей Exposed Form.

UPDATE: теперь работает в сочетании сам с собой. То есть можно добавить ещё точно такой же фильтр, но с другим словарем. Будет два на форме.

Демо: http://howtog.ru

Кому нужен, пишите в личку или в аську (в профиле).

Кто знает нормально работающий вариант такого фильтра — пишите здесь.
(Проблемы работы Hierarchical Select и Views навскидку: http://www.drupal.ru/node/71636 и http://www.drupal.ru/node/78019, ну и конечно http://drupal.org/node/1170192)

Источник: http://www.drupal.ru/node/87068

[СНИППЕТ] Drupal Commerce упрощенная корзина

Понадобилось сделать корзину в commerce попроще.

Вид типа N товаров – N руб

В template.php

<?php
function simple_commerce_cart() {
  global $user;

  $order = commerce_cart_order_load($user->uid);
  if(!empty($order)) {
    $wrapper = entity_metadata_wrapper('commerce_order', $order);
    $line_items = $wrapper->commerce_line_items;
    $total = commerce_line_items_total($line_items);
    $currency = commerce_currency_load($total['currency_code']);
    $quantity = commerce_line_items_quantity($line_items, commerce_product_line_item_types());
    $summ = commerce_currency_format($total['amount'], $total['currency_code']);

    print "{$quantity} товаров - {$summ}";
  }
  else {
    print "Ваша корзина пуста";
  }
}
?>

Вызываем где надо

<?php
          // Вывод упрощенной корзины. template.php
          print simple_commerce_cart();
?>

Собственно темезировать можно как надо. Это просто вывод текста.

Источник: http://www.drupal.ru/node/86922

Решение auto_nodetitle warning

Модуль Automatic Nodetitles нужен для автогенерации заголовков нод (пожалуйста)

Но при его использовании раз от раза материал отказывается сохранятся, выдавая:

Warning: htmlspecialchars() [function.htmlspecialchars]: Invalid multibyte sequence in argument в функции check_plain() ... PDOException: в функции drupal_write_record()

В issue проблема решается добавлением в модуль дополнительных функций экранирования и подмены.

Но мне это не помогло. Даже на основе текста без спецсимволов, заголовок иногда генерировался, иногда нет.

Решением стало замена substr на drupal_substr в функции auto_nodetitle_set_title

<?php
// Ensure the generated title isn't too long.
  $node->title = drupal_substr($node->title, 0, 255);  
?>

До кучи, в модуле Overlay для вывода названия редактируемой ноды зачем-то установлено:

#overlay-titlebar { white-space: nowrap; }

благодаря чему название выводится в одну строку (а это 255 символов), и вся страница растягивается до неприличия, поэтому в теме админки стоит это перекрыть

#overlay-titlebar { white-space: normal; }

пост на друпал.орг

update:

mb_substr заменен на drupal_substr добавлен патч

спасибо InternetDevels.com!

Прикрепленный файл Размер multibyte_substr.patch 604 байта

Источник: http://www.drupal.ru/node/86872

Drupal Cafe’2012 в Москве. 10 сентября 2012 г

Несмотря на всякие невзгоды и взгоды я продолжаю традицию проведения мероприятий DrupalCafe в городе Москва.

В этот раз мероприятие планируется провести 10 сентября, вечером, с 19 часов.

Интерактивная игра на Drupal. Антон Житарёв ( NaZg). Что же такое современный хостинг? Егор Марценюк, основатель компании IT-Patrol inc. Обсуждение инициатив Российской Друпал-ассоциации

Самое главное – в этот раз на мероприятии будет сюрприз. В качестве гостя и докладчика будет присутствовать человек-загадка. Этот человек достаточно известен в Drupal-сообществе, в том числе и среди русскоговорящих. Но самое интересное – наяву этого человека в России не видели уже несколько лет, даже те, кто с ним работает. И это при том, что так или иначе он со своим проектом влияет на подавляющее большинство участников российского Drupal-сообщества!!! У посетителей DrupalCafe 10 сентября будет шанс увидеть воочию этого человека, пообщаться с ним, узнать последние новости, а также сможет задать животрепещущие вопросы

Судя по всему сюрприз оказывается не сюрприз. Все уже догадались, что человек-закадка – это Егор

Место проведения находится недалеко от м. Китай-Город, Лубянка, здание по адресу Бол. Спасоглинищевский пер., 8.
Называется это “коворкинг GLINE”, произносить как “Глина”. Зайти внутрь через магазин «Этношоп» и турбюро.

Напоминаю свой номер телефона +79191049873, Алексей.

Источник: http://www.drupal.ru/node/86780

Видео курс: Drupal 7 Панели

Начал новый видео-курс по модулю Панели (Panels).
Он еще в разработке, но базовые вещи моменты уже показал.
Приятного просмотра!

Источник: http://www.drupal.ru/node/86762

[РЕШЕНИЕ] Вставить exposed фильтры в collapsible fieldset

Надо было сделать exposed фильтры во views скрывающимися. Видел в сборке Drupal Commons такое. Простой перенос tpl и css практически ничего не дал – там Drupal 6? то одно не работало, то другое.
Решения под Д7 не нашёл в одном месте (или плохо искал?). Собрал по крупицам:

Перетащить views/theme/views-exposed-form.tpl.php в тему и изменить к виду:


<?php
/**
 * @file views-exposed-form.tpl.php
 *
 * This template handles the layout of the views exposed filter form.
 *
 * Variables available:
 * - $widgets: An array of exposed form widgets. Each widget contains:
 * - $widget->label: The visible label to print. May be optional.
 * - $widget->operator: The operator for the widget. May be optional.
 * - $widget->widget: The widget itself.
 * - $sort_by: The select box to sort the view using an exposed form.
 * - $sort_order: The select box with the ASC, DESC options to define order. May be optional.
 * - $items_per_page: The select box with the available items per page. May be optional.
 * - $offset: A textfield to define the offset of the view. May be optional.
 * - $reset_button: A button to reset the exposed filter applied. May be optional.
 * - $button: The submit button for the form.
 *
 * @ingroup views_templates
 */
?>
<?php 
// Add collapsible fieldset js if it is not already included
drupal_add_js('misc/drupal.js');
drupal_add_js('misc/form.js');
drupal_add_js('misc/collapse.js');
?>

<?php if (!empty($q)): ?>
  <?php
    // This ensures that, if clean URLs are off, the 'q' is added first so that
    // it shows up first in the URL.
    print $q;
  ?>
<?php endif; ?>
<fieldset class="views-exposed-form collapsible collapsed">
<legend><span class="fieldset-legend"><?php print(t("Filter")); ?></span></legend>
  <div class="views-exposed-widgets fieldset-wrapper clearfix">
    <?php foreach ($widgets as $id => $widget): ?>
      <div id="<?php print $widget->id; ?>-wrapper" class="views-exposed-widget views-widget-<?php print $id; ?>">
        <?php if (!empty($widget->label)): ?>
          <label for="<?php print $widget->id; ?>">
            <?php print $widget->label; ?>
          </label>
        <?php endif; ?>
        <?php if (!empty($widget->operator)): ?>
          <div class="views-operator">
            <?php print $widget->operator; ?>
          </div>
        <?php endif; ?>
        <div class="views-widget">
          <?php print $widget->widget; ?>
        </div>
      </div>
    <?php endforeach; ?>
    <?php if (!empty($sort_by)): ?>
      <div class="views-exposed-widget views-widget-sort-by">
        <?php print $sort_by; ?>
      </div>
      <div class="views-exposed-widget views-widget-sort-order">
        <?php print $sort_order; ?>
      </div>
    <?php endif; ?>
    <?php if (!empty($items_per_page)): ?>
      <div class="views-exposed-widget views-widget-per-page">
        <?php print $items_per_page; ?>
      </div>
    <?php endif; ?>
    <?php if (!empty($offset)): ?>
      <div class="views-exposed-widget views-widget-offset">
        <?php print $offset; ?>
      </div>
    <?php endif; ?>
    <div class="views-exposed-widget views-submit-button">
      <?php print $button; ?>
    </div>
    <?php if (!empty($reset_button)): ?>
      <div class="views-exposed-widget views-reset-button">
        <?php print $reset_button; ?>
      </div>
    <?php endif; ?>
  </div>
</fieldset>
?>

Т.е. в tpl добавляется подключение js, fieldset, legend span, fieldset-wrapper в div.

Добавить CSS:

fieldset.views-exposed-form:after { clear: both; content: "."; display: block; height: 0; visibility: hidden; } html.js fieldset.views-exposed-form { margin: 18px 0; } html.js fieldset.collapsible { position: relative; } html.js fieldset.collapsible .fieldset-wrapper { overflow: visible; } fieldset.views-exposed-form { border: 1px solid #CCCCCC; clear: both; overflow: visible; padding: 0; }

CSS пока не чистил, возможно он избыточен, перетаскивал через firebug.

Использовано:
Частично Drupal Commons тема commons_roots
разбор кода misc/collapse.js
http://drupal.org/node/321779 – отличия от D6 в span.fieldset-legend и span.fieldset-wrapper
http://api.drupal.org/api/drupal/includes!form.inc/function/theme_fieldset/7#comment-13859 – подключение form.js

Источник: http://www.drupal.ru/node/86736

Предлагаю рейтинговую систему на сайте

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

Источник: http://www.drupal.ru/node/86649

Алматы Друпал-кафе 5

Привет, друпаллерам в Алматы,

2го сентября будет проходить очередное Друпал-кафе. Начиная с этой встречи мы снижаем частоту встреч до одного раза в месяц.

Темы, которые будут подниматься на встрече:
1. Работа с Git – ведет Виктор ‘Frio’
2. Субдомены с модулем Domain Access – ведет Арман Зил

Возможно, еще будут предложены дополнительные темы.
Если также вы хотите поделиться по какой-либо теме – предлагайте в комментах.

Детали встречи здесь.

Источник: http://www.drupal.ru/node/86446

Drupal Night, ночной кодспринт

Рад сообщить что за неделю до Kiev Drupal Camp 2012, на выходных, пройдет “Drupal Night”!

Что же это такое?

Это серия код – спринтов, которые будут проводиться ночью, под руководством отличных тимлидов!

Код – спринт пройдет одновременно в крупных городах Украины!

Почему ночь? на основании голосования никто не мешает ночью, т.к все нормальные спят) личный график лишь немного меняется в Америке тем временем день, значит комиты будут быстрее проходить + обратная связь будет быстрее! После спринта группа экспертов рассмотрит все работы и определит победителей, которые получат призы на киевском друпал-кэмпе 2012. Кроме того все участники расширят свои профили на drupal.org за счет комитов. Цели мероприятия: сделать лучше drupal! собрать команды разработчиков – единомышленников для продвижения украинского сообщества на drupal.org. познакомиться/повеселиться

Дата – в зависимости от региональных команд (см. таблицу команд)

Если ты хочешь:

сделать drupal лучше, активно интересуешься его развитием, или хочешь улучшить профиль на drupal.org, или поучаствовать в командной работе, или еще миллион причин (нужное допиши сам:),

то ждем тебя на предварительной встрече с 19 по 25 августа (обсуждения даты и места в facebook группе, вся информация на оф.странице http://camp12.drupal.ua/ru/news/ey-drupaler-privet в таблице городов).

Регистрация на код-спринт и предварительную встречу ЗДЕСЬ!

Источник: http://www.drupal.ru/node/86434

Views API. Описание своих таблиц.

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

Полная статья »

Источник: http://www.drupal.ru/node/86430

Доступна версия Acar корзины для Drupal 6 – Ubercart 2

Acar – AJAX корзина для Ubercart.

Краткий перечень возможностей:

• Темизация 100% html, никаких ограничений.
• AJAX добавление из формы добавления.
• AJAX удаление из корзины, и из формы добавления.
• AJAX изменение количества из корзины, и из формы добавления.
• AJAX изменение атрибутов помещенных в корзину продуктов.
• Отображение в корзине какой либо вашей информации.

Сайт: http://arpiprogrammer.ru

Источник: http://www.drupal.ru/node/85810

Сделаем PHP лучше!

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

Смысл обращения такой, перевожу:
Я предлагаю ввести новые методы для типов данных ядра PHP таких как arrays, strings, floats и т.д. Например, было бы супер круто писать что-то как например:

<?php
[1, 2, 3]->sort()
"Hello, World"->lowercase()->ucfirst() etc.
?>

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

Спасибо!

Update: последние новости по теме – эта issue обсуждалась разработчиками PHP ядра и в результате все свелось к тому, что для таких изменений нужно вводить соответствующее предложение по API, был сделан акцент на том, что введение примитивных объектов позволило бы разработать новое чистое API. Однако есть такие вопросы семантического (смыслового) характера, такие как вопрос обработки массива, который сейчас передается в функции по значению, объекты же передаются по ссылке.
Это пока все что удалось узнать.

Источник: http://www.drupal.ru/node/85798

Настройка отправки email для Drupal сайтов

Написал небольшой перевод статьи по простой настройке отправки email для Drupal сайтов. Для отправки можно использовать уже имеющийся аккаунт например на Gmail.

Источник: http://www.drupal.ru/node/85737

Пейнтбол, Москва, 25 августа. Мероприятие удачно проведено.

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

О желании участвовать можно написать в комментариях к топику или в личку.
Дата проведения – 25 августа, суббота.

Игра будет проводится в пейнтбольном клубе возле м. Митино. От метро туда добраться можно на общественном транспорте, несколько остановок на автобусе от м. Митино, Тушинская или Сходненская. Схема и описание, как добраться тут.
Игра будет проводиться на Рублевке.
Для автолюбителей описание тут.
Самый оптимальный способ добраться своим ходом – на электричке с Белорусского вокзала до станции Перхушково, затем на автобусе 56 до деревни Дарьино.
Расписание электричек, другие варианты маршрутов по версии Яндекс.Карты

Добраться туда можно в любое время, но желательно с утра. Клуб начинает работу в 9 утра. Игровые промежутки – с 9 до 14 и с 16 до 21 вечера. Специально для нас будет установлен навес (только наш), под которым можно будет присесть отдохнуть, попить воды и т.п.

Немного подробностей, по мере развития темы все будет уточнятся и дополнятся:

Игра проводится в Москве, поэтому актуально в первую очередь для проживающих в Москве и ближайшем подмосковье; Изначально игра планировалась как батл между web-разработчиками Drupal, Joomla и др. Но в процессе обсуждения стало понятно, что такого скорее всего не получится по причине неравномерного и малого количества людей. Поэтому будет привлекаться некоторое количество людей “со стороны” для сглаживания разницы между командами. Соответственно каково это соотношение выйдет на самом деле – не могу сказать. Проведение игры (базовый комплект, защитная одежда и маркер, некоторое количество шаров) оплачивается частным спонсором. Конечно же не откажемся и от другого возможного спонсора – это поможет организовать мероприятие более качественно, ярко и массово. Если кто-то психологически не готов участвовать бесплатно или есть насущная потребность в оплате дополнительного оборудования – пишите мне, я готов лично озвучить сумму, которая требуется за игру с одного игрока. Также желающие могут помочь в организационном плане – скорее всего на месте проведения мероприятия будет куча народу и понадобится некий администратор, который сможет помочь направить в нужном направлении участников игры (скорее всего будет выделена отдельная беседка, где можно посидеть отдохнуть). Планируется записать видео процесса игры, это будет участник игры со специальной видеокамерой, снимет на память весь процесс В зависимости от количества игроков будем играть в том или ином игровом поле (их 4 штуки разных), посмотреть описание и фото можно тут Обращаю внимание, что базовый комплект не входит обувь – желательно взять с собой сменную обувь. Также учитывайте, что там будет возможность принять душ – так что можно взять полотенце и отмыться после беготни

Контакты для связи – личка тут на drupal.ru или e-mail info@drupalcafe.ru

UPD 8.08.2012: бронь оформлена, 25 августа с утра (клуб начинает работу с 9 утра, играть можно с 9 до 14 и потом продолжить после 16 до 21). добавил описание площадок
UPD 21.08.2012: по техническим причинам изменилосьместо проведения, вместо Митино будет проводиться на Рублевке,
Поправил информацию, как добраться

Источник: http://www.drupal.ru/node/85701

Синхронизация Drupal с 1С

Предисловие
Здравствуйте. Я решил затронуть давно избитую но не добитую тему синхронизации 1С и Друпала. Я во многих форумах читал насчет реализаций, на сайте drupal.ru помню даже тема была, с докладом о данной синхронизации. Но честно сказать везде рассказывали о том, что им удалось реализовать, но подробности никто не рассказывал. Потом я нашел еще несколько тем где была описана реализации, но если честно метод меня огорчил, реализация была выполнена на уровне БД. Данный метод меня не обрадовал, т.к. требовалась тонкая настройка самой программы 1С, а в моем случае нужно было написать синхронизацию, которую можно было настроить с помощью бесплатного модуля 1С: Предприятие 8.х – синхронизация с веб сайтом, который был разработан для CMS 1C Bitrix.

Не давно у меня появился проект, В котором нужно было реализовать синхронизацию с 1С. И сразу же нагрянул второй проект, где нужно было реализовать данный функционал. Т.к. мои поиски готовых решений не завершились удачей, я решил написать свой модуль, которая реалищует синхронизацию. Модуль сейчас готов, и пока что он “подточен” под конкретные проекты, но я не исключил возможность расширения для глобального использования. В этой статье я попрбую описать основные принципы и проблемы, которые я решил в процессе, пока писал модуль.

Я не профессиональный блогер, и навыков писать красивые статьи нет. Писал ночью. В связи с чем могут быть некоторые неувязки, обещаю исправить если найдутся ошибки=) прошу строго не судить, а вот критику и красивых решения хотелось бы почитать.
Читать весь материал

Источник: http://www.drupal.ru/node/85567

DrupalCamp Kyiv 2012

Уважаемые друзья!

Спешим сообщить о наближающемся ДрупалКемпе в Киеве. Он будет проведен 14-15 сентября в i-Klass’е. Официальный сайт события http://camp12.drupal.ua/

В этом году мы планируем собрать около 400 участников и провести порядка 40 докладов. На данный момент уже подано 30 докладов (и их колличество растет с каждым днем).

Список поданых докладов доступен http://camp12.drupal.ua/uk/program/session

Надеемся увидеть Вас на кемпе и конечно же послушать Ваши доклады!

С уважением,
Юрий Герасимов

Источник: http://www.drupal.ru/node/85517

Алматы Друпал-кафе 3

Привет, алматинские друпаллеры!

Собираемся уже в третий раз на Друпал-кафе : )
Теперь будем обсуждать:
1. Друпал SEO – ведет Айрат “dakanca”
2. И продолжим спринт-код – ведет Виктор “frio”

Встреча будет 5-го августа в 16:00.
Место здесь. Детали здесь.

До встречи!

ПС. Сорри, что так объявляю всего за пару дней… были сложности с местом проведения.

Источник: http://www.drupal.ru/node/85513

[модуль] Добавление ссылки на сайт в скопированный текст

Настало время для очередного модуля.

На этот раз под прицел попал функционал добавления в скопированный текст ссылки на сайт, откуда этот текст скопировали. Подробно этот функционал обсуждался на хабре без малого два года назад; нашей задачей было внедрить это на Forbes.ru. Так родился модуль Add link to copied text.

Модуль предоставляет админку для настройки всех параметров плагина jQuery addtocopy + добавляет стили, чтобы сделать эту “добавочную стоимость” невидимой. Конечно же, код модуля следует стандартам кодирования и рекомендуемым практикам – поэтому нужно поместить код jQuery плагина в “sites/all/libraries/addtocopy”.

Спасибо!

Attached poll “Дайте совет автору ”.
Register or login to poll
Results:
пеши исчо!: 19 голосов
проще засунуть это в тему!: 0 голосов
давай, до свидания!: 3 голоса

Источник: http://www.drupal.ru/node/84860

Второе Друпал-кафе в Алматы!

Привет, алматинские друпаллеры!

Собираем уже второе Друпал-кафе в нашем городе!
На этот раз помимо знакомства, деления идеями и совместной трапезы у нас будет:

1. Валентина “Geldora” Боровая поделится с нами опытом о том, как работать с Drush!
2. И Виктор организует спринт-код по разработке одного из наиболее востребованных модулей для друпаллеров Казахстана.

Время: в 16:00 в Вск, 22 июля 2012.
Место: Проходить мастер-классы будут в социальном клубе “Баттлер”.
Он находится на ул. Фурманова 193, выше пр. Абая, ниже ул. Сатпаева, выше Французского дома, под магазином Монами.

Детали и обсуждение здесь.

Источник: http://www.drupal.ru/node/84772

[УРОК] Создаём товары атрибутами и учим правильно считать

Создание атрибутов товара в UberCart 3

Задача: создать товар, стоимость которого в зависимости от атрибутов будет меняться в ту или другую сторону.

Нам понадобится:
- Drupal 7
- Ubercart 3.1
– включённый под-модуль uc_attribute

Термины и определения
Класс товаров – товары, объединённые в одну смысловую группу.
Атрибут – свойство товара
Опция атрибута – состояние, которое может принимать атрибут

Описание проекта.
У нас есть небольшой сайт, торгующий пепелацами. Пепелац в базовой комплектации стоит 1000 у.е. Запас гравицапы на день, неделю или месяц 500/700/1000 у.е. соответственно Скрипач умеющий играть или нет 300/500 у.е. Пачка КЦ 750 у.е. и доп-опция – выбить у пепелаца окно или два, что снизит стоимость на 300/500 у.е.

Реализация
Создадим класс товаров «пепелац» идём admin/store/products/classes и заполняем там форму

Теперь создадим атрибут «гравицапа». Идём в управление атрибутами (для этого нам и понадобился включенный под-модуль) admin/store/products/attributes и жмём «Add an attribute» admin/store/products/attributes/add
Создадим атрибут гравицапы

А теперь добавим опции для этого атрибута.

Что должно получиться

Аналогично со скрипачом.

Теперь разберёмся с выбитыми окнами

Обратите внимание на отрицательную цифру, это снижает итоговую стоимость и даёт ту самую скидку.

И в итоге

Теперь включим опцию свойства товаров, для показа итоговой цены с учётом атрибутов. Идём admin/store/settings/products пункт «Atrtribute settinngs» и устанавливам переклюк на «Display total price»

Теперь, когда мы создали класс товара и необходимые атрибуты и опции к ним, нам необходимо всё это связать. Переходим в управление классами товара admin/store/products/classes и в редактирование нашего класса «пепелац» admin/store/products/classes/pepelac/edit перейдём на вкладку атрибуты admin/store/products/classes/pepelac/attributes и добавим атрибуты для этого класса admin/store/products/classes/pepelac/attributes/add

Не обращайте внимания на то, что не отмечено галками, это от другого проекта

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

И в корзине

Посчитаем
Базовая стоимость 2000 минус 300 за одно выбитое окно плюс 1000 месячный запас гравицапы и плюс скрипач без музыкального слуха за 300. Итого 3000.
Получите, распишитесь.

Спасибо за внимание.

Источник: http://www.drupal.ru/node/84707

Заказ в один клик с помощью комментариев

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

Что делаем:

1. К комментарию добавляем текстовые поля “Количество товара”, “Телефон”, “ФИО” (покупателя). В D6 через модуль  nodecomment, D7 – в ядре.

2. На странице товара темизируем кнопку “Добавить комментарий”, как “Быстрый заказ”. Хотя можно и через перевод интерфейса

3. Сами комментарии делаем по умолчанию не опубликованными, чтобы пользователь мог их оставлять, но не мог видеть. С помощью Rules можно настроить, чтобы покупателю, после заказа-комментария выдавалась информация типа “спасибо за заказ, мы вам перезвоним”. Ну и чтобы админу на почту приходила инфа о новых комментариях.

4. Все комментарии-заказы сводим на одну страницу для админа.

Это все (!) что делал я на момент поста.

Что можно еще сделать:

* Вывести создание комментария-заказа в всплывающее окно.

* Добавить разные статусы заказа через селект лист.

* Может быть и калькуляцию стоимости заказа в зависимости от количества прикрутить. Главное как-то передать значение цены родительской ноды.

В общем ограничено только фантазией разработчика.

Источник: http://www.drupal.ru/node/84512

выкладываю модуль UC Attribute Options Access

Всем привет =)
На днях написал модуль, который позволяет определять через роли доступ к опциям атрибутов товара уберкарта.
На drupal.org уже выложил, модуль там сейчас проверяется, а так же делюсь им с русскоговорящим сообществом.
Модуль прост в использовании, позволяет определять как глобальные параметры доступа, так и перезаписать эти параметры для каждого отдельного товара.

В общем, пользуйтесь на здоровье, о ошибках сообщайте – буду править.

Прикрепленный файл Размер uc_attribute_options_access-6.x-1.0.zip 9.13 кб

Источник: http://www.drupal.ru/node/84379

Модуль {syntaxhighlighter} to PRE Converter

Выложил для общего пользования модуль для замены {syntaxhighlighter} тега на <pre> в нодах.

Такая замена может понадобиться при апгрейде Drupal 6 сайта, в котором используется Syntax highlighter модуль, до Drupal 7.

Далее подробности..

Когда я обновлял свой сайт до Drupal 7, столкнулся с тем, что 7-ая ветка модуля Syntax highlighter не подсвечивала примеры кода, которые были включены в мои статьи.

Syntax highlighter в Drupal 6 поддерживал 2 вида тегов:

HTML тег <pre>
<pre class=”SYNTAXHIGHLIGHTER-OPTIONS”>
program code

</pre> Специальный тег {syntaxhighlighter}
{syntaxhighlighter SYNTAXHIGHLIGHTER-OPTIONS}
program code

{/syntaxhighlighter}

Дело в том, что ранее я использовал {syntaxhighlighter} тег, но в Drupal 7 он не поддерживается модулем Syntax highlighter.

Пришлось своим скриптом конвертировать старые теги на <pre> с сохранением всех атрибутов, таких как: язык программирования, размер шрифта и других.

В процессе работы над этой задачей был создан довольно простой модуль {syntaxhighlighter} to PRE Converter, который, на мой взгляд, может быть полезен сообществу.

Пользуйтесь на здоровье и оставляйте комментарии.

Источник: http://www.drupal.ru/node/84358

Первое ‘Drupal-cafe’ в Алматы! : )

Поскольку на Друпал.ру тусуется немало друпаллеров из Казахстана, думаю, это объявление будет уместным и здесь

Мы задумали собраться, познакомиться, поделиться идеями и поговорить о сообществе Друпал в Казахстане.
Приглашаются все друпаллеры от начинающих до маэстро!

Формат встречи не официальный.
Дата и время: 07/07/2012 – 16:00.
Место: ресторан “Дастархан” на Наурызбай Батыра 122/124 (угол Шевченко), г. Алматы.

Детали здесь.

Источник: http://www.drupal.ru/node/83906

Видео-курс по Представлениям (Views)

Недавно закончил очередной видео-курс для начинающих друпаллеров, в этот раз – по модулю Представления (Views).
Добро пожаловать, как говорится: http://podrupalim.com/kursy ))

Источник: http://www.drupal.ru/node/83872

Модуль Simple Search

Доброе время суток, уважаемое сообщество!

Хочу поделиться своей разработкой. Я прошерстил http://drupal.org/project/modules и пользовался поиском на этом сайте, но ничего подобного не нашел. Надеюсь я не изобрел велосипед.

Не секрет, что стандартный поиск в Drupal 7 имеет много недостатков, например он не умеет искать по части слова. Если я хочу найти упоминание о постановлениях (постановление, постановления) и напишу постановлени, то стандартный поиск не найдет ничего! Если написать просто Пост, то стандартный поиск также не найдет ничего связанного с постановлениями. Исходя из этого и было принято решение написать свой модуль поиска. Его достоинства это:

Поиск по любой части слова Поиск по заголовкам материалов Поиск по содержимому материалов Поиск по именам прикрепленных файлов Наличие блока поиска Простота и минимализм (для сравнения: код модуля search около 210кб, код моего модуля – 11 кб, функционал практически идентичный)

Из недостатков стоит отметить:

Отсутствие прав доступа (искать на сайте могут все) Отсутствие темизации Поиск НЕиндексируемый, ищет прямо в базе. На моем сайте, где ~2000 нод, ~1000 файлов поиск занимает меньше секунды При использовании Simple Search нужно отключать стандартный модуль Search

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

Прикрепленный файл Размер simplesearch.tgz 3.41 кб

Источник: http://www.drupal.ru/node/83705

Импорт/обновление большого количества материалов по Cron без использования Batch API и Drupal Queue

Часто бывает необходимо импортировать или обновить большое количество материалов на сайте. Чтобы все модули отработали правильно, необходимо сохранять ноды с помощью функций node_submit и node_save.
К сожалению, в этом случае, время выполнения скрипта будет довольно большим по сравнению с непосредственной записью в базу данных.

Для того, чтобы разбить процесс обработки данных на части, и чтобы скрипт не вылетал по тайм-ауту придумали Drupal Batch API. Великолепная идея, но у нее есть один минус – оно требует присутствия человека. Т.е. операцию необходимо запустить из браузера, и браузер должен быть открыт во время всего процесса выполнения. Что же делать, если нам нужна обработка по Cron?

Самый простой способ без использования каких-либо наворотов.

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

2. В модуле по hook_cron вызываете функцию импорта/обновления, после чего удаляете обработанные строки временной базы данных.

Единственный минус такого решения – чем больше у вас данных, тем чаще необходимо запускать Cron, а это не всегда приемлемо.

Кто знает более простое решение – милости прошу в комменты.

Оригинал живет здесь

Источник: http://www.drupal.ru/node/83513

Ajax Nodeloader (D6, D7) – модуль для загрузки материалов с помощью AJAX

Модуль Ajax Nodeloader позволит вам:

Загружать и показывать страницы Drupal (node) с помощью AJAX Использовать произвольные css-селекторы для отображения вашего контента (title, body и т.д.) Загружать и отображать любые поля (node fields) для Drupal 7 Отслеживать посещения ваших AJAX-ссылок с помощью Google Analyitcs (требуется установленный Google Analytics) (опция) Использовать расширенную навигацию на основе HTML5 history API или хэш-тэгах (для устаревших браузеров) (опция) Динамически изменять заголовок браузера (опция)

2. Частые вопросы по использованию модуля.

Домашняя страница: http://www.denry.ru/drupal-ajax-nodeloader/
Частые вопросы: http://www.denry.ru/programmirovanie/662-ajax-nodeloader-f-a-q-ru/

3. Загрузка

Существует несколько способов скачать этот модуль:

1. Скачать файлы .zip с github.com

7.x-1.x.zip

6.x-1.x.zip

2. или клонировать исходный код модуля с drupal.org

Версия для Drupal 7:

git clone –branch 7.x-1.x http://git.drupal.org/sandbox/nick-denry/1447152.git ajax_nodeloader
cd ajax_nodeloader

Версия для Drupal 6:

git clone –branch 6.x-1.x http://git.drupal.org/sandbox/nick-denry/1447152.git ajax_nodeloader
cd ajax_nodeloader

или github.com

git://github.com/nick-denry/Ajax-Nodeloader.git

Внимание! Ajax Nodeloader — это проект с открытым исходным кодом, однако в настоящий момент код является экспериментальным и проходит проверку на drupal.org (en).

AJAX nodeloader на drupal.org:
http://drupal.org/sandbox/nick-denry/1447152

AJAX nodeloader на github.com:
https://github.com/nick-denry/Ajax-Nodeloader

В настоящее время модуль получил статус “reviewed & tested by the community”, но пока все еще явяется экспериментальным.

Источник: http://www.drupal.ru/node/83485

[модуль] по созданию хлебных крошек для любых страниц в Drupal 7

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

Почему надо использовать именно мой модуль:

1. Можно добавлять статическую страницу и задать хлебные крошки только для неё.

2. Можно добавить динамическую страницу (например, node/%node). В этом случае в навигационных ссылках можно будет использовать токены для замены.

3. Модуль не привязан ни к нодам, ни к вьюсам, ни к панелям и т.д. (в отличие от других модулей для хлебных крошек). Всё, что ему необходимо – это URL, на котором будет выведены навигационная линейка.

4. Имеются правила показа хлебных крошек. Это значит, что для одной и той же страницы могут показываться разные хлебные крошки! Например, можно показать одну навигацинную линейку для анонимов, а другую – для остальных пользователей. Если же взять пример для материалов – то можно показывать хлебные крошки в зависимости от типа материала, его статуса, значений полей и многого другого.

5. Есть возможность отключить хлебные крошки для любой страницы и включить их позже.

6. Поддержка мультиязычности: все заголовки хлебных крошек можно перевести.

7. Возможность указать хлебную крошку без ссылки (т.е. просто текстовую).

8. Удобный интерфейс.

9. Теперь все хлебные крошки хранятся в одном месте и действительно работают.

Почитать более подробно и со скриншотами можно у меня в блоге. Ссылка на сам модуль –  Path breadcrumbs.

Источник: http://www.drupal.ru/node/82925

Paste Format – чистка вставляемого текста

По следам успеха модуля uLogin (3 месяца после создания – 500+ сайтов используют на данный момент), про который я уже рассказывал на страницах drupal.ru, хочу рассказать о другом проджекте, который направлен лицом к пользователям – Paste Format.

Модуль решает проблему копирования/вставки текста из всяких “умных” источников (продукты от MS, с других сайтов, ещё откуда-то с “продвинутым” форматированием) – а именно проблему того, что копируется и вставляется различный “мусор”, который вам совсем не нужен в вашем контенте и, кроме этого, ломает ваши шрифты и стили. Да, при отображении контента это всё можно вырезать, используя формат ввода с нужными фильтрами; НО при этом весь этот мусор сохраняется в БД, подгружается при редактировании контента, ломает стили отображения текста в вашем визуальном редакторе, ваши авторы придумывают мифы и другую “ахинею”, что вот при редактировании текст такой, а при отображении все ломается, сайт глючит и так далее. На что тех персонал им обычно отвечает, что вы сами мол “уроды”, копируете текст хз откуда, вы должны писать его сразу в визуальном редакторе на сайте или вставлять через спец кнопочку, которая убивает все форматирование… или вообще включает принудительную чистку форматирования при вставке. В общем, ситуация не из приятных

Именно для решения этой проблемы и был написан модуль Paste Format (сейчас работает только в тандеме с CKEditor, как через отдельный модуль для этого редактора, так и через модуль WYSIWYG). Он позволяет отфильтровать вставляемый текст одним из форматов ввода, настроенном на вашем сайте в админке Друпала. То есть никаких регэкспов вам писать не надо, тем более на джаваскрипте

Установка проста – скачать, распаковать, включить. Создать _отдельный_ формат ввода, в котором включить и настроить фильтры, которые будут вычищать ненужный вам маркап (здесь на помощь придут модули WYSIWYG Filter, HTML Purifier, htmLawed и другие) – и настроить Paste Format использовать именно его (иначе будет использоваться формат ввода по умолчанию). Раздать пермишен на использование этого модуля тем ролям, которые создают/редактируют контент на сайте (этот пермишен защищает аяксовый колбек, который и производит фильтрацию вставляемого текста). Включить плагин Paste Format в нужных профилях редактора CKEditor.

Технически модуль вешается на событие вставки текста в визуальный редактор, посылает этот текст на сервер и вставляет уже обработанный текст. При этом вы сами управляете тем, какой маркап оставлять, а какой вычищать – просто настраивая фильтры обработки текста в админке Друпала.

Надеюсь, я ясно изложил позицию, для чего именно и почему был написан такой модуль (и в комментариях не будет разводиться флейм, что вот у CKEditor есть своя собственная чистка при вставке и так далее – на это могу сказать, что вы сами не контролируете, что именно и как вычищает CKEditor (и по моему опыту он может что-то оставлять, убирая что-то нужное – а поправить это я не могу ); а с этим модулем все находится под вашим полным контролем).
Также надеюсь, что данный модуль поможет улучшить юзер экспириенс авторов контента и отношения между ними и разработчиками/администраторами сайта.

Спасибо!

Источник: http://www.drupal.ru/node/82923

Модуль оплаты RBK Money для Drupal Commerce

Предлагаю к тестированию модуль оплаты RBK Money для Drupal Commerce. Инструкция по настройке в архиве, отзывы и предложения приветствуются.

Прикрепленный файл Размер commerce_rbkmoney.zip 13.38 кб

Источник: http://www.drupal.ru/node/82880

Модуль кросс-постинга материалов в сервис Я.ру для Drupal 6

Данный модуль предназначен для кросс-постинга материалов Друпал-сайта в сервис Я.ру (по аналогии с VKontakte CrossPoster и LiveJournal CrossPoster).

На нынешний момент модель позволяет кросс-постить материалы только на личную страницу сервиса Я.ру.

Работать с модулем достаточно просто и функционал его пока достаточно простой, так что быстренько рассмотрим основные моменты:

Заливаем файлы модуля в папку ./sites/all/modules и включаем его на странице модулей. Никаких зависимостей у него нет, так что все должно быть нормально в процессе установки; Далее, переходим на страницу admin/settings/yaruxp и смотрим на поля, которые необходимо заполнить; Перво-наперво нужно зарегистрировать модуль как приложение на специальной странице Яндекса: https://oauth.yandex.ru/client/new. После регистрации Вам станут доступны идентификатор клиента и секретный идентификатор; Вставляем доступные значение в соответствующие поля на странице admin/settings/yaruxp. Также, не забываем вписать свой логин на сервисах Яндекса; При первом нажатии на кнопку сохранения настроек модуля, Вы будете перенаправлены на специальную страницу Яндекс, на который будет нужно разрешить доступ приложения к требуемой ему информации и при помощи который будет сформирован токен, нужный для авторизации на сервисе. После всех манипуляций Вы будете перенаправлены на страницу настроек модуля; Теперь можно настроить взаимодействие модуля с материалами сайта.

Ссылка на репку: https://github.com/LordotU/drupal_6_yaruxp

Источник: http://www.drupal.ru/node/82817

Конкурс модулей для Друпал от Яндекса

Компания Яндекс при участии Российской Друпал Ассоциации объявляет конкурсы на разработку модуюдей для Друпал, содержащие технологии Яндекса. Принять участие может любой совершеннолетний человек — как один, так и в составе группы. Сегодня мы объявляем два конкурса:

Конкурс Яндекс.Вебмастер
Мы ожидаем, что участники конкурса разработают модуль, который упростит владельцу сайта на Друпал подключение своего сайта к Яндекс.Вебмастеру с помощью API, а также будет отображать некоторые отчеты непосредственно в административной части сайта. Подробная информация и схема подключения к Яндекс.Вебмастеру описана в технических требованиях. Подробные условия конкурса читайте в Положении о конкусре.

Разработчик лучшего модуля получит 35 000 рублей (до вычета налогов).

Техническая поддержка разработчиков осуществляется в клубе сервиса. Общие вопросы по конкурсу вы можете задавать по адресу business@yandex-team.ru.

Участники конкурса по Яндекс.Вебмастеру:
Дмитрий, модуль Yandex.Webmaster
Shok211, модуль Yatools
Andyceo, модуль Yandex.Webmaster.

Конкурс Яндекс.Карты
Мы ожидаем, что участники конкурса разработают модуль, который позволит владельцу сайта на Друпал разместить на своем сайте карту с помощью API Яндекс.Карт и разметить ее необходимой информацией. Подробности описаны в технических требованиях. Условия конкурса читайте в Положении о конкусре.

Разработчик лучшего модуля получит 35 000 рублей (до вычета налогов).

Техническая поддержка разработчиков осуществляется в клубе сервиса. Общие вопросы по конкурсу вы можете задавать по адресу business@yandex-team.ru.

Участники конкурса по Яндекс.Картам:
Алиев Али, модуль yandex_map
InternetDevels, модуль Yandex Map
Anonym-tsk, модуль yamaps
Yusoft, модуль unimaps

Срооки проведения конкурсов
Сроки проведения для всех конкурсов (Вебмастер и Карты) одинаковые:

прием конкурсных работ – с 4 июня по 15 июля (включительно); оценка конкурсных работ и выбор победителя – с 16 июля по 30 июля; объявление победителя – с 31 июля по 2 августа; награждение победителей – с 2 августа по 2 сентября.

Как подать работу на конкурс
1. Выложить модуль на github.com;
2. Написать письмо по адресу business@yandex-team.ru, в котором указать:

название модуля; описание функциональности модуля, его отличительные черты, описание процедуры установки и поддерживаемые версии Drupal; ссылку на модуль на github.com; свой логин на drupal.ru (если работаете группой, то логины всех участников); свою фамилию, имя, отчество и возраст (если работаете группой, то ФИО и возраст всех участников), фактический адрес проживания; контактный телефон и адрес электронной почты.

После этого мы опубликуем имя участника (исключив персональные данные) и информацию о его работе в данной теме.

Как оцениваем результаты?
Оценка работ будет проходить в два этапа. На первом этапе конкурсные работы будут оценивать эксперты из участников русскоязычного сообщества Друпал, которых для нашего конкурса собрала Российская Друпал Ассоциация. Комиссия оценит качество кода, соответствие его принципам разработки под Друпал, а также функциональность и соответствие интерфейсов требованиям.

На втором этапе конкурсные работы будут оценивать сотрудники Яндекса — на предмет качества использования API сервисов Яндекса.
Невыполнение обязательных требований не позволит претендовать на победу в конкурсе.

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

Победителем конкурса будет признан участник, который создал модуль, корректно использующий API Яндекса, а также набравший наивысшую оценку у экспертной комиссии.

Экспертная комиссия
Со стороны сообщества Друпал в комиссию вошли:
Артем Паньков
Анна Федорук
Александр Графов
Виктор Степаньков
Роман Архаров
Андрей Постников

В комиссию не входил, но помогал Вячеслав Касихин.

И еще
Информация о наилучших, по мнению Яндекса, работах будет представлена на сайте business.yandex.ru. Эти работы будут предлагаться пользователям Яндекса.
Ну и, конечно, все участники конкурса получат памятные сувениры.

Удачи!

Ответы на вопросы
Q: Один разработчик (группа) может участвовать сразу в двух конкурсах?
A: Да, может.

Q: Я нахожусь не в России (я не гражданин России), могу ли я участвовать?
A: Да. Мы понимаем, что в русскоязычном сообществе Drupal присутствуют участники не только из России, поэтому предусмотрели такую возможность.

Q: Зачем вам так много информации об участниках?
A: Для идентификации победителя. Чтобы мы точно знали, что человек, который к нам придёт за получением приза, — автор конкурсной работы.

Q: Я не один, со мной ещё работает команда, мы можем участвовать?
A: Да, командой участвовать можно. Но и приз тогда делить на всех

P.S. Если что-то забыл написать, спрашивайте в комментариях.

Источник: http://www.drupal.ru/node/82785

Руководство пользователя по работе в админке drupal 7


Здравствуйте, уважаемое сообщество.
Нами подготовлено Руководство пользователя по работе в админке drupal 7, мануал в виде серии уроков именно для владельца сайта, которому нужно овладеть приемами управления его сайтом на седьмой версии drupal.
Надеемся оно будет полезно и будущим и теперешним владельцам сайтов на данной отличной CMS а также веб-мастерам, которые заинтересованы в том, чтобы их клиенты научились самостоятельно решать тривиальные админские задачи.

Источник: http://www.drupal.ru/node/82391

[Модуль] для создания сложных expose фильтров для Drupal 7

Модуль чтобы строить фильтры типа:

как пользоваться тут

Прикрепленный файл Размер advanced_filter.zip 3.17 кб

Источник: http://www.drupal.ru/node/81885

PhPStorm 4 стал поддерживать Drupal’овский стиль кода из коробки

Мелочь, а приятно черт возьми =)

Ссылка на офф. сайт

Источник: http://www.drupal.ru/node/81772

Процесс создания темы для D7 адаптируемой к разным разрешениям


На сайте CMS Magazine перевод статьи “Create a responsive Drupal theme” о создании темы оформления для D7 адаптируемой к разным разрешениям экрана. По-моему полезная статья. Отдельное спасибо сотрудникам CMS Magazine за адекватный перевод.

Ссылка на перевод статьи: http://www.cmsmagazine.ru/library/items/cms/create-responsive-drupal-theme/

Источник: http://www.drupal.ru/node/81409

Drupal Cafe’2012 в Москве. Май, вторая встреча

Итак, настала пора планировать следующее мероприятие.

Ориентировочно пройдет оно в том же помещении, что и первая встреча – антикафе Бабочки.
По датам предварительно ориентируюсь – 16, 17, 23 или 24 мая (дату еще корректирую в зависимости в том числе и от ваших замечаний).
По времени с 19 до 23.

Темы для обсуждения выложу чуть позже, если предложите что-то интересное – велкам!

Источник: http://www.drupal.ru/node/80987

Acar – AJAX cart for Ubercart

сайт временно недоступен…

закачка внизу…

Введение.

Модуль Acar позволяет манипулировать содержимым корзины ubercart. Это всевозможные поля и кнопки, для отображения и изменения параметров, помещенных в корзину продуктов.
Все манипуляции, над содержимым корзины осуществляются мгновенно, согласованно с сервером через AJAX. Без перезагрузки страницы.
В отличии, от стандартной корзины ubercart, мы не ограничены одной формой корзины, на её странице. С помощью Acar, можно создать сколько угодно, форм корзины, где угодно, в любом месте документа.
Acar корзину можно темизировать. Придавая ей, уникальный вид, по всем правилам html. Тем самым реализуя, любые дизайнерские задумки.

Использование.

Для работы модуля Acar, необходим модуль Mvca. Этот модуль является отдельным проектом, и реализует собой MVC паттерн. Скачать оба модуля можно с официального сайта Acar корзины.
Сразу после установки, форма корзины, доступна в двух местах. На своей собственной странице /acar. И на стандартной странице корзины ubercart, в виде дополнительной панели. Настроить панели, можно в настройках ubercart /admin/store/settings/cart/panes. Обе эти формы темизируется шаблоном из файла acar_pane.tpl.php.
Ещё одна форма корзины доступна как блок. Который необходимо предварительно активировать. А темизируется она, шаблоном из файла acar_bloc.tpl.php.
Для добавления продукта в корзину, со страницы продукта, а так же со страницы каталога имеются специальные field и views поля: “Acar – Form add product to cart”. Позволяющие создать форму добавления. Для этих полей в настройках, необходимо самостоятельно указывать используемый файл шаблона. Он может быть любым, но по идеи это должены быть файлы acar_adde.tpl.php для field поля, и acar_view.tpl.php для views поля. Для управления field полями в типе материала необходимо включить модуль Field UI.
Поиск файлов шаблонов, осуществляется в каталоге текущей темы оформления. Если какой либо из них, там отсутствует, то берётся файл шаблона с тем же именем из каталога модуля Acar.
В модуле Acar, в каталоге samples, вы можете найти несколько образцов шаблонов. Чтобы приступить к темизации Acar корзины, нужно скопировать файлы шаблонов, в каталог темы оформления, вместе со всеми прилагаемыми к ним файлами картинок и стилей. И уже там, изменяя их, придавать корзине требуемый вид.

Темизация.

Файл шаблона, темизирующий форму корзины или форму добавления, представляет из себя, самый обыкновенный html. Где внутри скриптовых элементов, размещается html код шаблонов, в целом и отвечающих за темизацию.
А именно, это так называемый шаблон список <script class="$lis" type="text">, и шаблон пункт <script class="$ite" type="text">. На основе этих шаблонов конструируется форма корзины или форма добавления.
Шаблон список – это шаблон своего рода ёмкости для продуктов, и необходим исключительно для формы корзины. В то время как шаблон пункт – это шаблон отдельного продукта, и применяется как для формы корзины, так и для формы добавления.
При темизации формы корзины, что бы было понятно, в какой именно элемент корзины вставлять продукты, этот самый элемент, в шаблоне список, следует пометить классом $$par. Однако если требуется вставлять продукты не внутрь элемента, а перед каким либо элементом, то такой элемент следует пометить классом $$chi.
Для наделения, какого либо элемента способностью отображать или изменять параметры продукта или корзины, этот самый элемент необходимо оснастить соответствующим функционалом. Осуществляется это за счет передачи через атрибут class функционала, который необходимо внедрить в элемент.
Оформляется подобное внедрение внутри атрибута class, следующим образом:
@fun(arg0,arg1,arg2,...)
В начале, символ ‘@’, далее идентификатор функции, после него, в скобках перечисляются аргументы. Избегайте использования пробелов, вместо них лучше использовать юникод пробел ‘\u0020′.
Например, следующий input элемент, размещённый в шаблоне пункта, при помощи функции qty, позволит отображать и изменять количество продукта.
<input class="@qty(true)" type="text"/>
Эту функцию, как и любую другую, можно применить к любому элементу, например к div. Количество продукта будет так же отображаться, но изменить его, по понятным причинам уже не получится.
<div class="@qty(true)"></div>
Для отображения и изменения параметров корзины или продукта, предоставлено множество функций. В один элемент может быть внедрено сразу несколько функций, однако будьте внимательны, комбинации некоторых функций могут перекрывать работу друг друга, хотя и не вызовут ошибок.

Функции.

Функция img.
@img(exe = true) <span></span> $ite
Выводит изображение продукта.
exe – Условие использования*.
Функция tit.
@tit(exe = true) <a></a> $ite
Отображает название продукта как ссылку.
exe – Условие использования*.
Функция qty.
@qty(exe = true) <input type="text"/> $ite
Отображает и изменяет количество продукта.
exe – Условие использования*.
Для формы добавления, эта функции позволяет не просто изменить количество продукта, но и добавить или удалить продукт из корзины.
Функция qtc.
@qtc(exe = true, qtc = 1) <input type="button"/> $ite
Изменяет количество продукта при щелчке, на определенную величину.
exe – Условие использования*.

qtc – Величина на которую следует менять количество продукта.
Применяется, как правило, к элементу кнопки. Для формы добавления, эта функция не просто изменяет количество, но и когда это имеет смысл, добавляет или удаляет продукт из корзины.
Особенностью данной функции, как и некоторых других предназначенных специально для кнопок, является обработка события нажатия. При котором фоновое изображение, сдвигается вниз и вправо на 1 пиксель, когда кнопка нажата.
Функция pri.
@pri(exe = true, sig = false, frm = false) <input type="text" readonly/> $ite
Отображает стоимость одного экземпляра продукта.
exe – Условие использования*.

sig – Знак валюты*.

frm – Формат числа*.
Функция tot.
@tot(exe = true, sig = false, frm = false) <input type="text" readonly/> $ite
Отображает стоимость количества продукта.
exe – Условие использования*.

sig – Знак валюты*.

frm – Формат числа*.
Функция abs.
@abs(exe = true, sig = false, frm = false) <input type="text" readonly/> $ite $lis
Отображает общую стоимость всего содержимого корзины.
exe – Условие использования*.

sig – Знак валюты*.

frm – Формат числа*.
Эта функция может быть использована как в шаблоне пункт, так и в шаблоне список, так как её работа никак не связана с каким-то конкретным продуктом.
Функция tra.
@tra(exe = true, tra = undefined) <input type="button"/> $ite $lis
Осуществляет переход при щелчке, на страницу продукта или по указанному адресу.
exe – Условие использования*.

tra – Адрес для перехода.
Если адрес для перехода не указан, переход осуществляется на страницу продукта.
Прежде чем выполнить переход функция ожидает завершения всех текущих операций, добавления, удаления, и изменения, запущенных до данной функции. И только после этого осуществляется переход на другую страницу.
Если к элементу применяется несколько функций, эту функцию очень важно размещать последней. Иначе переход может осуществиться, а последующие функции просто не успеют сделать свою работу.
Функция atr.
@atr(exe = true, cla = Acar.Atri.Atri, sty = undefined) <span></span> $ite
Выводит атрибуты продукта.
exe – Условие использования*.

cla – Класс, определяет способ вывода атрибутов.

sty – Стиль*, применяемый к атрибутам.
Используется в форме добавления, для настройки атрибутов добавляемого продукта, а в форме корзины для изменения атрибутов продукта. Так же позволяет просто отображать значение атрибутов в виде списка. Определяется это классом.
Доступно два класса:
Acar.Atri.Atri – Позволяет настраивать атрибуты, так же как и в стандартной форме добавления.

Acar.Atri.Imge – Выводит описание значений атрибутов в виде списка.
Стиль, применяемый к атрибутам, устанавливает для элементов составляющих атрибуты значение их css-стиля, класса, и атрибутов. Тем самым, позволяя темизировать атрибуты.
Для обоих классов имеется соответствующий каждому стандартный стиль. И если не указывать какой-то конкретный стиль, к атрибутам будет применён стандартный стиль соответствующий классу.
Стили для класса Acar.Atri.Atri:
Acar.Atri.Atri.Sty.Def – Стандартный стиль, используется по умолчанию.
Стиль для класса Acar.Atri.Imge:
Acar.Atri.Imge.Sty.Def – Стандартный стиль, используется по умолчанию.

Acar.Atri.Imge.Sty.Min – Красивый стиль с мелкими буквами.
Функция sty.
@sty(exe = true, sty) <div></div> $ite $lis
Накладывает на элемент указанный стиль.
exe – Условие использования*.

sty – Стиль* применяемый к элементу.
Функция dis.
@dis(exe = true) <div></div> $ite $lis
Позволяет если нужно скрывать или отображать элемент, в зависимости от условия использования.
exe – Условие использования*.
Если условие использование истинно элемент отображается, так же как и всегда. Если же ложно, элемент скрывается. Отображение и скрытие элемента осуществляется за счет изменения css свойства display.
Это может быть очень полезно, если необходимо отображать те или иные html блоки в зависимости от значения, каких либо параметров.
Конечно, аналогичную работу можно было бы организовать и при помощи функции @sty, однако индивидуальная функция для такой полезной работы куда более актуальна.
Примеры:
Отобразить надпись если у продукта есть атрибуты.
<div class="@dis('atr')">У этого продукта есть атрибуты!!!</div>
Отображение надписи говорящей о том есть ли в корзине текущий продукт. Подобную конструкцию имеет смыслы использовать в форме добавления. Каждый раз при добавлении или удалении продукта надпись будет меняться.

<div class="@dis('inc')">Продукт добавлен в корзину.</div> <div class="@dis('exc')">Продукт отсутствует в корзине.</div>

Функция con.
@con(exe = true, exp, obj = undefined) <span></span> $ite $lis
Выполняет javascript выражение, и результат его работы устанавливает для элемента как контент (textContent).
exe – Условие использования*.

exp – Javascript выражение.

obj – Область видимости.
Позволяет выполнить любой javascript код, результат работы которого будет установлен для элемента как контент, методом textContent. Если это input элемент, будет установлено значение атрибута value.
Благодаря области видимости obj, можно установить в рамках какого объекта, будет исполняться указанный javascript. Что осуществляется при помощи инструкции with.
Передавая в качестве области видимости null, javascript код исполняется в рамках объекта window, т.е. стандартным образом.
Если не указывать область видимости, в качестве неё будет использован объект ресурсов соответствующий текущему продукту или корзине, что зависит от шаблона $ite или $lis.
Это позволяет вывести значение любого ресурса.
Функция htm.
@htm(exe = true, exp, obj = undefined) <div></div> $ite $lis
Выполняет javascript выражение, и применяет результат его работы к элементу как html (innerHTML).
exe – Условие использования*.

exp – Javascript выражение.

obj – Область видимости.
Эта функция работает аналогично функции @con, с той лишь разницей, что позволяет установить html, для элемента методом innerHTML.
*Условие использования.
Аргумент условие использования, передается абсолютно во всех функциях. С его помощью, можно настроить при каких обстоятельствах следует внедрять функцию в элемент.
Это либо логическое значение. Либо строка содержащая в себе javascript выражение. Результат работы которого и определяет следует ли применять к элементу данную функцию.
Исполняется подобный javascript, в области видимости текущего вида, из которого доступны следующие переменные булевого типа:
add – Истинно если это форма добавления.

car – Истинно если это форма корзины.

inc – Подтверждает наличие продукта в корзине.

exc – Подтверждает отсутствие продукта в корзине.

atr – Подтверждает наличие у продукта атрибутов.
Но если строка javascript выражения заканчивается символом ‘;’, то этот самый javascript исполняется в области видимости объекта ресурса, соответствующего текущему продукту или корзине.
Это очень удобно так как позволяет в зависимости от наличия, отсутствия, или значения того или иного ресурса, применять или не применять функцию к элементу.
Примеры:
Что бы в форме добавления, элемент имел различную раскраску в зависимости, от наличия продукта в корзине, нужно использовать две функции @sty, каждая из которых срабатывает при различных обстоятельствах.
<div class="@sty('inc','background:#faa;') @sty('exc','background:#05f;')">***</div>
Вывод надписи в зависимости от значения ресурса, в данном случаи если цена больше 50. Обратите внимание, здесь аргумент условие использования заканчивается символом ‘;’, благодаря чему выражение просчитывается в области видимости объекта ресурсов.
<div class="@con('Pri>50;','\'Этот_продукт_дороже_50\'',null)></div>
*Знак валюты.
Аргумент знак валюты используется в функциях вывода стоимости.
Если это false знак валюты не выводится, если true выводится знак валюты настроенный в ubercart.
Если же, в качестве знака валюты передается массив. То первый аргумент определяет собственно знак валюты в виде строки, а второй аргумент его расположение, в виде логического значения, слева или справа, от цены.
Примеры:
Вывод общей стоимости всех продуктов, без знака валюты.
<input class="@abs(true,false,false)" readonly/>
Со знаком валюты настроенным в ubercart.
<input class="@abs(true,true,false)" readonly/>
Наш вариант, где знак валюты ‘Руб.’ и расположен он справа от цены.
<input class="@abs(true,[\'Руб.\',true],false)" readonly/>
Сам по себе знак волюты можно достать из ресурсов корзины, из свойства Acar.Reso.Lis.Cur.Sig. А что бы его вывести, можно воспользоваться функцией @con.
<span class="@con(true,Acar.Reso.Lis.Cur.Sig,null)"></span>
*Формат числа.
Аргумент формат числа, применяется в функциях вывода стоимости чего либо.
Если это false, выводится число как есть, без всякой обработки, если true, используется формат, установленный в настройках ubercart.
Передавая массив, мы можем определить свой собственный формат числа. Первый аргумент задает количество десятичных знаков. Второй аргумент десятичный разделитель. Третий аргумент разделитель тысяч.
*Стиль
Некоторые функции используют в качестве аргумента, так называемый стиль. При помощи которого, для элемента и его потомков, можно установить значение класса, стиля, и атрибутов. Следует понимать, что стиль применяется уже после того как элемент создан.
Способы передачи стиля: класс, стиль, атрибуты.
• Класс.
Строка содержащая название класса.
<div class="@sty(true,'classname')">...</div>
• Стиль.
Строка содержащая css стиль. Должна обязательно заканчиваться символом ‘;’.
<div class="@sty(true,'background:#ffaa00;')">...</div>
• Атрибуты.
Объект, каждое из свойств которого соответствует атрибуту.
<a class="@sty(true,{href:'http://www.drupal.ru'}>LINK</a>
Данным способом можно установить любой атрибут элемента. Атрибут передается в виде строки.
Что бы обеспечить гибкость, имеется несколько уникальных дублирующих свойств:
$Typ – Соответствует атрибуту type.

$Nam – Соответствует атрибуту name.

$Cla – Соответствует атрибуту class (className).

$Sty – Соответствует атрибуту style (style.cssText).
Для применения стиля к дочерним элементам, предназначено свойство $Chi. Представляющие собой массив стилей. Каждый из них применяется, в зависимости от его порядка, с периодичностью по кругу, к соответствующему дочернему элементу.
Благодаря тому что стили применяются с периодичностью по кругу. Дочерние элементы, можно раскрасить разными “цветами”, в зависимости от порядка элемента, например “четный/нечетный”.
<div class="@sty(true,{$Chi:['black','white']})"><p>1</p><p>2</p><p>3</p><p>4</p><p>5</p><p>6</p></div>

Объект ресурсов.

Для каждого отдельного продукта, а так же для корзины имеется свой собственный объект ресурсов. Хранящий в себе, всю необходимую информацию о продукте или корзине.
Именно поэтому функции @con и @htm по умолчанию, исполняют javascript выражение в области видимости объекта ресурсов.
Acar.Reso.Lis – Объект ресурсов корзины.

Acar.Reso.Ite – Объект содержащий в себе объекты ресурсов продуктов.
Объект ресурсов корзины:
Cur – Информация о знаке валюты.

Cur.Sig – Знак валюты.

Cur.Aft – Расположение знака валюты, слева или справа, булево значение.

Cur.Pre – Число десятичных знаков после запятой.

Cur.Dec – Десятичный разделитель, обычно точка.

Cur.Tho – Разделитель тысяч, обычно запятая.

Csh – Информация для перехода на страницу продолжения покупок.

Csh.Tex – Текст ссылки перехода на страницу продолжения покупок.

Csh.Url – Адрес страницы продолжения покупок.
Объект ресурсов продукта:
Nid – Идентификатор продукта.

Tit – Название продукта.

Pri – Стоимость продукта (изначальная, без учета атрибутов).

Img – Картинка продукта (строка в виде html).

Atr – Атрибуты продукта (внутренний формат).
Примеры:
Вывод ссылки на страницу продолжения покупок.
<a class="@sty(true,{href:Acar.Reso.Lis.Csh.Url}) @con(true,'Acar.Reso.Lis.Csh.Tex',null)"></a>

Отображение значений других полей продукта.

Что бы отобразить, другие поля продукта, да и вообще любые другие данные, эти самые данные необходимо передать в объект ресурсов.
Осуществляется это при помощи функций: mytheme_acar_reso_lis и mytheme_acar_reso_ite, размещенных в файле template.php, в каталоге темы оформления.
Эти функции позволяют передать в объект ресурсов продукта или корзины, любые данные со стороны сервера. Каждая из них, должна возвращать ассоциативный массив передаваемых данных.
Функция mytheme_acar_reso_lis.
function mytheme_acar_reso_lis(&$var)
Функция mytheme_acar_reso_lis используется для передачи в объект ресурсов корзины, данных со стороны сервера. Вызывается она один раз.

function mytheme_acar_reso_lis(&$var){ return array( 'parametr1' => 'value1', 'parametr2' => 'value2', 'parametr3' => 'value3', ); }

Функция mytheme_acar_reso_ite.
function mytheme_acar_reso_ite(&$var)
Функция mytheme_acar_reso_ite используется для передачи данных в объект ресурса продукта. Вызывается каждый раз для каждого отдельного продукта. Внутри этой функции нода продукта доступна через переменную $var['ite'].

function mytheme_acar_reso_ite(&$var){ return array( 'length' => $var['ite']->length, 'width' => $var['ite']->width, 'height' => $var['ite']->height, ); }

Если возникнут сложности с поиском необходимого поля, содержимое ноды можно отпечатать, использовав функции print_r. А в браузере увидеть результат нажав ctrl+U. И уже там разбираться, где же находится, или как называется требуемое вам поле.

function mytheme_acar_reso_ite(&$var){ print_r($var['ite']); return array(); }

После того как нужные нам данные переданы в объект ресурсов, они становятся доступными для вывода, при помощи функции @con.

<input class="@con(true,'length')" type="text"/> <input class="@con(true,'width')" type="text"/> <input class="@con(true,'height')" type="text"/>

Имейте ввиду. Некоторые поля, могут не иметь значений вовсе. В этом случаи разумно, осуществлять проверку верности поля правильному значению, и только в этом случаи выводить его. Это особенно актуально, если со значением поля выводится какой, либо комментирующий его текст. Так как если поле будет пустым, то и текст будет неуместен.
Осуществить такую проверку можно через аргумент условие использования. Он обязательно должен заканчиваться символом ‘;’, что бы работать в области видимости объекта ресурса.

<div class="@con('length!=0;','\'Длина:\'+length')"></div> <div class="@con('width!=0;','\'Ширина:\'+width')"></div> <div class="@con('height!=0;','\'Высота:\'+height')"></div>

Отображение формы корзины или формы добавления в любом другом месте.

Форму корзины и форму добавления можно вставить где угодно. Для этого предназначены функции Acar_VieCar и Acar_VieAdd.
Функция Acar_VieCar
function Acar_VieCar($tpl)
Возвращает javascript код, создающий форму корзины, на основе указанного шаблона.
$tpl – Полный путь к файлу шаблона.
Эта функция если нужно, выполняет все необходимые инициализации и подключение всех требуемых ресурсов, если это не было сделано ранее.
И возвращённый её javascript должен быть размещён в теле html документа. Форма корзины будет создана в том же самом месте, где и этот самый javascript, при его исполнении.
Для размещения формы корзины, внутри формы drupal, необходимо использовать свойство ‘#markup’.

$form[] = array( '#markup' => Acar_VieCar(path_to_theme().'/acar_pane.tpl.php'), );

Функция Acar_VieAdd
function Acar_VieAdd($tpl, $nid)
Возвращает javascript код, создающий форму добавления для конкретного продукта, на основе указанного шаблона.
$tpl – Полный путь к файлу шаблона.

$nid – Идентификатор продукта.

Прикрепленный файл Размер mvca-7.x-1.06.zip 8.51 кб acar-7.x-1.07.zip 31.93 кб

Источник: http://www.drupal.ru/node/80901

Модуль – сервис оповещения Яндекса о появлении новых страниц на сайте

27 апреля Яндекс выпустил модуль оповещения себя об обновлении/добавлении новых страниц на сайт:
http://site.yandex.ru/cms-plugins/?from=wmblog
Модуль подходит для всех популярных CMS, в т.ч. и для Drupal 5, 6, 7.

Требует установки яндекс-поиска на сайт и добавления сайта в панель Яндекс.Вебмастер. Вроде-бы штука полезная, но я почему-то не могу отправить запрос, модуль говорит: “Яндекс.ПДС: Невозможно отправить пинг. Причина:Сайт не подтвержден в сервисе Яндекс.Вебмастер для указанного имени пользователя”. Хотя в сервисе Яндекс.Вебмастер всё давно подтверждено.

Через несколько часов модуль заработал, видать, дошло, поиск Яндекса индексирует сразу новый материал. Чуть переделал CSS и получилось прикольно.

Источник: http://www.drupal.ru/node/80814

Пингеры от Яндекса для индексации страниц (офциальные модули)

Яндекс выпустил модули “пингеры” для облегчения индексации страниц.

Цитирую Яндекс:
«Вы можете повысить приоритет индексирования некоторых страниц вашего сайта с помощью дополнений для CMS, которые могут отсылать запросы на индексацию автоматически. Дополнение, установленное в CMS, отслеживает изменения на сайте и генерирует запросы на индексацию при создании или изменении документов.»

Подробнее по ссылке + документация

Источник: http://www.drupal.ru/node/80761

Подключение своих шаблонов для страниц 403 и 404

Есть несколько способов создать свои «красивые» страницы для ошибок 403 и 404.
Я расскажу как я это делал через переопределение шаблона.
1. В каталоге текущей темы создаем шаблон для вывода страницы с ошибкой
Я его назвал page–error.tpl.php
Содержимое файла самое простое:

<?php /** * @file * $error_code - Error num (403 or 404) * $error_content - HTML error content */ ?> <div class="page clearfix" id="page-<?php print $error_code;?>"> <div class="content-page-<?php print $error_code;?>"> <h2> <?php print l($site_name, '<front>', array('attributes' => array('title' => t('Home')), 'html' => TRUE)); ?> </h2> <h1><?php print $error_code;?></h1> <?php print render($error_content); ?> </div> </div>

2. В файле template.php создаем (или изменяем) две функции
Имя_Вашей_темы_preprocess_html(&$vars) и Имя_Вашей_темы_preprocess_page(&$vars)
Моя тема называется olkit, соответственно и функции будут:

<?php
function olkit_preprocess_html(&$vars) {
  $header = drupal_get_http_header();
  if (isset($header['status']) && ($header['status']=='403 Forbidden' || $header['status']=='404 Not Found')) {
          $vars['attributes_array']['class'][] = 'page-error';
  }
}
?>

В данной функции я просто добавляю к тэгу body – дополнительный класс page-error, он мне понадобился для дальнейшего оформления страницы посредством CSS, если вам этого не надо, то можно не переопределять данную функцию.

И наконец основная функция, где мы переопределяем шаблон и заполняем необходимые переменные для обработки в шаблоне.

<?php
function olkit_preprocess_page(&$vars) {
    $header = drupal_get_http_header();
    if (isset($header['status']) && $header['status']=='403 Forbidden') {
     $vars['theme_hook_suggestions'][0] = "page__error";
     $vars['error_code'] = 403;
     $error_content = "<h6> У вас нет доступа на страницу, которую вы запросили.";
     $error_content .= "Возможно, вы ошиблись при наборе адреса, перешли по неверной ссылке или для доступа к данной странице необходимо зарегистрироваться.</h6>";
     $error_content .= "<ul><li>проверьте правильность написания адреса</li>";
     $error_content .= "<li>воспользуйтесь главной страницей ";
     $error_content .= l('Отель «У старого программиста»', '<front>', array('attributes' => array('title' => t('Home')), 'html' => TRUE));
     $error_content .= "</li><li>Зарегистрируйтесь на нашем сайте ";
     $error_content .= l('Войти', 'user/login', array('attributes' => array('title' => t('Login')), 'html' => TRUE));
     $error_content .= " | ";
     $error_content .= l('Зарегистрироваться', 'user/register', array('attributes' => array('title' => t('Login')), 'html' => TRUE));
     $error_content .= "</li></ul>";
     $vars['error_content'] = $error_content;
    }
    if (isset($header['status']) && $header['status']=='404 Not Found') {
     $vars['theme_hook_suggestions'][0] = "page__error";
     $vars['error_code'] = 404;
     $error_content = "<h6> Страница, которую вы запросили, отсутствует на нашем сайте.";
     $error_content .= "Возможно, вы ошиблись при наборе адреса или перешли по неверной ссылке.</h6>";
     $error_content .= "<ul><li>проверьте правильность написания адреса</li>";
     $error_content .= "<li>воспользуйтесь главной страницей ";
     $error_content .= l('Отель «У старого программиста»', '<front>', array('attributes' => array('title' => t('Home')), 'html' => TRUE));
     $error_content .= "</li></ul>";
     $vars['error_content'] = $error_content;
    }
}
?>

«Важный момент:»
строка $vars['theme_hook_suggestions'][0] = “page__error”;
определяет какой файл будет применен в качестве шаблона страницы, при этом имя файл шаблона строиться следующим образом, в значении page__error – подчеркивания заменяются на дифисы и добавляется расширение .tpl.php, таким образом для значения page__error файл должен иметь имя page–error.tpl.php

Далее посредством CSS настраиваем внешний вид страниц.
Вот и все, сбрасываем кэш и смотрим что у нас получилось.

Данный материал это репост с моего блога Подключение своих шаблонов для страниц 403 и 404

Ну и небольшой скриншотик

Источник: http://www.drupal.ru/node/80502

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

Привет.

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

На самом деле рассказывать то особо и нечего, всё потрясающе просто. Представим, что по определенным признакам мы не хотим индексировать ноду, для этого у apachesolr есть status callback. В моем случае у типа материалов “публикация” есть чекбокс “Индексируемая”, по умолчанию отмеченный, но если галочку снимут, то публикация не будет ни индексироваться, ни, само собой, выводиться в результатах поиска. Сделано это следующим образом:

<?php
// Для начала мы должны сообщить модулю apachesolr о использовании кастомного коллбэка. Делается это с помощью
// реализации хука <strong>hook_apachesolr_entity_info_alter()</strong>, описанного в файле apachesolr.api.php.
// Таких коллбэков может быть несколько.
function inti_apachesolr_entity_info_alter(&$entity_info) {
  // Способ, как видите, работает не только для нод, а для любых сущностей.
  $entity_info['node']['status callback'][] = 'inti_index_node_status_callback';
}

// Эта функция должна возвращать TRUE, если публикация индексируемая, иначе FALSE.
// Коллбэк по умолчанию проверяет, опубликована ли нода. Учитывая, что коллбэков может быть
// несколько, как я написал выше, здесь мне это проверять нет нужды. 
function inti_index_node_status_callback($entity_id, $entity_type) {
  $node = node_load($entity_id, NULL, TRUE);
  $status = TRUE;
  if (($node->type == 'publication') && !empty($node->field_do_search)) {
    $status = ($node->field_do_search['und'][0]['value']) ? TRUE : FALSE;
  }
  return $status;
}
?>

Вот и всё. Важное примечание: как я понял, после изменения функции, реализующей hook_apachesolr_entity_info_alter(), нужно очистить кэш.

В следующий раз будет пост (тоже небольшой) о том, как научить Apache Solr искать с использованием wildcard(*). Как ни странно, но по умолчанию, поддержки поиска по частям слов нет.

Ссылки:
Часть 1. О добавлении полей в индекс и фасетах.
Часть 2. О подмене коллбэка для индексации определенного полям и о том, как искать по дополнительным полям.
Часть 4. Установка Solr 3.x и поиск с использованием *

Источник: http://www.drupal.ru/node/80497

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

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

Представим задачу, когда нам нужно не добавить какое-то поле из связанных материалов, а изменить способ индексации какого-то текущего поля. Например, есть такой модуль Field Collection, позволяющий сделать поле-контейнер, содержащее в себе несколько полей. В моей структуре с помощью него у публикации указывается автор, а к автору – организация, в которой он работает:

В базе данных у меня есть таблица field_data_field_author_org, в которой есть поле value, которое указывает на entity_id поле таблиц field_data_field_author и field_data_field_jobs. Таким образом в индексированном документе публикации я получаю поле im_field_author_org, значение которого мне абсолютно не нужно. Вот для того, чтобы указать, как будет индексироваться поле, мне нужно определить indexing_callback для этого поля в функции, реализующей хук hook_apachesolr_field_mappings(), находящийся в файле apachesolr.api.inc:

<?php

function inti_apachesolr_field_mappings() {
  // Функция должна вернуть массив, в котором ключем может быть либо тип поля, либо значение 'per_field'. 
  // В первом случае мы указываем, как будут индексироваться поля этого типа, во втором - значением будет массив,
  // у которого ключем будет имя поля. Настоятельно рекомендую ознакомиться с документацией ко всем хукам, которые
  // я указываю в заметках, для этого я пишу, в каких файлах они находятся. Дело в том, что в документации
  // это описано довольно подробно, а я лишь хочу описать сам принцип.
  $mappings = array();
  $mappings['per-field']['field_author_org'] = array(
    'indexing_callback' => 'inti_field_author_org_indexing_callback',
    // В это поле я хочу записать имена авторов и организаций, поэтому меняю тип с int на text,
    // это повлияет на имя поля (см. мой предыдущий пост), которое в данном случае генерируется 
    // автоматически
    'index_type' => 'text',
    // Фасеты по этому полю мне не нужны, потому что их я формирую вручную (описано также в предыдщем посте)
    'facets' => FALSE,  
  );
  return $mappings;
}

function inti_field_author_org_indexing_callback($entity, $field_name, $index_key, $field_info) {
  $fields = array();

  // Получаем все значения нашего поля
  $field_values = array_map(function($n) { return $n['value']; }, $entity->{$field_name}['und']);  

  // По этим значениям достаем всех авторов и организации прямо из базы данных
  // В момент написания заметки я предположил, что можно было бы воспользоваться функционалом
  // самого модуля Field Collection, но это предположение я проверю позже. :)
  $select = db_select('node', 'n');
  $select->join('field_data_field_author', 'fdfa', 'fdfa.field_author_nid = n.nid');
  $select->condition('fdfa.entity_id', $field_values, 'IN');
  $select->fields('n', array('title'));
  $authors = $select->execute()->fetchCol();
  
  $select = db_select('node', 'n');
  $select->join('field_data_field_jobs', 'fdfj', 'fdfj.field_jobs_nid = n.nid');
  $select->condition('fdfj.entity_id', $field_values, 'IN');
  $select->fields('n', array('title'));
  $orgs = $select->execute()->fetchCol();

  // Формируем массив с $index_key в кач-ве ключей, и 
  // именами авторов и названиями всех организаций в кач-ве значений.
  $fields[] = array(
    'key' => $index_key,
    'value' => implode(' ', $authors),
  );
  $fields[] = array(
      'key' => $index_key,
      'value' => implode(' ', $orgs),
  );
  return $fields;
}

?>

Таким образом в результате индексирования поле у меня выглядит следующим образом:

[tm_field_author_org] => Array ( [0] => Иванов Е. С. Петрова Р. Ш. // Авторы [1] => Рога и копыта Министерство образования и науки // Организации )

Теперь мне нужно сообщить Solr’у, что по этому полю тоже необходимо производить поиск. Делается это с помощью реализации хука hook_apachesolr_query_alter(), описанном всё в том же чудесном файле apachesolr.api.php:

<?php

function inti_apachesolr_query_alter($query) {
  // Поля, в которых нужно искать, должны быть добавлены в параметр 'qf' поискового запроса.
  // Формат параметров - обычный массив, значения которого выглядят как fieldname^boost, т.е. тут же поисковик
  // будет уведомлен о приоритетах. В моём случае поле достаточно важное, поэтому приоритет делаю 
  // высоким. Напомню, что имя поля должно быть указано не то, которое в Drupal'е, а то, которое
  // в индексированном документе.
  
  $params = array('tm_field_author_org^25.0');
  $query->addParam('qf', $params);
}

?>

Кстати, $query – это интерфейс DrupalSolrQueryInterface, описанный в файле apachesolr.interface.inc, с которым рекомендую ознакомиться, если вы хотите узнать, как еще можно работать с запросом перед его отправкой.

Собственно, вот и всё. В следующем посте расскажу о status_callback и индексировании определенных нод.

Примечание: вышенаписанное актуально для текущих версий модулей apachesolr (7.x-1.0-beta19) и facetapi (7.x-1.0-rc4). Они активно развиваются, поэтому если у вас другая версия и что-то не работает, читайте release notes.

Ссылки:
Часть 1. О добавлении полей в индекс и фасетах.
Часть 3. О том, как не индексировать, если не хочется.
Часть 4. Установка Solr 3.x и поиск с использованием *

Источник: http://www.drupal.ru/node/79948

Drupal Cafe’2012 в Москве. Быть!

11 апреля 2012 года с 19:00 по 23:00 пройдет великое событие – первое DrupaCafe в 2012 году в городе Москва!
Для проведения мероприятия зарезервирована комната в антикафе Бабочки – по ссылке адрес и карта, по которой проходить. Место находятся рядом с м. Павелецкая (выход с кольцевой ветки), буквально несколько минут пешком.
Главное не теряться и заходить именно со двора, а не с улицы. Само антикафе находится на 5 этаже здания.

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

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

Напомню, что последняя встреча проводилась в декабре 2011, а на дворе уже практически апрель 2012!
На мой взгляд, это недопустимое упущение для русского сообщества в столице России. Формат встреч такого плана предполагает их регулярное проведение и перерыв в несколько месяцев очень губителен для атмосферы сообщества.

Резиденты DrupalCafe:
Алексей aka Softovick (моб. +7 (919) 104-98-73)
Виктор aka RxB

Гости мероприятия:
технический специалист от Яндекс (виртуальное общение по Skype)
владелец hr-portal.ru Валерий aka valeratal.
гуру СЭД на Drupal – Антон aka NaZg
представитель женской части русскоязычного сообщества – Мария (gagaga)

Предварительный список тем для обсуждения:

Темы обсуждения. Социальные сети на Drupal. Вкратце о том, какие элементы социальных сетей можно делать на Drupal (предварительно, от RxB). Обсуждение API Яндекс.Денег от технического специалиста! (приглашен разработчик от Яндекс) Практический опыт заработка на сайте, блоки контекстной рекламы. Валерий, hr-portal.ru Коротко об анализе узких мест в плане нагрузки на сервер сайтов на Drupal, некоторые наблюдения за очевидными ошибками после завершения разработки сайта и за особо тяжелыми модулями. (от Softovick & IT-Patrol inc) Друпал-лулзы, или примеры особо неправильных и опасных приемов разработки сайтов на Drupal (от RxB). Построение фото-магазина на Drupal. Обсуждение основ и вариантов реализации с использованием модуля Maestro (Drupal 7) (Антон NaZg). Обсуждение смежных вопросов и вопроса организации DrupalCafe в перспективе

На всякий случай хочу уточнить свое видение насчет места и формата проведения мероприятия. Я бы хотел, чтобы это было тихое и светлое место, важно наличие большого телевизора или возможность использования проектора для проведения презентаций. Также считаю немаловажным возможность закусить – в вечернее время любой человек не откажется от чашечки кофе с десертом, а многие я думаю и от легкого ужина. Жду ваших предложений и замечаний!

UPD:
сообщество ДрупалКафе ВКонтакте
страница ДрупалКафе на Facebook
UPD2:
тема на DrupalSN.Ru

Источник: http://www.drupal.ru/node/78994

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

Всем привет.

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

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

Дело в том, что в моём проекте достаточно непростая структура. Так, например, у меня есть тип материала “Публикация”, у которого есть поле – ссылка на материал типа “Издание”. В свою очередь, у издания есть поле – ссылка на материал “Издательство”. Таким образом, когда я ищу публикации, в списке доступных фильтров я вижу “Издания”, но, что если я хочу фильтровать результаты поиска по издательствам, когда они привязаны к публикациям не напрямую?

Один из предложенных вариантов решения этой задачки было ручное индексирование публикаций. Добавив в индексированную публикацию поле издательства мы легко получим нужный фильтр. Добавить поле можно с помощью реализации хука hook_apachesolr_index_document_build() (если вы такого хука не нашли, значит у вас старая версия модуля apachesolr, где он называется hook_apachesolr_update_index()), описанного в файле apachesolr.api.php:

<?php
function mymodule_apachesolr_index_document_build($document, $node, $namespace) {
  if ($node->type == 'publication') {
    if (!empty($node->field_edition)) {

      // Примечание: $node->field_edition - это ассоциативный массив, в котором ключами являются языки, это важно понимать при индексировании. 
      // В данном случае у меня материалы не привязаны к языку, поэтому ключ массива я захардкодил.
      foreach ($node->field_edition['und'] as $edition) {
        if (!empty($edition['node']->field_publishing_house))    {
          foreach ($edition['node']->field_publishing_house['und'] as $pubhouse) {

            // Ну а таким образом я добавляю новое поле в наш документ. Здесь хочу добавить два примечания.
            // Первое: В качестве значения не надо пихать весь термин, или всю ноду, а достаточно проиндексировать идентификатор.
            // Второе: У Apachesolr есть правила именования поля. Название всегда должно быть формата xy_fieldname, где
            // x - тип поля (s - строка, t - текст, i - тип long, а f - float), а y - количество значений (s - одно, m - несколько).
            // В моем примере в поле хранится идентификатор, а издательство у издания может быть только одно.
            // fieldname может быть любым, но для себя я решил, что разделяю его на две части, где первая хранит информацию о том, чье это поле,
            // а вторая - о том, что это поле содержит. pub - публикация, pubhouse - издательство.
            $document->addField('is_pub_pubhouse', $pubhouse['nid']);          
          }
        }
      }
    }
  }
}
?>

Таким образом в самом друпале у нас публикация не хранит информацию о своём издательстве, а в индексе хранит. И помимо этого, может хранить любую другую информацию, какую разработчик пожелает туда “запихнуть”.
Но этого недостаточно. Теперь мы должны рассказать модулю Facet API, что мы хотим по этому полю получить фильтр. Это, в свою очередь, решается с помощью реализации хука hook_facetapi_facet_info(), описанного в файле facetapi.api.php:

<?php
function mymodule_facetapi_facet_info($searcher_info) {
  // Данная функция должна возвращать ассоциативный массив с описаниями полей, где
  // ключом является само название поля.
  $facets = array();
  $facets['is_pub_pubhouse'] = array(

    // Название фильтра на странице настройки.
    // Учитывая, что каждый фильтр отображается в блоке, а заголовок блока я всегда успею переопределить,
    // метку я тоже решил делать понятной
    'label' => t('Publication->Pubhouse'),
    'description' => t('Pubhouse facet for publications'),

    // Здесь я должен указать название коллбэка, который будет вместо идентификаторов подставлять нормальные 
    // значения. Для полей - ссылок на таксономию рекомендую использовать уже готовый коллбэк
    // facetapi_map_taxonomy_terms, для ссылок на ноды я создал свой коллбэк, для полей со списком значений
    // я создавал отдельные коллбэки, хотя возможно, можно это сделать изящнее.
    // Помимо этого, здесь можно указать параметры фильтра такие, как, например, древовидность (hierarchy_callback).
    // Подробнее можно посмотреть в вышеуказанном файле facetapi.api.php в коде описания хука.
    'map callback' => 'mymodule_map_node_references',
  );
}

function mymodule_map_node_references(array $values) {
  // Здесь все очень просто, коллбэк возвращает ассоциативный массив, где ключ массива - это значение, хранимое в поле,
  // а значение в массиве - это то, что должен увидеть пользователь.
  $map = array();
  if ($values) {
    $map = db_select('node', 'n')->fields('n', array('nid', 'title'))->condition('n.nid', $values, 'IN')->execute()->fetchAllKeyed();
  }
  return $map;
}
?>

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

Примечание: вышенаписанное актуально для текущих версий модулей apachesolr (7.x-1.0-beta16) и facetapi (7.x-1.0-rc4). Они активно развиваются, поэтому если у вас другая версия и что-то не работает, читайте release notes.

Ссылки:
Часть 2. О подмене коллбэка для индексации определенного полям и о том, как искать по дополнительным полям.
Часть 3. О том, как не индексировать, если не хочется.
Часть 4. Установка Solr 3.x и поиск с использованием *

Источник: http://www.drupal.ru/node/78426

OG Features – добавляем гибкости в OG


OG Features – модуль позволяющий администратору сайта определять, какой функционал в группе может включаться и отключаться владельцем группы.
Например, это могут быть произвольные типы контента, вьюхи, панели. Яркий пример использования этого модуля, это сборка Drupal Commons, где через og_features сделаны такие фичи для групп как:

Blog Discussions Documents Events Group Aggregator Polling Wiki Q&A

Сам процесс создания фичи для OG Features нетривиален.
Для этого вам нужно создать свой модуль, где нужно реализовать хук hook_og_features_registry().
Например, у нас модуль называется modulename и мы хотим определить фичу my_feature, код будет следующий, код взяд из модуля, комментарии оставлены оригинальные и строкой ниже добавлены мои:

function modulename_og_features_registry() { $registry = array();   // Feature: my_feature. // Создание объекта фичи. $feature = new stdClass;   // The feature id //Указываем id фичи, оно должно быть уникальным в пределах сайта $feature->id = 'my_feature';   // The name that will show up on the feature toggle form //Название фичи, которое будет показываться в группе на странице управления фичами $feature->name = t('Blog');   // The description that will show up on the feature toggle form //Описание, показываемое на странице управления фичами $feature->description = t('Provide a simple blog for your group');   // The components of the feature that will be enabled/disabled //Компоненты которые включает фича $feature->components = array( 'views' => array( 'og_tab_blogs', ), 'node' => array( 'blog', ), 'context' => array( 'group_blogs', ), 'path' => array( 'node/%node/aggregator', ), 'pane' => array( 'og_content_tracker-panel_pane_1', ), 'og link' => array( 'og_invite', // The key of the link in the group details block ), ); // It's recommended that you key the feature with the name of the // module/feature that is supplying this, so that any custom page // callbacks provided by this module/feature become disabled within // the group //помещаем фичу в "контейнер", это позволит нам в модуле определить несколько фич, если требуется $registry[$feature->id] = $feature;   // Feature: my_second_feature //объявляем вторую фичу $feature = new stdClass; // You can continue to add as many as you'd like //в дальнейшем процесс никак не отличается от первой фичи, в конце делаем так же $registry[$feature->id] = $feature; return $registry; }

Источник: http://www.drupal.ru/node/78408

uLogin – новый модуль авторизации через Facebook, Vkontakte, odnoklassniki, twitter…

Добрый день,

Для друпала 7 написал модуль авторизации для сервиса uLogin. Функционально очень схож с Loginza.

Реализованные возможности по состоянию beta5 (12 марта 2012), учитывались замечания и пожелания отсюда:

Виджет сделан в виде нового элемента – поэтому его можно использовать в любой форме:
<?php $form['widget'] = array('#type' => 'ulogin_widget');</li> ?> Его настройки по умолчанию конфигурируются через админку. Разработчики могут их переопределять, задавая эти настройки в своих формах при добавлении виджета (разработчики найдут, какие именно настройки они могут переопределять). Несколько виджетов на одной странице работают корректно и не глючат. Пользователи могут подключить к одному своему аккаунту несколько различных айдентити (зайкладка uLogin identitites в профиле пользователя) – и смогут логиниться в свой аккаунт используя любую из них. Так же смогут и удалить привязанные к аккаунту айдентити (при удалении айдентити, которая использовалась для создания аккаунта, требуется указать айдентити, на которую её заменить). Модуль определяет токены для аккаунтов, которые были созданы с помощью айдентити – эти токены можно использовать в модулях Rules, Realname, и в других, где используются токены пользователя. Также есть настройка, которая позволяет запретить регистрацию пользователей с одинаковыми мылами – в этом случае пользователю выдается ошибка и предлагается залогиниться с помощью другой айдентити либо с помощью логина и пароля. В админке можно проставить, на какие их трех форм (форма логина, форма логина в блоке, форма регистрации) добавить дефолтный виджет.

Разработка модуля проспонсирована Forbes.ru, будет использоваться в новом проекте на друпале 7.

Источник: http://www.drupal.ru/node/78145

Школа Drupal в Москве (от siteograf.com)

Уроки Друпал для начинающих в Москве – вступайте в группу http://vk.com/drupal_moscow

Каждый участник сделает собственный сайт, научится работать с CMS Drupal, освоит основы создания корпоративных порталов.

Важное условие: уверенный пользователь ПК.

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

Компания Siteograf.com проводит занятия по обучению Drupal с февраля 2011 года. За это время мы провели свыше 15 образовательных программ в Киеве и Москве для начинающих веб-разработчиков.

Свыше 5 лет Siteograf занимается разработкой сайтов на CMS Drupal для клиентов.

Лектор: Виктор Богуцкий, Siteograf.com

Стоимость участия во всем курсе Школы составляет 2599 рублей.

Для регистрации:
Отправь письмо на daredjana@gmail.com, напиши свои имя-фамилию, контактный мобильный телефона. В теме письма укажи «Школа Drupal в Москве».

Подробности программы и отзывы смотрите на siteograf.com
и в нашей группе вконтакте “Обучение Drupal” http://vk.com/drupal_education

Источник: http://www.drupal.ru/node/77701

18 и 31 марта Третья Школа Drupal в Москве (от siteograf.com)

Уроки Друпал для начинающих в Москве.
Каждый участник сделает собственный сайт, научится работать с CMS Drupal, освоит основы создания корпоративных порталов.

Важное условие: уверенный пользователь ПК.

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

Компания Siteograf.com проводит занятия по обучению Drupal с февраля 2011 года. За это время мы провели свыше 15 образовательных программ в Киеве и Москве для начинающих веб-разработчиков.

Свыше 5 лет Siteograf занимается разработкой сайтов на CMS Drupal для клиентов.

Программа

18 марта, воскресенье
Блок 1.
12.00-15.00
• Установка друпала
• Модули и темы.
• Меню и блоки.
• Методика изучения.
• Создание разделов и страниц подразделов, вставка картинок, оформление контента.
• Установить и включить модули menu block, colorbox, global redirect, XML sitemap, page title.
• Скачать и установить тему дизайна, которая наиболеее подходит под вид деятельности.

Блок 2.
15.00-17.00
• Типы материалов. Создание своих типов материалов.
• Таксономия.
• Создание полей в типе материала.
• Модуль Views. Вывод полей используя views.
• Работа с блоками.
• Использование CSS для изменения внешнего вида сайта и его элементов.

Домашнее задание: селекторы CSS, потренироваться в изменении основных свойств и значений.

31 марта, суббота
Блок 3.
12.00-15.00
• Работа с пользователями.
• Права доступа.
• Модули для работы с пользователями.
• Особенности регистрации и вывод полей из профиля пользователей.
• Взаимодействие пользователей.
• Интеграциия с социальными сетями.
• Умение добавить поля в регистрационную форму пользователей, создание и использование своих шаблонов.

Блок 4.
15.00 – 17.00
• Модуль Panels.
• Редактирование шаблона вывода.
• Модули для seo.

Лектор: Виктор Богуцкий, Siteograf.com
Место проведения: Шоколадная фабрика, ул.Рабочая, 38
м.Римская либо м.Площадь Ильича

Стоимость участия во всем курсе Школы составляет 2599 рублей.

Для регистрации:
Отправь письмо на daredjana@gmail.com, напиши свои имя-фамилию, контактный мобильный телефона. В теме письма укажи «Школа Drupal в Москве 18 и 25 марта». .

Хочешь получить скидку в 100 рублей?
Напиши на своей страничке вконтакте и фейсбуке «Иду учиться делать сайты Школа Drupal http://vk.com/drupal_moscow» (сообщите об этом нам, отправив ссылку на свой профиль на daredjana@gmail.com)

По всем вопросам звонить (925) 380 08 36 Даша.

Подробности программы и отзывы смотрите на siteograf.com и в нашей группе вконтакте “Обучение Drupal” http://vk.com/drupal_education

Источник: http://www.drupal.ru/node/77701

Ajax Form в Drupal7

По мотивам Как проще всего реализовать аякс с выдачей json” и Установка фокуса на элемент формы*.

В итоге, на память себе и может кому понадобится:

В hook_menu:

$items['path_to_page/%'] = array( 'type' => MENU_CALLBACK, 'page callback' => 'my_callback', 'delivery callback' => 'ajax_deliver', 'page arguments' => array(1), 'access arguments' => true, );

Непосредственно callback

function my_callback($fid) { $commands[] = ajax_command_replace('#ID_'.$fid, 'New value text'); $page = array('#type' => 'ajax', '#commands' => $commands); # если в форме у нас #type = submit ajax_deliver($page); # если у нас #type = link, то return $page; }

В форме у необходимого элемента прописываем:

'#ajax' => array( 'effect' => 'fade', # нижеперечисленное необходимо для #type = submit 'path' => 'path_to_page/'.$fid, 'event' => 'click', )

Если тип = link, необходимо ещё указать в аттрибутах класс use-ajax.

К чему все это написано:
не нашел нигде рабочего описания по работе с ajax['path'] вместо ajax['callback']
в случаях $form['element']['#type'] = ’submit’ или $form['element']['#type'] = ‘link’ – немного отличаются вывод и возврат callback.

P.S. сначала нашел решение, потом уже по delivery callback’y нашел эту статью и узнал про разницу в типах #type = submit|link.

Источник: http://www.drupal.ru/node/77567

Ajax Form в Drupal7

По мотивам Как проще всего реализовать аякс с выдачей json” и Установка фокуса на элемент формы*.

В итоге, на память себе и может кому понадобится:

В hook_menu:

$items['path_to_page/%'] = array( 'type' => MENU_CALLBACK, 'page callback' => 'my_callback', 'delivery callback' => 'ajax_deliver', 'page arguments' => array(1), 'access arguments' => true, );

Непосредственно callback

function my_callback($fid) { $commands[] = ajax_command_replace('#ID_'.$fid, 'New value text'); $page = array('#type' => 'ajax', '#commands' => $commands); # если в форме у нас #type = submit ajax_deliver($page); # если у нас #type = link, то return $page; }

В форме у необходимого элемента прописываем:

'#ajax' => array( 'effect' => 'fade', # нижеперечисленное необходимо для #type = submit 'path' => 'path_to_page/'.$fid, 'event' => 'click', )

Если тип = link, необходимо ещё указать в аттрибутах класс use-ajax.

К чему все это написано:
не нашел нигде рабочего описания по работе с ajax['path'] вместо ajax['callback']
в случаях $form['element']['#type'] = ’submit’ или $form['element']['#type'] = ‘link’ – немного отличаются вывод и возврат callback.

P.S. сначала нашел решение, потом уже по delivery callback’y нашел эту статью и узнал про разницу в типах #type = submit|link.

Источник: http://www.drupal.ru/node/77567

VK OpenAPI для Drupal 7

Енто быстрый и грязный порт vk_openapi под семерку.

https://github.com/orangeudav/vk_openapi7

Источник: http://www.drupal.ru/node/77262

SWEB. Скрипт импорта базы для друпала.

Суть проблемы – в /etc/my.cnf прописано init-connetc=”SET NAMES cp1251″

Для тех, кто не вкурсе – друпал делает SET NAMES UTF8

Соответственно если просто попытаться сделать mysqldump – то получим UTF8 символы интрепетерированые в cp1251. Восстановлению такая база не подлежит.

Использование ключей –default-character-set, –no-set-names , –set-charset ни к чему не приводят.
Так как сервер после инициации соединения, переключает кодировку на cp1251.

С sxd проблемы – у него не получается сделать дамп. В причина не смог разобраться. Возможно лимит памяти.
Дамп, что был предоставлен тех поддержкой был к сожалению тоже в двойной конвертации! И аналогично не готовый к восстановлению.

Способ вытянуть базу в таком случае приложенный скрипт.

Инструкция по применению:

1) зайти по SSH – залить скрипт, прописать в него нужные данные

2) вызвать командой php script.php > dump.sql

Возможные проблемы: если у вас большая база.. то вы увидите сообщение killed!
В таком случае надо подправитьс крипт на то, чтоб делать дамп каждой таблицы отдельно – это дополнительный параметр в строке:
backup_tables(’localhost’,'username’,'password’,'dbname’,'TABLE_NAME’);
TABLE_NAME – заменить на имя таблицы.

Надеюсь это кому-то поможет если возникнет подобная проблема экспорта базы данных.

Прикрепленный файл Размер sweb-dump.php_.txt 1.23 кб

Источник: http://www.drupal.ru/node/77101

Модуль Яндекс.Карты 7.x

Модуль состоит из трех суб-модулей:

Яндекс.Карты API – вспомогательные функции для других модулей.
– Страница ввода API ключа.
– Функции вывода JavaScript карт.

Яндекс.Карты Field – поле с виджетом и форматтерами вывода.
– Создание меток, линий и областей с помощью Яндекс.Карты с возможностью указывать свои параметры для каждого объекта.
– Вывод созданных объектов также на Яндекс.Карте.

Яндекс.Карты Views – плагин стиля для Views.
– Возможность выбирать откуда берутся данные (простые поля / поле Я.Карт / поле Geolocation / есть еще?).
– Можно задавать стиль выводимых меток, а также поле для заголовка и поля для содержимого балона.

Яндекс.Карты OpenLayers – дополнение к OpenLayers.
Всех интересует. Добавил опрос.

Статус: модуль еще в разработке, не устаналивать на рабочие сайты
Демо: http://ymaps.drupal.name/
Репка: https://github.com/elaman/ymaps

Спонсоры:
 alvaxet
 P.Selfin
 vitg
 mag-alliance

Для спонсоров:
R362788674404
Z560685602155
другие можно узнать у меня

Багрепорты, предложения и прочее обязательны.

Текущее состояние модуля:

- Модуль Яндекс.Карты Field еще не доделан. Для добавления меток стоит модуль  Geolocation.
- Модуль Яндекс.Карты Views вполне рабочий и вывод уже добавленных меток через Views на демо-сайте. В балуне выводится заголовок, описание и поле модуля  Fivestar

Attached poll “Нужен ли вывод Яндекс.Карт через OpenLayers?”.
Register or login to poll
Results:
Нужен: 20 голосов
Не нужен: 3 голоса
Без разницы: 9 голосов
Нельзя: 0 голосов

Источник: http://www.drupal.ru/node/76858

Модуль интеграции Drupal 7 со сторонними сервисами

Доброй ночи, друзья. Меня зовут, Анатолий. г. Вологда, компания Синапс.
Мы занимаемся созданием сайтов и другими интересными вещами.
Сайты делаем исключительно на друпале, и чаще всего это сайты корпоративных клиентов с соответствующей спецификой.
У нас есть ряд разработок, которыми хочется поделится с сообществом.

Зачем делиться:
- для себя: чтобы структурировать код и сделать таки review
- чтобы быстрее отлавливать баги
- чтобы подсказали как лучше
- чтобы друпал стал более распространен и появлялись новые решения на этой системе

Делиться будем следующими модулями:
- Модуль интеграции друпала со сторонними сервисами (в первую очередь с яндексом)
- Модуль для отображения объекта на яндекс картах
- Модуль view_yamap для интеграции предыдущего модуля с вьювсом

Итак. Первый модуль – synapse. (Остальные чуть позже)
Это модуль сделан для наших внутренних нужд. Он нужен для того, чтобы клиенты не дергали проджектменеджеров лишними вопросами, а проджектменеджеры соответственно не дергали лишними вопросами программистов.

Поскольку делася для себя, то он так и называется “synapse”. Но по счастливой случайности такое название прекрасно совпадает с функционалом модуля, поэтому переименовывать его не будем. Википедия нам подсказывает:
Си́напс — место контакта между двумя нейронами или между нейроном и получающей сигнал эффекторной клеткой. Служит для передачи нервного импульса между двумя клетками.

Посколку внизу длинная простыня скриншетов, чтобы не томить сразу ссылки:
- модуль synapse.zip
- проект в песочнице друпал.орг

Что делает модуль:
1. Изменяет страницу добавления материала
2. Дружит сайт с гул/яндекс вебмастером
3. Добавляет на сайт яндекс-метрику
4. Отображает яндекс-карту на странице с контактами
5. Размещает информацию о компании в формате hCard
6. Позволяет быстро добавить вконтактогруппу и магазин на еквиде
7. Менять автоматически год создания сайта в подвале

По пунктам 0. Меняет значения по умолчанию

Меняет значения по умолчанию на странице добавления типа материала (admin/structure/types/add):

Чистим поле “название поля заголовка”, чтобы программисты не забывали поставить человечное “название альбома”, вместо бездушного “Title” В настройках публикации вместо галочки “на главную” ставим галочку “создавать редакции” Убираем галочку “показывать автора и дату”, т.к. в корпоративных сайтах это нужно только у “новостей” Снимаем галочку в “настройках меню” т.к. у корпоративных сайтов это нужно только у “страниц” 1. Страница добавления материала


Страница добавления материала для клиента не должна содержать “лишних” полей. Каждое лишнее поле – звонок менеджеру, поэтому:

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

Всё это естественно регулируется на странице настроек

2. гугл/яндекс вебмастер

Менеджер проекта (или клиент) может сам быстро добавить сайт в гугл/яндекс вебмастер, без обращения к программису

3. Яндекс-метрика

Менеджер проекта (или клиент) может добавить на сайт яндекс-метрику не обращаясь к программисту. При желании можно отобразить информер (картинка с кол-вом посетителей) – блок, который можно перетащить например в подвал. Для гугланалитика есть отдельный  модуль http://drupal.org/project/google_analytics

4.Контакты с яндекс-картой

Менеджер проекта (или клиент) может отобразить на странице контактов яндекс-карту с отметкой о местоположении организации не обращаясь к программисту.

5. hCard

hCard – это микроформат, который позволяет рассказать роботам о своей орагнизации. Его поддерживает яндекс, и обещает использовать эту информацию в яндекс-справочнике. Блок с этой информацией удобно разместить в подвале. Если заполнены координаты в настройках карты, то они также попадают в микроформат. Соотвественно если заполнено название организации, то оно отображается при клике на метку карты.
Сначала результат

Потом настройки

6. “еквид” и “vk_group”

Вкладочка “прочее” позволяет быстро добавить на сайт магазин “еквид” и “блок с группой вконтакте”

7. Модуль делает блок “копирайты”.

Модуль делает блок “копирайты” Данные для блока берет из названия орагинзции в hCard и поля “Year From” вкладки “прочее”. Результат полчаем в следующем в формате:
©2012 — %Название%
или
2011 — 2012 © %Название% (Если наступит следующий год).
© – ссылка на страницу логина (user) чтобы не уродовать сайт формой логина, и не заставлять пользователя вбивать “специальный” адрес в командную строку

Прикрепленный файл Размер Так выглядит добавление страницы для пользователя 27.12 кб Настройки полей для node_add 19.36 кб Добавление в вебмастер – настройки 19.17 кб Яндекс метрика – настройки 20.92 кб Яндекс карта – настройки 100.7 кб hcard – результат 6.64 кб hcard – настройки 64.01 кб Другие настройки 18.44 кб synapse.zip – модуль 10.95 кб

Источник: http://www.drupal.ru/node/76726

К вопросу о jQuery старших версий в Drupal 6

Исправления Drupal 6 для совместимости с jQuery 1.6.4 и более старших версий.

Работают все функции в том числе ajax, ahah, загрузка файлов, autocomplite, batch и tabledrag.

В common.includes нужно заменить функции для преобразования в формат json:

/** * Converts a PHP variable into its Javascript equivalent. * * We use HTML-safe strings, i.e. with <, > and & escaped. */ function drupal_to_js($var) { switch (gettype($var)) { case 'boolean': return $var ? 'true' : 'false'; // Lowercase necessary! case 'integer': case 'double': return $var; case 'resource': case 'string': /* Patch ++ */   // Always use Unicode escape sequences (\u0022) over JSON escape // sequences (\") to prevent browsers interpreting these as // special characters. $replace_pairs = array( // ", \ and U+0000 - U+001F must be escaped according to RFC 4627. '\\' => '\u005c', '"' => '\u0022', "\x00" => '\u0000', "\x01" => '\u0001', "\x02" => '\u0002', "\x03" => '\u0003', "\x04" => '\u0004', "\x05" => '\u0005', "\x06" => '\u0006', "\x07" => '\u0007', "\x08" => '\u0008', "\x09" => '\u0009', "\x0a" => '\u000a', "\x0b" => '\u000b', "\x0c" => '\u000c', "\x0d" => '\u000d', "\x0e" => '\u000e', "\x0f" => '\u000f', "\x10" => '\u0010', "\x11" => '\u0011', "\x12" => '\u0012', "\x13" => '\u0013', "\x14" => '\u0014', "\x15" => '\u0015', "\x16" => '\u0016', "\x17" => '\u0017', "\x18" => '\u0018', "\x19" => '\u0019', "\x1a" => '\u001a', "\x1b" => '\u001b', "\x1c" => '\u001c', "\x1d" => '\u001d', "\x1e" => '\u001e', "\x1f" => '\u001f', // Prevent browsers from interpreting these as as special. "'" => '\u0027', '<' => '\u003c', '>' => '\u003e', '&' => '\u0026', // Prevent browsers from interpreting the solidus as special and // non-compliant JSON parsers from interpreting // as a comment. '/' => '\u002f', // While these are allowed unescaped according to ECMA-262, section // 15.12.2, they cause problems in some JSON parser. "\xe2\x80\xa8" => '\u2028', // U+2028, Line Separator. "\xe2\x80\xa9" => '\u2029', // U+2029, Paragraph Separator. );   return '"'. strtr($var, $replace_pairs) .'"';   case 'array': // Arrays in JSON can't be associative. If the array is empty or if it // has sequential whole number keys starting with 0, it's not associative // so we can go ahead and convert it as an array. if (empty ($var) || array_keys($var) === range(0, sizeof($var) - 1)) { $output = array(); foreach ($var as $v) { $output[] = drupal_to_js($v); } return '[ '. implode(', ', $output) .' ]'; } // Otherwise, fall through to convert the array as an object. case 'object': $output = array(); foreach ($var as $k => $v) { $output[] = drupal_to_js(strval($k)) .': '. drupal_to_js($v); } return '{ '. implode(', ', $output) .' }'; default: return 'null'; } }   /** * Return data in JSON format. * * This function should be used for JavaScript callback functions returning * data in JSON format. It sets the header for JavaScript output. * * @param $var * (optional) If set, the variable will be converted to JSON and output. */ function drupal_json($var = NULL) { // We are returning JavaScript, so tell the browser.     drupal_set_header('Content-Type: application/json; charset=utf-8');   if (isset($var)) { echo drupal_to_js($var); } }

В атаче исправленные JS файлы из папки misc.

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

p.s.: если активно перебираете DOM, то вместо указателя на селектор $(’selector’) в скриптах можно использовать $.shell.find(’selector’), который работает в области видимости только document без учета window, что несколько быстрее.( зачем так? затем что всякие дополнительные скрипты типа гуглпоиска, метрики, других решений, которые бомбят в документ фрейемы и прочие посторонние объекты могут реально раздувать поле выборки )

Прикрепленный файл Размер drupal_javascripts.zip 31.31 кб

Источник: http://www.drupal.ru/node/76592

Модуль Яндекс.Погода для Drupal 6 и 7

Скачать модуль для Drupal 6: yandex_weather-6.x-1.1.zip
Скачать модуль для Drupal 7: yandex_weather-7.x-1.1.zip

На прошлой неделе на сайте drupal.ru я увидел активное обсуждение топиков «Яндекс сервисы в одном проекте» и «Встреча по поддержке и продвижению Яндекс-сервисов в Drupal». В представленном списке существующих модулей для интеграции с сервисами Яндекса я не обнаружил модуля про погоду. Я доработал свой модуль, исправил ошибки, дописал дополнительный функционал и решил выложить на сайт для обсуждения сообществом.

Вот так выглядит блок с информером погоды от Яндекса в дефолтной теме.

В настройках блока можно:

указать город по умолчанию; разрешить/запретить отображать форму выбора города в блоке; выбирать размер информера.

Текстовые сообщения модуля написаны на английском языке и переведены на русский язык.

Если данный модуль вызовет интерес, то можно переписать его и для Drupal 7. Буду благодарен за любые конструктивные комментарии.

UPD 21.02.2012: Обновил модуль. На прошлой неделе Яндекс обновил свой сервис погоды, поэтому поломалась часть функциональности моего модуля. Сейчас исправил. А также сделал версию модуля под Drupal 7.

Скачать модуль для Drupal 6: yandex_weather-6.x-1.1.zip
Скачать модуль для Drupal 7: yandex_weather-7.x-1.1.zip

Прикрепленный файл Размер yandex_weather-6.x-1.1.zip 9.33 кб yandex_weather-7.x-1.1.zip 9.48 кб

Источник: http://www.drupal.ru/node/76316

Inner poll для Drupal 7. Прикрепляйте опросы к любому документу ;)

День добрый.

Портировал Inner poll для Drupal 7, для моего любимого www.drupal.ru. Прикрепляйте опросы к любому документу .

При портировании кое-где немного изменил логику и вывел количество воздержавшихся.
Поля в БД совместимы с версией для Drupal 6, только добавились новые индексы.
Перевод модуля содержится в архиве модуля.

Ищу тех кто поможет разместить модуль на drupal.org.

Особенности модуля

Все действия пользователей сохраняются без перезагрузки страницы (хмм, возможно, пора уже перестать считать AJAX фишкой); автор опроса может разрешить (или не разрешить) пользователям отменять свои голоса голоса; автор опроса может открывать/закрывать опрос, а так же устанавливать дату автоматического закрытия опроса; автор опроса может разрешить/запретить множественный выбор; автор опроса, если он не является модератором, может править вопрос опроса только до тех пор, пока в опросе нет ни одного голоса; автор опроса, если он не является модератором, может править ответ на вопрос только до тех пор, пока за этот ответ нет ни одного голоса; опрос может содержать до 999 вариантов ответа; пользователи не могут просматривать результаты опроса до тех пор пока не проголосуют, для неопределившихся с решением есть кнопка “Воздержаться”, после нажатия которой будут показаны результаты, но при этом пользователь потеряет возможность голосовать в этом опросе; администратор сайта может раздавать права на голосование, создание опросов, редактирование опросов, редактирование опросов даже в случае если в них уже есть голоса;

Пояснение к пунктам 5 и 6. Они нужны для того, чтобы авторы не вносили кардинальных изменений в опрос тогда, когда другие юзеры уже отдали в них свои голоса. Например, был опрос “Любите ли вы клубнику”, на который получены ответы “Да” — 95%, “Нет” — 5%, а затем ушлый автор сменил вопрос на “Смотрите ли вы порнографию”.

Примечания

Не стал прикручивать кэш, так как в кэш можно класть всю страницу сторонними средствами при необходимости (обработка AJAX живёт на своих URL). Не реализован файл тестов, если кто напишет, буду благодарен. Отсутствует шаблон вывода контента так как количество выводимых данных мало и многое можно темизировать с помощью *.css.

Загрузка

Ссылка: Inner poll для Drupal 7.

Источник: http://www.drupal.ru/node/74900

Видео и слайды с DrupalCamp Donetsk 2011

Мы наконец-то выложили обещанное и долгожданное видео докладов с DrupalCamp! Спасибо Петру Козаченко, Владимиру Колосу и Александру Даниленко за съемку и обработку. Результат их совместной работы вы можете увидеть здесь http://www.youtube.com/user/DrupalCampDonetsk.

Мы также выложили слайды презентаций сюда http://slideshare.net/DrupalCampDN, А еще, мы прикрепили эти видео и слайды к темам докладов на нашем сайте: http://donetsk.drupal.ua/ru/program/session-schedule. Пожалуйста, оставляйте ваши отзывы!

Источник: http://www.drupal.ru/node/74516

Яндекс сервисы в одном проекте

Предлагаю обсудить возможность объединить все Яндекс сервисы в одном проекте. На текущий момент на д.о. есть несколько различных модулей для интеграции с яндекс сервисами.

Поиск по сайту дал следующие результаты:

 Яндекс.маркет — 6.x.  Яндекс.маркет — 6.x и 7.x(dev). Яндекс.маркет — в песочнице.  Яндекс.видео — 7.x(dev) new!  Яндекс.метрика — 6.x и 7.x. Яндекс.метрика — в песочнице. Яндекс.вакансии — обсуждается.  Яндекс.новости — 6.x(dev) и 7.x(dev).  Яндекс.карты — 6.x(dev).  Яндекс.деньги — 5.x платёжный шлюз для уберкарт. Яндекс.сервер — в песочнице. Яндекс.поделиться — в песочнице. Яндекс.спеллер — в песочнице. Яндекс.почта — обсуждается. Яндекс.карты — почти готов. Яндекс.карты — во вложении.  Site verification — 6.x и 7.x. Яндекс.маркет — во вложении. Быстрый заказ — обсуждается. Яндекс.погода — во вложении.

Если что то забыл, поправьте.

Вот мои причины, для чтобы собрать все сервисы в один проект:

На данный момент большинство из этих модулей находятся «в стадии разработки», а многие попросту брошены без особых шансов получить стабильный релиз для D6 и D7. Я думаю ситуация измениться, если у проекта будет несколько разработчиков. Это поможет устранить дублирования проектов. Например, в приведённом списке представлено сразу 4 модуля для интеграции с Яндекс.маркет. Думаю, лучше всё таки будет объединить усилия. Помощь новым разработчикам. Несколько модулей находятся в песочницах из-за того, что некому сделать review кода. На д.о. яндекс мало кому интересен… Для многих яндекс сервисов интеграция с Друпалом полностью отсутствует. В том числе для самого главного, на мой взгляд сервиса — Яндекс.xml. Для одного общего проекта, легче найти спонсоров.

Attached poll “Нужно ли объединять все яндекс.модули в один проект?”.
Register or login to poll
Results:
Да: 43 голоса
Нет: 27 голосов

Источник: http://www.drupal.ru/node/74274

Вот такая штукенция получилась. Radios Select для Drupal 7.

История из разряда “Новая жизнь старых вещей”. Точнее – новая “шуба” для привычного элемента форм radios. Для тех случаев, когда элемент radios строится из модуля.

Собственно, началось всё с того, что искал способ отобразить в форме модуля некую таблицу символов с возможностью выбора любого одного символа. Символы должны быть достаточно крупные (шрифт где-то 18-20px). Для начала попытался приспособить обычный select, но не понравилось: во-первых, список слишком длинный и выбирать неудобно, а во-вторых, добиться единообразного отображения (размер шрифта, padding, выравнивание и т.д.) в разных браузерах оказалось совсем непросто.

В общем, нужно было искать более компактное решение, при котором таблица была бы именно таблицей. В процессе разных тестов случайно обнаружил, что метки (label) для элемента radios в большинстве браузеров обрабатывают клики как и родительский (связанный с меткой) сам radios-control (кружочек, по которому мы тыкаем мышкой). То есть – по клику на метку элемент устанавливается в состояние checked, как если б мы кликали на сам кружочек. Не бог весть какое открытие, но беглый поиск в гугле аналогичных развитых решений с использованием меток ничего не дал. И я приступил к работе.

После ряда тычков в неверных направлениях было выведено более-менее унифицированное и кроссбраузерное решение (CSS + jQuery). Я его назвал Radios Select. Вот оно, со скромной гордостью и удовлетворением представляю своё детище:

А вот что происходит по клику на элементе:

Код, формирующий вывод:

<?php
$values = preg_split('/[\s,\.]+/', ucwords('Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Maecenas sodales congue velit. Duis commodo interdum ipsum.'));

$form['rs_example_1']['radios_select_1'] = array(
  '#type'          => 'radios',
  '#title'         => t('Select word:'),
  '#default_value' => 1,
  '#options'       => $values,
  '#radios_select' => TRUE,     // enables Radios Select for this radios element
  '#description'   => t('Word to use in form.'),
);
?>

Собственно, Radios Select можно использовать не только, как таблицу символов, а для выбора любого значения: строки, числа. Родилась идея сделать модуль-хук, который бы темизировал элементы radios как Radios Select, если у элементов установлен соответствующий параметр, а иначе – выводил бы стандартный radios. В процессе работы над модулем элемент Radios Select “оброс” рядом параметров, позволяющих кастомизировать вывод этого псевдо-элемента (это действительно скорее псевдо-элемент, поскольку по факту строится обычный radios и последующая обработка в submit’е – типичная для radios).

Например, можно изменить свойства шрифта элемента:


<?php
$values = preg_split('/[\s,\.]+/', ucwords('Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Maecenas sodales congue velit. Duis commodo interdum ipsum.'));

$form['rs_example_2']['radios_select_2'] = array(
  '#type'          => 'radios',
  '#title'         => t('Select word:'),
  '#default_value' => 2,
  '#options'       => $values,
  '#radios_select' => TRUE,     // enables Radios Select for this radios element
  '#rs_attributes' => array(
    'label'         => array(
      'font'         => 'Times New Roman',  // this sets font family (same as in CSS way)
      'font_size'    => 1.4,              // this sets font size (in "units" units)
      'font_color'   => '#339933',        // this sets font color (same as in CSS way)
      'line_height'  => 2,                // this sets line height (in "units" units)
      'units'        => 'em',             // can be em or px (default: px)
    ),
  ),
  '#description'   => t('Word to use in form.'),
);
?>

А вот и вариант для искомой таблицы символов:


<?php
$values = array();
for ($i = 33; $i < 256; $i++) {
  $values[] = '&#' . $i . ';';
}
$values = array_combine($values, $values);

// Replace Soft Hyphen symbol (&#173;) by non-breaking space
// (this symbol produces row break in Firefox and Opera)
$values['&#173;'] = '&nbsp;';

$form['rs_example_3']['radios_select_3'] = array(
  '#type'          => 'radios',
  '#title'         => t('Select symbol:'),
  '#default_value' => '&#169;',
  '#options'       => $values,
  '#radios_select' => TRUE,     // enables Radios Select for this radios element
  '#rs_attributes' => array(
    'label'          => array(
      'width'          => 2,      // sets label width (in "units" units)
      'height'         => 2,      // sets label height (in "units" units)
      'line_height'    => 2,
      'padding_x'      => '3px',  // horizontal padding (we use px instead of units)
      'padding_y'      => '3px',  // vertical padding (we use px instead of units)
      'units'          => 'em',
    ),
  ),
  '#description'   => t('Symbol to use in form.'),
);
?>

Можно “подкрасить” оформление элемента (выбирается также светлая или тёмная стрелка):


<?php
$values = array_merge(range('A', 'Z'), range('a', 'z'));

$form['rs_example_4']['radios_select_4_1'] = array(
  '#type'          => 'radios',
  '#title'         => t('Select character:'),
  '#default_value' => 2,
  '#options'       => $values,
  '#radios_select' => TRUE,     // enables Radios Select for this radios element
  '#rs_attributes' => array(
    'element'        => array(
      'frame_color'    => '#d4d0c8', // this sets frame color
      'dark_arrow'     => TRUE,      // this sets dark arrow for this element
     ),
    'label'          => array(
      'width'          => 2,
      'height'         => 2,
      'padding_x'      => '3px',
      'padding_y'      => '3px',
      'units'          => 'em',
     ),
   ),
  '#description'   => t('Character to use in form.'),
);
?>

Или убрать фон выбранного элемента и объединить с селектором (так называемый hollow-режим):


<?php
$values = array_merge(range('A', 'Z'), range('a', 'z'));

$form['rs_example_4']['radios_select_4_2'] = array(
  '#type'          => 'radios',
  '#title'         => t('Select character:'),
  '#default_value' => 2,
  '#options'       => $values,
  '#radios_select' => TRUE,     // enables Radios Select for this radios element
  '#rs_attributes' => array(
    'element'         => array(
      'hollow'          => TRUE,   // this sets hollow mode
     ),
    'label'         => array(
      'width'           => 2,
      'height'          => 2,
      'padding_x'       => '3px',
      'padding_y'       => '3px',
      'units'           => 'em',
     ),
   ),
  '#description'   => t('Character to use in form.'),
);
?>

А можно и вставить картинки в селектор, причём выровнять по желанию – либо по верху (по умолчанию), либо по низу (как в этом примере):


<?php
$module_path = url(drupal_get_path('module', 'radios_select'));
$images_path = $module_path . '/examples/images/';

$values = array(
  '<img src="' . $images_path . 'image1.png" /><br />Some image 1',
  '<img src="' . $images_path . 'image2.png" /><br />Some image 2',
  '<img src="' . $images_path . 'image3.png" /><br />Some image 3',
  '<img src="' . $images_path . 'image1.png" /><br />Some image 4',
  '<img src="' . $images_path . 'image2.png" /><br />Some image 5',
  '<img src="' . $images_path . 'image3.png" /><br />Some image 6',
);

$form['rs_example_5']['radios_select_5_1'] = array(
  '#type'          => 'radios',
  '#title'         => t('Select image:'),
  '#default_value' => 0,
  '#options'       => $values,
  '#radios_select' => TRUE,     // enables Radios Select for this radios element
  '#rs_attributes' => array(
    'label'         => array(
      'valign'        => 'bottom', // this sets vertical alignment of labels to bottom
      'font_size'     => 12,
      'line_height'   => 14,
      'padding_x'     => 4,
      'padding_y'     => 4,
     ),
   ),
  '#description'   => t('Select horizontal or vertical image.'),
);
?>

Другой вариант с картинками – выравнивание “в ряд” с текстом метки (можно также задать произвольный vertical-align для изображения, как обычно в CSS, здесь, в примере – просто смещение от базовой линии):


<?php
$module_path = url(drupal_get_path('module', 'radios_select'));
$images_path = $module_path . '/examples/images/';

$values = array(
  '<img src="' . $images_path . 'ru.png" /> Russian Federation',
  '<img src="' . $images_path . 'us.png" /> USA',
  '<img src="' . $images_path . 'ca.png" /> Canada',
  '<img src="' . $images_path . 'fr.png" /> France',
  '<img src="' . $images_path . 'de.png" /> Germany',
  '<img src="' . $images_path . 'it.png" /> Italy',
  '<img src="' . $images_path . 'gb.png" /> United Kingdom',
  '<img src="' . $images_path . 'gr.png" /> Greece',
  '<img src="' . $images_path . 'tr.png" /> Turkey',
  '<img src="' . $images_path . 'ua.png" /> Ukraine',
  '<img src="' . $images_path . 'no.png" /> Norway',
);

$form['rs_example_5']['radios_select_5_2'] = array(
  '#type'          => 'radios',
  '#title'         => t('Select country:'),
  '#default_value' => 0,
  '#options'       => $values,
  '#radios_select' => TRUE,     // enables Radios Select for this radios element
  '#rs_attributes' => array(
    'label'         => array(
      'img_valign'    => '-4px',        // sets vertical alignment of images
      'nowrap'        => 'TRUE',        // disables word wrapping for text in labels
     ),
   ),
  '#description'   => t('Country from where you are.'),
);
?>

А можно упорядочить метки в колонки (любое количество колонок):

<?php
$module_path = url(drupal_get_path('module', 'radios_select'));
$images_path = $module_path . '/examples/images/';

$values = array(
  '<img src="' . $images_path . 'ru.png" /> Russian Federation',
  '<img src="' . $images_path . 'us.png" /> USA',
  '<img src="' . $images_path . 'ca.png" /> Canada',
  '<img src="' . $images_path . 'fr.png" /> France',
  '<img src="' . $images_path . 'de.png" /> Germany',
  '<img src="' . $images_path . 'it.png" /> Italy',
  '<img src="' . $images_path . 'gb.png" /> United Kingdom',
  '<img src="' . $images_path . 'gr.png" /> Greece',
  '<img src="' . $images_path . 'tr.png" /> Turkey',
  '<img src="' . $images_path . 'ua.png" /> Ukraine',
  '<img src="' . $images_path . 'no.png" /> Norway',
);

$form['rs_example_6']['radios_select_6'] = array(
  '#type'          => 'radios',
  '#title'         => t('Select country:'),
  '#default_value' => 0,
  '#options'       => $values,
  '#radios_select' => TRUE,     // enables Radios Select for this radios element
  '#rs_attributes' => array(
    'element'         => array(
      'columns'         => 4,       // this sets ordering by 4 columns
    ),
    'label'         => array(
      'img_valign'      => -4,      // px by default, so we can skip units
      'nowrap'          => 'TRUE',
     ),
   ),
  '#description'   => t('Country from where you are.'),
);
?>

Наконец, труъ-программисты могут полностью изменить вид Radios Select с помощью CSS (стили аттачатся “на лету”, при создании элемента):


<?php
$module_path = url(drupal_get_path('module', 'radios_select'));
$images_path = $module_path . '/examples/images/';

$values = array(
  '<img src="' . $images_path . 'ru.png" /> Russian Federation',
  '<img src="' . $images_path . 'us.png" /> USA',
  '<img src="' . $images_path . 'ca.png" /> Canada',
  '<img src="' . $images_path . 'fr.png" /> France',
  '<img src="' . $images_path . 'de.png" /> Germany',
  '<img src="' . $images_path . 'it.png" /> Italy',
  '<img src="' . $images_path . 'gb.png" /> United Kingdom',
  '<img src="' . $images_path . 'gr.png" /> Greece',
  '<img src="' . $images_path . 'tr.png" /> Turkey',
  '<img src="' . $images_path . 'ua.png" /> Ukraine',
  '<img src="' . $images_path . 'no.png" /> Norway',
);

$form['rs_example_7']['radios_select_7'] = array(
  '#type'          => 'radios',
  '#title'         => t('Select country:'),
  '#default_value' => 0,
  '#options'       => $values,
  '#radios_select' => TRUE,     // enables Radios Select for this radios element
  '#rs_attributes' => array(
    'element'         => array(
      'columns'         => 4,
      'css'             => array(
        'div.type-radios-current {background: #222 url("'. $images_path . 'custom_bg.png") bottom right no-repeat; border-color: #222 !important;}',
        'div.type-radios-current .inner {background: #a8a8a8;}',
        'div.type-radios-current label  {background: #ffc136 url("'. $images_path . 'custom_label_active.png") center center repeat-x !important; border: 1px solid #c35e22 !important; color: black;}',
        'div.rs_opened {background: #222 url("'. $images_path . 'custom_bg_active.png") bottom right no-repeat;}',
        'div.rs_opened .inner {background: none;}',
        'div.type-radios-select {background: #d0d0d0 url("'. $images_path . 'custom_select_bg.png") top center repeat-x !important; border-color: #222 !important;}',
        'div.type-radios-select label.selected {background: #ffc136 url("'. $images_path . 'custom_label_active.png") center center repeat-x !important; border: 1px solid #c35e22 !important; color: black;}',
        'div.type-radios-select label {background: #3a3a3a url("'. $images_path . 'custom_label.png") center center repeat-x !important; border: 1px solid #222 !important; color: white;}',
        'div.type-radios-select label:hover {background: #ffc136 url("'. $images_path . 'custom_label_active.png") center center repeat-x !important;}',
      ),
    ),
    'label'         => array(
      'img_valign'      => -4,
      'nowrap'          => 'TRUE',
     ),
   ),
  '#description'   => t('Country from where you are.'),
);
?>

Все эти примеры (рабочие и с исходным кодом) доступны из help’а модуля Radios Select (см. приложенный архив) по адресу: admin/help/radios_select

Internet Explorer.

В IE, как обычно, всё “не как у людей”. Начнём с того, что все “красивые” закругления в нём отсутствуют. Попытки прицепить JS-библиотеки типа PIE, curved-corner и пр. положительного результата не дали – эти надстройки ломают разметку inline-элементов.

Вторая проблема – IE единственный из браузеров, который не захотел “понимать” клики по меткам. Пришлось специально для него сделать эмуляцию клика по радиокнопке при клике на метке.

Ещё одна особенность конкретно IE6 – курсор почему-то не устанавливается в “hand” (pointer) при hover’е над метками, даже если явно указывать для него правило в CSS.

В общем, базовый функционал в IE всё же обеспечен (по крайней мере версии IE6, IE7, IE8 с Radios Select работают нормально). Но выглядит в нем всё чуть менее красиво.

Поведение при noscript.

При выключенном JS происходит следующее:

1. Скрывается контейнер выбранного (текущего) элемента – тот, который со стрелкой справа.

2. Делается видимым контейнер селектора (который содержит все элементы).

3. Становятся видимыми сами радиокнопки (слева от каждого элемента), таким образом пользователь может выбрать нужный пункт традиционным для radios образом – щёлкнув на элементе.

4. Таким образом, форматирование/оформление Radios Select в основном сохраняется, добавляются только input’ы.


Примечание: IE и здесь ведёт себя несколько отлично от других браузеров. При выключенном JS он не “признаёт” клики на вложенных в метку картинках (IMG) как клики на метке. Только если пользователь кликнул на текст метки или непосредственно на круглый элемент-радиокнопку.

Примечание: при выключенном JS input’ам присваивается свойство float: left (с тем, чтобы сохранить разметку и равные ширины при использовании колонок. Как следствие радиокнопка “уходит” с базовой линии контейнера и автоматически начинает позиционироваться от верха. Это в общем-то никак не сказывается на разных способах вывода элемента – за исключением, когда используется выравнивание по нижнему краю (как в примере с картинками выше). В этом случае кнопки будут расположены на разной высоте:

Желающие могут скачать и установить модуль. Модуль очень нуждается в тестировании под разными браузерами. Пока протестировано в GoogleChrome, Safari, Opera 11, Firefox 8, IE 6,7,8.

Если будете использовать/тестировать элемент под другими браузерами – просьба отписываться здесь о результатах (с указанием версии браузера).

Как бы и всё.

Скачать модуль Radios Select

Источник: http://www.drupal.ru/node/74267

MVC в Drupal. Внедряем Page Controller’ы.

Хочу поделиться с комьюнити модулем controller, который можно взять здесь. В чем смысл модуля?

Модуль позволяет для каждого УРЛа, который вы определяете в hook_menu() прописать действие контроллера. Для этого есть специальный новый элемент ‘action’:

<?php
/**
 * Implements hook_menu().
 */
function controller_menu() {
  $items = array();
  $items['admin/settings/controller'] = array(
    'title' => 'Controller settings',
    'action' => 'SettingsController::indexAction',
    'access arguments' => array('access administration pages'),
  );
  return $items;

?>

Здесь объявляется новый контроллер SettingsController и действие indexAction() которое будет вызывано для УРЛа ‘admin/settings/controller’.

По умолчанию контроллеры должны лежать в специальной папке controllers/. Которую можно создать в папке своего модуля. Имя файла будет таким же как и прописано в ‘action’, однако имя класса нужно дополнять префиксом, который будет равен имени модуля после применения СamelCase нотации (с первой большой буквой). Звучит сложно, чтобы понять какие префиксы добавятся для разных модулей, несколько примеров:

foo_bar станет FooBar my станет My test_my_super станет TestMySuper и т. д.

В примере выше, в хуке меню объявлен контроллер SettingsController, имя модуля controller, значит полное имя класса будет ControllerSettingsController, а имя файла SettingsController.php. Пример как все это дело работает можно найти в самом модуле.

Надеюсь, понятно описал, если есть вопросы, спрашивайте!

P.S. У темы появилось продолжение.

Источник: http://www.drupal.ru/node/74262

Урок один. Создаем модуль на Drupal. Как с Drupal создать форму и вывести данные из формы на этой или другой страници. Хук hook

Пример 1. Как с Drupal создать форму и вывести данные из формы на этой или другой страници.

————————
| Создаем форму |
————————
|
———————————————————————
| Выводим данные с помощью функции variable_get() |
———————————————————————-

Для этого:
Создаем модуль.
Для этого:

- создаем папку и называем ее по названию модуля, например urokone и сохраняем его в my_site/sites/all/modules

- в этой папке создаем в notepad++ два файла в формате utf-8 without BOM. Что такое BOM и где скачать notepad++ смотрим в википедии.

Создаем два файла в этой папке и называем их
urokone.info
urokone.module

1.1. Минимальное содержимое файла urokone.info

; $Id$ name = Urokone   description = Simple form one core = 6.x

; $Id$ //если вы будите выставлаять ваш модуль на Drupal.org то он добавит автоматически свои параметры
name = urokone // название вашего модуля
description = Simple form one //описание
core = 6.x //в нашем случае мы пишем для Drupal 6.

1.2. Минимальное содержимое файла urokone.module

Минимальное содержание этого файла, для того что бы открыть страницу с модулем (с формой), это функция меню.

<?php   function urokone_menu() { $items = array();   $items['urokone'] = array( 'page callback' => 'drupal_get_form', 'page arguments' => array('urokone_formone'), );   return $items; }

$items['urokone'] = array( ); // эта сторочка означает, что форму c названием (Form_ID) urokone_formone, которую я собираюсь вставить в этот модуль можно будет найти после активации если кликнуть на локальном сервере

127.0.0.1/my_site/urokone

Теперь активируем модуль
Для этого:
- кликните в администраривной панели на Administer -> modules
ваш новые модуль будет находится в разделе others. Кликаем чекбокс напроив нашего модуля.
У меня на локальном сервере это выглаядит так:


И кликаем на кнопку Save Configuration. Когда сделаем следующие изменения в модуле надо будет очистить кеш. Administer->Performance->Clear cashed data

2. Пишим весь модуль.

———————————–
2.1 | Создаем меню |
———————————–
|
————————————————————————-
2.2. | Создаем условия доступа для различных пользователей |
————————————————————————–
|
——————–
2.3. | Создаем help |
——————–
|
—————————————————————————-

2.4. | Создаем форму |
———————–
|
———————————————————————————————-
2.5. | Выводим содержиое, которое user вбил в форму на экран (в нашем
случае в блоке)
————————————————————————————————

2.1. Создаем меню.

Для создания меню используем hook – это функции дрюпала. Например hook
function hook_menu()
для нашего модуля мы должны измеить по названию нашего модуля на

function urokone_menu() { $items = array();   $items['urokone'] = array( 'title' => 'Как подтвердить факт отправленния ненулевых данных в форму?', 'description' => 'Urokone first form', 'page callback' => 'drupal_get_form', 'page arguments' => array('urokone_formone'), 'access arguments' => array('access administration pages'), 'type' => MENU_NORMAL_ITEM, );   return $items; }

2.2. Создаем условия доступа различных пользователей.
Используем хук hook_perm()

function urokone_perm() { return array('access urokone content', 'access administration pages'); } // function urokone_perm() 2.3. Создаем help

Используем хук hook_help()

function urokone_help($path, $arg) { $output = ''; //declare your output variable switch ($path) { case "admin/help#urokone": $output = '<p>'. t("Displays information about site") .'</p>'; break; } return $output; } // function urokone_help

Здесь можно сохранить модуль. Помните (Administrator-> modules -> Save configurations) и посмотреть появление строчки “Displays information about site” , если пойти Administer – > help -> urokone

Если на этой страницы кликнуть на urokone то увидим страницу со строкой “Displays information about site”. Мы в хуке help можем заменить эту строку на подробное описание нашего модуля.

———————————————————————————————
Теперь нам осталось
————————
| Создать форму |
————————
|
———————————————————————
| Выводим данные с помощью функции variable_get() |
———————————————————————-
———————————————————————————————-

2.4. Создаем форму

Используем функцию urokone_formone()

Например я хочу сделать такую форму:

Для этого в Drupla мы пишем функцию urokone_formone().

function urokone_formone($form_state) { $form = array();   $form['one_one'] = array( '#type' => 'checkbox', '#title' => 'if ($_REQUEST["text"]) {echo "Data was send";}', '#default_value' => variable_get('one_one', false),   );   $form['one_two'] = array( '#type' => 'checkbox', '#title' => t('if ($_REQUEST("text")) {echo "Data was send";}'), '#default_value' => variable_get('one_two', false), );   $form['one_three'] = array( '#type' => 'checkbox', '#title' => t('if {$_REQUEST["text"]} {echo "Data was send";}'), '#default_value' => variable_get('one_three', false), );       return system_settings_form($form); } // end urokone_formone

Заходим на 127.0.0.1/lesson/urokone

При этом в результате работы функции return system_settings_form($form); появляютя две кнопки “Save configuration” и “Reset to default”

2.5. Выводим содержиое, которое user вбил в форму на экран (в нашем
случае в блоке. Используем хук hook_block.

function urokone_block($op='list', $delta=0) {   if ($op == "list") { $block = array(); $block[0]["info"] = t('urokone'); return $block; } else if ($op == 'view') { switch ($delta) { case 0: $block_content = ''; $block['subject'] = 'urokone';   $one_one= variable_get('one_one', false); $one_two= variable_get('one_two', false); $one_three= variable_get('one_three', false);   if ($one_one or $one_two or $one_three) { if ($one_one) $block['content'] .= 'your answer is correct '; if ($one_two) $block['content'] .= 'your answer is not correct '; if ($one_three) $block['content'] .= 'your answer is not correct'; } break;   } return $block; } } // end urokone_block

Теперь надо активировать новый блок urokone который мы создали. Идем в Administer -> blocks.
Находим наш блок urokone в списке Disabled.

Меняю регион с “none” на другоe. Я например выбрала “Left sidebar”.
И нажимаю на кнопку внизу Save blocks.

Теперь зайдем еще раз на страницу с нащей формой 127.0.0.1/lesson/urokone и кликнми на какой нибудь чекбокс. Например на вророй чекбокс с правильным ответом.
У нас слева в блоке urokone появится сообщение о том на какой чекбокс мы кликнули.

Прикрепленный файл Размер tut1_1.png 29.72 кб tut1_2.png 24.68 кб tut1_3.png 23.3 кб tut1_4.png 47.17 кб tut1_5.png 14.56 кб tut1_6.png 33.72 кб tut1_7.png 56.37 кб tut1_8.png 40.71 кб

Источник: http://www.drupal.ru/node/74258

Урок 2. Создаем модуль на Drupal. Как с помощью хука hook_form_form _ID_ alter изменить любую форму в нашем или чужом модуле.

Я буду использовать модуль, который полностью аналагечен модулю из урока один. Я хочу добавить еще один чекбокс в форму и изменить title у первой страницы.

Изменить форму можно и без использования модуля. Смотрите в комметах sas@drupal.org: Как без использования модуля изменить форму.

Код двух файлов модуля uroktwo:
uroktwo.info

;$Id$ name = Uroktwo description = Tutorial Change form with form_alter core = 6.x

uroktwo.module

<?php ;$Id$ /***************************************************** * Implements hook_menu(). *******************************************************/ function uroktwo_menu() { $items = array(); $items['uroktwo'] = array( 'title' => 'What is the correct way to create MySql database? ', 'description' => 'lesson two form', 'page callback' => 'drupal_get_form', 'page arguments' => array('forma'), 'access arguments' => array('access content'), 'type' => MENU_NORMAL_ITEM, ); return $items; } /***************************************************** * Implements hook_perm(). *******************************************************/   function uroktwo_perm() { return array('access uroktwo content', 'access administration pages'); } // function uroktwo_perm()   /***************************************************** * Implements hook_help(). *******************************************************/   function uroktwo_help($path, $arg) { $output = ''; //declare your output variable switch ($path) { case "admin/help#uroktwo": $output = '<p>'. t("Displays information about site") .'</p>'; break; } return $output; } // function uroktwo_help   /***************************************************** * Implements function forma *******************************************************/   function forma($form_state) { $form = array();   $form['one'] = array( '#type' => 'checkbox', '#title' => t('create.databas()'), '#default_value' => variable_get('one', false), );   $form['two'] = array( '#type' => 'checkbox', '#title' => t('mysql_create_db()'), '#default_value' => variable_get('two', false), );   $form['three'] = array( '#type' => 'checkbox', '#title' => t('create_mysql()'), '#default_value' => variable_get('three', false), );   $form['four'] = array( '#type' => 'checkbox', '#title' => t('create_d()'), '#default_value' => variable_get('four', false), ); $form ['submit'] = array ( '#type' => 'submit', '#value' => t('Submit'), ); return $form; } // end forma   /***************************************************** * Implements hook_block(). *******************************************************/   function uroktwo_block($op='list', $delta=0) {   if ($op == "list") { $block = array(); $block[0]["info"] = t('uroktwo'); return $block; } else if ($op == 'view') { switch ($delta) { case 0: $block_content = ''; $block['subject'] = 'uroktwo';   $one= variable_get('one', false); $two= variable_get('two', false); $three= variable_get('three', false);   if ($one or $two or $three) { if ($one) $block['content'] .= 'your answer create.database() was incorrect '; if ($two) $block['content'] .= 'your answer mysql_create_db() was correct '; if ($three) $block['content'] .= 'your answer create_mysql_db() was incorrect'; } break;   } return $block; } } // end uroktwo_block

Для написания hook_form_FORM_ID_alter нам надо знать значение FORM_ID. Если это наш собственный модуль, то можно просто посмотреть на функцию формы.

function forma ($form_state)

forma в нашем случае и будет Form_ID, а hook будет называтся название_модуль_form_forma_alter. Для нашего модуля это будет uroktwo_form_forma_alter.

Второй способ найти Form_ID это посмотреть source code. Для этого я на локальном компьюторе открываю страницу с формой. В моем случае название сайта lesson. В хуке меню мы в этой строчке определили ($items['uroktwo'] = array()), что форму можно открыть, если набрать 127.0.0.1/lesson/uroktwo.

Откройте страницу с формой. Теперь в интернет эксплоурере идите Page -> view souce. С помощью ctrl – F ищим строчку в которой есть слово form. У меня это

То есть id = “forma”

Теперь собственно хук

<?phpfunction uroktwo_form_forma_alter(&$form,
    &$form_state) {
  $form['one']["#title"] = "I do do not know";
      
   $form['five'] = array(
  '#type' => 'checkbox', 
  '#title' => t('create_data()'),
  '#default_value' => variable_get('five', false),
);
}
?>

Получилась полностью функциональная форма, но кнопка сабмит расположенна выше нового чекбокса.

Давайте это исправим. Добавим строчку weght в хук, и у нас получится

<?phpfunction uroktwo_form_forma_alter(&$form,
    &$form_state) {
  $form['one']["#title"] = "I do do not know";
      
   $form['five'] = array(
  '#type' => 'checkbox', 
  '#title' => t('create_data()'),
  '#default_value' => variable_get('five', false),
  );
$form ['submit'] ['#weight'] = 1000;
}

?>


На этом все.
P.S. Создавать новые модули надо сначала на отдельном, выделенном для этого сайте, а потом уже переносить в реальный сайт.

Прикрепленный файл Размер tut2_1.png 35.34 кб tut2_2.png 31.79 кб tut2_3.png 20.71 кб

Источник: http://www.drupal.ru/node/74214

Новая тема для Drupal 7 – Drupalace Theme

Всем доброго времени суток.

Хочу поделиться радостной новостью – сегодня я наконец выпустил в массы официальный релиз темы с моего блога –  Drupalace Theme. Она представляет из себя блоговый шаблон с разнообразными настройками. Тема в течение пяти месяцев проходила тестирование на моём блоге и завоевала множественные симпатии со стороны посетителей. А так как я человек абсолютно не жадный, то я решил выложить тему в общественное пользование. Тема написана для седьмой версии Друпала.

Основные преимущества:

10 регионов под блоки. Есть даже регион для добавление рекламы под материалом (node bottom) Изменяемая разметка темы Возможность добавления материала в социальные сети (работает через сервис addthis) Навигация по материалам (ссылки на предыдущий и следующий материал) Логин во всплывающем окошке Настраиваемый текст для блока поиска Симпатичный дизайн Хорошая читабельность текста Тема проверялась во всех браузерах, кроме IE6 и ниже. Детальная прорисовка многих мелочей.

Тема, ушедшая в релиз – это улучшенная тема с моего блога. Добавлены настройки, поддержка IE7+, дополнительные иконки.

Почитать подробнее и посмотреть скриншоты вы можете здесь.
Скачать тему можно с официальной страницы  Drupalace Theme.

Всех с прошедшими и будующими праздниками!

Источник: http://www.drupal.ru/node/74022

Управление размерами изображений пользователя в Drupal 7

Одно из немногих оставшихся мест в Drupal 7, которые не получили Field API изменения – это профили пользователей. Вы можете добавлять поля в профили, но стандартные поля остались в старом виде. Это означает, что у вас меньше гибкости при теммизации их и использовании в пользовательском интерфейсе. На пример, в управлении отображением профиля вы не сможете изменить стиль отображения аватара пользователя для каждого дисплея. По умолчанию можно установить только стиль отображения из настроек учетных записей пользователей.

Это не так плохо, но к примеру, если вы используете в профилях пользователей картинки размером 250px, они так же будут использоваться в комментариях и нодах. Если посмотреть тему Batrik то можно увидеть, что там для комментарием используются изображения размером 75х75px, а для нод 20х20px. Но пользователю загружаются оригиналы изображений, а потом масштабируются браузером. Это может повлиять на время загрузки страницы.

К счастью, есть очень простое решение этой проблемы:

Модуль ImageCache Profiles

Этот модуль добавляет 3 новых опции в настройке аккаунта(см. рисунок выше): пресет который будет использоваться при показе аккаунта пользователя, комментариев и нод. На посещаемых сайтах с большим количеством страниц и контента использование этого модуля может значительно уменьшить размер страницы и время её загрузки.

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

Модуль можно скачать по ссылке – http://drupal.org/project/imagecache_profiles

Статья взята с сайта южного сообщества Drupal

Источник: http://www.drupal.ru/node/73758

Контактная форма, форма заказа в custom блоке

Иногда нужно быстро сделать контактную форму или форму заказа и поместить ее как блок на какой-нибудь странице, но нет времени на разработку модуля (или не хватает знаний). Предлагаю модуль simpleForm2. он позволяет создать практически любую форму и любое количество таких форм на сайте. Для построения формы нужно хотя бы поверхностное знание HTML.
Вот страница проекта на drupal.org: simpleForm2
Сразу скачать можно отсюда.

Источник: http://www.drupal.ru/node/73738

Импорт данных из одной формы в другую с помощью AJAX

При создании сайтов досок-объявлений, сайтов поиска работы, каких-либо сервисов, довольно часто встречается необходимость создать возможность динамического заполнения полей формы данными, которые уже были ранее введены, оставив возможность ручного пользовательского ввода.
Данная статья является примером реализации подобного функционала.

Статью можно прочитать на сайте южного Drupal-сообщества

Статья является переводом, первоисточник – Import form values from one form to another via AJAX и является полностью рабочим примером.

Источник: http://www.drupal.ru/node/73094

Custom page – Создание пользовательских страниц

Описание:
Модуль создан для создания пользовательских страниц с возможностью подмены контента, как всей страницы, так и только той части, что выводится в переменной $content.

Возможности:
Создание неограниченного числа пользовательских страниц
Создание сложных путей
Создание путей с именованными параметрами вида %param, %some итд
Создание путей с именованными зарезервированными параметрами вида %node, %user, %modulename_modulename
Создание путей с неограниченным числом параметров (ограничение только на длину URI)
Создание не явных параметров вида %
Создание страниц с указанием ролей, которые могут иметь доступ к этим страницам
Создание страниц с указанием темы
Создание шаблонов страницы как в отдельном файле темы вида [cid].tpl.php, так и в template.php вида [cid]()
Поддержка модуля features для экспорта/импорта страниц
Поддержка модуля context

Подробности тут: http://css.mirocow.com/projects/custom-page/wiki/Wiki
Скачать тут: http://css.mirocow.com/projects/custom-page/repository

Level: Profi

Источник: http://www.drupal.ru/node/73058

#states: Мощное улучшение для разработки интерфейса пользователя в Drupal 7

Изначальная идея #states заключается в том, что бы была возможность создания динамических форм без написания JavaScript как такого. #states разрешает без единой строчки кода JavaScript, только с помощью php и Form API Друпала изменять состояние одного елемента (видимость-visible/invisible, активность – enabled/disabled, необходимость – required/optional, состояние чекбоксов – checked/unchecked, expanded/collapsed сворачивать/разворачивать филдсеты) на основании состояния второго (или даже на основании нескольких елементов) после какого-то действия пользователя.
Полную версию статьи читать здесь

Источник: http://www.drupal.ru/node/72990

Сыграем вместе в мафию? Друпал-посиделки

Давайте в честь наступающего нового года соберемся и дружно сыграем в мафию.

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

В общем, все, кто будут в Москве 25 декабря обязательно приходите:)

В 16.45 ждем всех желающих в Циферблате на Солянке (м.Китай-город, ул. Солянка, 11/6, на углу здания стеклянная дверь – звонить в домофон. Без вывески).

Приходить вовремя, так как ровно в 17.00 игра начнется – “город засыпает”, поэтому опоздавшим придется ждать начала следующей игры, чтобы присоединиться.

Если не умеешь играть? все равно приходи, мы тебя быстро научим!

Условия:
1. Оплата. Согласно формату Циферблата нужно платить поминутно – в первый час 2 рубля в минуту, каждый последующий час – 1 рубль в минуту. За это получаете чай (в неограниченном количестве), сладости, вкусное варенье, можно даже поджарить в тостере хлеб либо положить себе в тарелку понравившееся печенье и бублики.

2. Принеси подарок. Средняя цена подарка не больше 50 рублей – чисто символический. Каждый принесет с собой сюрприз, мы на месте вытянем бумажки с именами гостей и подарим свой подарок тому, чье имя вытянем. Это очень важная часть любого новогоднего праздника! Отговорки типа “не знал, что подарить”, “забыл”, “не успел купить” не принимаются. Принесите то, что самому было бы приятно получить, подумайте, чем удивить человека, которого даже не знаете)
Что дарить?
- что-нибудь вкусное
- что-нибудь сделанное своими руками
- то, что хотелось бы получить самому, но никто почему-то не дарит…
- все, что угодно
- приятную безделушку

3. Оденься красиво. Чтобы у нас было праздничное настроение нужно всем нарядиться:
- парни – поменяйте ради этого события привычные джинсы и свитер на рубашку (вы даже не представляете как нравятся девушкам ребята в белых рубашках – в этом определенно что-то есть:)) и брюки – чтобы нам, барышням, хотелось на вас побольше смотреть и заглядываться;)
- девушки – откажитесь на несколько часов от брюк и джинсов, давайте наденем платье или юбку)

Вот увидите, эти нехитрые хитрости помогут создать особенную атмосферу праздника… буквально на ровном месте.

И напоследок: так как выбранное нами помещение не резиновое, сделаем предварительную регистрацию. Все желающие сыграть в Мафию должны написать об этом в комментах к этой теме в группе вконтакте. Мы очень-очень будем вас ждать:)

Подробности http://vkontakte.ru/topic-32565125_25651784

Источник: http://www.drupal.ru/node/72928

Модуль блока календаря по материалам для Drupal 7

Наконец-то портировал модуль календаря по материалам на Drupal 7 (не без финансовой помощи, правда,  вот этого человека ( namli), а так бы ещё полгода, наверно, портировал)…

Итак, суть модуля:
Простой календарь по материалам, которые можно выбирать либо по дате создания материала, либо по полю типа date (если date установлен, конечно). Если выбор материалов идет по полю, то возможны множественные значения полей (несколько дат на один материал).

Модуль по-прежнему включается как блок и в нем ещё формируется страница типа /calendar/ГГГГ/ММ/ДД для отображения страницы с материалами за выбранный день. Все настройки модуля можно найти в параметрах блока из контекстного меню “Настроить блок”. Обновлены по сравнению с версией модуля для 6-ки выборки по типам материалов и поле с датой. Добавлено изменение заголовков событий. Если раньше все материалы назывались событиями, то теперь можно указать, что это будет (записи, новости, события и т.д.)

Добавлена возможность создания отдельных тем оформления календаря. Сейчас там три темы оформления: стандартная, vista и gridy. Стандартная тема тянется по ширине блока, а vista и gridy фиксированной ширины (198 и 182 точки соответственно).

В темы оформления добавлены симпатичные всплывающие подсказки. Добавлены два типа отображения подсказок
      Стандартный – при наведении указателя мыши на день отображается количество материалов
      Подгрузка ссылок – загружается список ссылок на материалы при наведении указателя мыши на день. Для этого типа можно выбрать количество показываемых ссылок.
В натройках блока:
      ● селектор типов материалов (не надо писать руками)
      ● селектор полей с датой (с проверкой на модуль date)
      ● список тем оформления
      ● изменение подписей к материалам
      ● ссылки во всплывающих подсказках
      ● настройка количества элементов на страницах и в подсказках

Пока только не доделал перевод на английский и файл перевода… а там и на drupal.org выложу

За спасибо, приму копеечки на яндекс.деньги 41001896059641 или заказ на разработку новых модулей )))

UPD от 15 декабря 2011:
обновлен модуль с замечаниями  RxB (все кроме темизации html через функцию, всё-таки считаю не нужным, но если найдутся те, кому позарез надо будет, сделаю), поэтому обязательно при обновлении модуля отключите старую версию, так как ряд функций был переименован.

Прикрепленный файл Размер russian_beauty_calendar.zip 35.73 кб

Источник: http://www.drupal.ru/node/72877

Ищем тех друпаллеров, кому интересно выступать перед публикой, делиться опытом, обучать

Для проведения в Москве семинаров по Drupal

Ищем:
желающих попробовать себя в качестве лектора,
тех, кто много всего освоил и изучил, и теперь хочет поделиться своим опытом,
заинтересованных в построении имиджа эксперта Drupal, консультанта.

Так же будем рады партнерству.

В данный момент особенно нужны:
- специалист по сео-оптимизации;
- специалист по jQuery;
- специалист PHP.

Новосозданная группа вконтакте http://vkontakte.ru/club32565125
Там есть афиша ближайших мероприятий. Приходите – смотрите)
Если интересно сотрудничать, пишите daredjana@gmail.com

В письме укажите, пожалуйста, 1) что вы умеете делать, 2) в чем видите свою роль при нашей совместной работе 3) и что вас мотивирует.

Источник: http://www.drupal.ru/node/72538

CommerceBox — бесплатный дистрибутив интернет-магазина на основе Drupal 7 и Drupal Commerce

Представляем вам сборку интернет-магазина CommerceBox на основе Drupal 7 и модуля Drupal Commerce.

На сегодня среди для Drupal 7 существует практическое единственное нормальное решение, позволяющее создать функциональный интернет-магазин — это модуль Drupal Commerce.

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

С Drupal Commerce все по другому. Этот модуль является более фрейморкным, он рассчитан на программиста. Программисты там могут творить чудеса. Но обычному пользователю либо начинающему программисту нужен легкий старт. Для этого и создана сборка CommerceBox.

В сборке CommerceBox мы пытаемся сделать сделать основу для развертывания интернет-магазина.

Модуль Drupal Commerce базируется на API Drupal, соответственно он автоматически использует все возможности, которые предоставляет ядро Drupal. Кроме того, Drupal Commerce сам по себе имеет довольно мощное API. Если Вы программист то можете без труда расширить функционал вашего магазина используя API как Drupal, так и Drupal Commerce.

Кратко и по сути в сборке сейчас реализованы:

Админка для управления товарами. Некоторые идеи позаимствованы у Мадженты Обертка интернет-магазина: главная, карточка товара, каталог Много визуальных плюшечек

Более детальный и маркетинговый перечень возможностей системы выглядит так (программистам не читать):

Корзина с возможностью управления количеством добавленных товаров Гибкая система прав доступа и администрирования пользователей Отзывы к товарам Социальные закладки Список желаний (WishList) Кнопки Share на Twitter, Google+, Facebook Фильтр поиска товаров Автоматическое создание материала для отображения товара при создании товара Товар с базовым набором полей с возможностью добавления новых полей (поля структурированные по категориям) Выбор пользователем вида представления товаров: списком или сеткой Полный контроль над выводимыми элементов каталога: размер превью, теги, заголовок и тд. Возможность добавления “сопутствующих товаров” Возможность сравнения товаров Новости магазина Последние просмотренные товары Похожие товары Контекстные статьи Контакты магазина Meta-теги для каждой категории или любой избранной страницы. XML карта сайта Пользователи онлайн Список возможностей мы будем наращивать. Наша цель создать сборку для быстрого старта интернет-магазина за минимум потраченного времени и ресурсов.

Сайт ресурса: http://commercebox.org/

Источник: http://www.drupal.ru/node/72159

Создание своего типа материала программно

Здравствуйте! Это aRpi.

Вот решил написать статью не тему “Создание своего типа материала программно”. На изучение этого вопроса, и написание статьи было потрачено 6 часов. В начале и сам не знал как это делать, так что если что то не так, поправьте.

Готовый модуль к статье можно скачать здесь.

Как правило операции по созданию и удалению типа материала выполняются при создании и удалении модуля. В функциях называемых modulename_install и modulename_uninstall, размещенных в файле modulename.install. Однако в нашем случаи, в приложенном к статье модуле, мы будем все делать напрямую. По нажатию кнопки, будет запускаться та или иная функция, создающая или удаляющая тип материала. У меня это функции: mtpn_cretypnod и mtpn_remtypnod.

Весь код модуля целиком приводить не буду.
Напишу лишь код, выполняющий непосредственно создание и удаление типа материала.
Прошу обратить внимание имя модуля у меня “mtpn”.

Кстати! Чтобы просто определить есть ли тип материала достаточно просто попытаться его загрузить, в случаи неудачи будет возвращен false.
Для этого нужно использовать функцию node_type_load передав в неё машинное имя типа материала.

<?php
$sta = node_type_load('mtpn');
?>

И так! Создаем свой типа материала программно:

Для того чтобы создать тип материала, необходимо вызвать функцию node_type_save.
Передав в неё контент материала, на основе которого и будет создан тип материала.

Создаем контент материала, это массив заполненный данными описывающими материал.

<?php
    $inf = array(
        'type' => 'mtpn',
        'name' => 'Наш тип материала',
        'base' => 'node_content',
        'description' => 'Наш тип материала, который был создан программно.',
        'custom' => true,
        'locked' => false,        //замок, если включен запрещает администратору сайта, удалять тип материала в ручную, по умолчанию включен
    );
?>

Затем мы окончательно формируем контент материала, заполнив неуказанные поля дефаултными значениями.

<?php
    $con = node_type_set_defaults($inf);
?>

Следующей функцией в контент материала добавляются поля по умолчанию, свойственные стандартному типу материала.
В частности это поле body, в котором как правило размещается текст любой ноды.

<?php
    node_add_body_field($con);
?>

Создаем тип материала. Этаже функция позволяет сохранить ранее созданный тип материала.

<?php
    node_type_save($con);
?>

Теперь наш тип материала добавлен в базу данных, в таблицу node_type.
Однако он ничем не отличается от типа материала созданного через админку.
И к сожалению, мы даже не можем создать ноду на основе этого типа материала, пункта добавления, на странице “/node/add” ещё нет.

Тип материала нужно ещё настроить.

Продолжаем…

Получаем инстанцию материала, специальный объект который позволяет настроить тип-материал.

<?php
    $ins = field_info_instance('node', 'body', 'mtpn');
?>

Добавляем пункт на страницу “/node/add”, позволяющий создать ноду, нашего типа материала.
Кстати если пункт не появился, возможно необходимо перестроить меню, что мы и сделаем немного позже.

<?php
    $ins['display']['mtpn_list'] = array(
        'label' => 'hidden',
        'type' => 'text_summary_or_trimmed',
    );
?>

Применяем внесённые изменения. Иначе все то что мы проделали с инстанцией материала не имеет смысла.

<?php
    field_update_instance($ins);
?>

Чтобы ноды нашего типа материала не были скучными, добавляем в него уникальные поля.
Создаются поля при помощи функции field_create_field.
Однако после создания их необходимо ещё связать с типом материала.
Связывание осуществляется созданием инстанции поля, функцией field_create_instance.

Создаем поля.

<?php
    //Добавляем поле mtpn_f1, 3 экземпляра текста длиной не более 60 символов.
    field_create_field(
        array(
            'field_name' => 'mtpn_f1',    //указываем префикс соответствующий типу материала, чтобы не запутаться, какое поле к кому относится
            'cardinality' => 3,            //количество элементов, данного типа
            'type' => 'text',
            'settings' => array('max_length' => 60),
        )
    );
    //Добавляем поле mtpn_f2, 1 экземпляр текста неограниченной длины и размера.
    field_create_field(
        array(
            'field_name' => 'mtpn_f2',
            'cardinality' => 1,
            'type' => 'text'
        )
    );
?>

Как только поля будут созданы, они будут добавлены в базу в таблицу field_config.

Создаем инстанции-полей, функцией field_create_instance.
Инстанция поля это такая вещь которая позволяет связать ранее созданное поле с указанным типом материала.
И определить как и в каком виде значение поля будет редактироваться на странице редактирования ноды.

Создаем инстанции полей.

<?php
    //Создаем инстанцию-поля, для поля mtpn_f1.
    field_create_instance(
        array(
            'entity_type' => 'node',
            'bundle' => 'mtpn',
            'field_name' => 'mtpn_f1',
            'label' => 'Значение поля mtpn_f1',
            'widget' => array('type' => 'text_textfield'),
            'display' => array(
                'mtpn_list' => array(
                    'label' => 'hidden',
                    'type' => 'hidden',
                ),
            ),
        )
    );
    //Создаем инстанцию-поля, для поля mtpn_f2.
    field_create_instance(
        array(
            'entity_type' => 'node',
            'bundle' => 'mtpn',
            'field_name' => 'mtpn_f2',
            'label' => 'Значение поля mtpn_f2',
            'widget' => array('type' => 'text_textfield'),
            'display' => array(
                'mtpn_list' => array(
                    'label' => 'hidden',
                    'type' => 'hidden',
                ),
            ),
        )
    );
?>

Перестраиваем меню чтобы пункт добавления ноды в “/node/add” был доступен.
К несчастью это долгая операция но к счастью, мы не так часто будем создавать свой собственный тип материала, так что все в порядке.

<?php
    menu_rebuild();
?>

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

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

Для начала удалим абсолютно все узлы соответствующие нашему типу материала.

<?php
    //Выполняем запрос к базе данных выделив nid-ды узлов соответствующие нашему типу материала.
    $sel = db_query('SELECT nid FROM {node} WHERE type = \'mtpn\'');
    //Вытаскиваем из объекта выделения, массив nid-ов.
    $nid = $sel->fetchAllKeyed(0,0);
    //Удаляем те узлы, nid-ды которых перечислены в передаваемом массиве.
    node_delete_multiple($nid);
?>

Теперь можно приступить к удалению полей, инстанций-полей, и уже после этого удалить тип материала.

Удаляем поля.

<?php
    //Удляем поле mtpn_f1.
    field_delete_field('mtpn_f1');
    //Удляем поле mtpn_f2.
    field_delete_field('mtpn_f2');
?>

Удаляем инстанции полей.

<?php    
    //Получаем массив инстанций полей, принадлежащих тому, к кому они были прикреплены.
    $ins = field_info_instances('node', 'mtpn');
    //Удаляем инстанции полей перечисленные в массиве.
    foreach ($ins as $n => $i) {
        field_delete_instance($n);//здесь $n это имя инстанции
    }
?>

Удаляем тип материала.

<?php
    node_type_delete('mtpn');
?>

Перестраиваем меню чтобы пункт добавления ноды в “/node/add” был уничтожен.

<?php
    menu_rebuild();
?>

Чистка. Подчищает базу, удаляя всякие там уже казалось бы удаленные поля и таблицы.

<?php
    field_purge_batch(1000);
?>

Прикрепленный файл Размер mtpn.zip 3.62 кб

Источник: http://www.drupal.ru/node/71971

Платежный модуль для системы mainpay

Добрый день!
Во вложенных файлах модули для интеграции платежной системы Mainpay и Drupal, а также Drupal ubercart.

Принимают оплату с помощью карт, электронных кошельков (WebMoney, Яндекс.Деньги и прочие) и мобильной коммерции. Помимо этого есть SMS и терминалы.
Если возникнут вопросы или пожелания по модулю – пишите на support@mainpay.ru

Прикрепленный файл Размер mainpay_drupal.zip 10.66 кб uc_mainpay.zip 9.89 кб

Источник: http://www.drupal.ru/node/71718

Opendeals

Opendeals друпал сборка для электронной коммерции
http://drupal.org/project/opendeals

Состав модулей типовой commerce, views, rules, features. Cборка не самая легкая, но тем не менее шевелится. Удобно реализована панель для управления нодами-представлениями продуктов. Добалено несколько правил для управления магазином и демо-контент.

Источник: http://www.drupal.ru/node/71542

© 2009 Обзор CMS