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

Внимание: конкурс! Создай модуль – получи iPad!

Победители объявлены http://startupturbo.com/contest !

Компания Startupturbo проводит конкурс для друпалеров на создание модуля авторизации через mail.ru для drupal7.
Подробности здесь: http://startupturbo.com/contest

Теперь новости о том, как продвигается конкурс, в нашем твиттере https://twitter.com/StartupTurbo и на странице конкурса http://startupturbo.com/contest.
Следите за обновлениями!

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

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

Добрый день!

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

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

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

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

Предосталяет форму для заполнения данных счётчика воды (адрес 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

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

Конкурс модулей для Друпал от Яндекса

Компания Яндекс при участии Российской Друпал Ассоциации объявляет конкурсы на разработку модуюдей для Друпал, содержащие технологии Яндекса. Принять участие может любой совершеннолетний человек — как один, так и в составе группы. Сегодня мы объявляем два конкурса:

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

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

Платежный модуль для системы 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

Интеграция Drupal Commerce & Robokassa

Предлагается для тестирования и использования новый модуль оплаты для  Drupal Commerce через шлюз Робокасса

Итак, тестируйте и пишите отзывы по Commerce Robokassa

ЗЫЖ модуль разработан в сотрудничестве с http://www.internet-marketing.by/

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

[Коллективный заказ] Модуль Яндекс.Карты для Drupal 7

Необходимо разработать модуль Яндекс.Карты для Drupal 7? Прошу сообщить стоимость и сроки.

Примерное ТЗ:
ТЗ модуля Я.Карты для Drupal 7:
- возможность выбора Народной карты Яндекса
- при добавлении ноды пользователь ставит на карте маркер
- при просмотре ноды отображается сама нода и карта с маркером пользователя
- если это возможно, то сделать выбор – что показывать на маркере (Заголовок ноды и, например, поля из ноды)
- (можно и без этого пункта) находясь на странице термина, вывести маркеры всех нод принадлежащих этому термину на карту

Исполнителям: Данный модуль планируется выложить на drupal.ru.
Заказчикам (таким же как я): Думаю модуль Я.Карты для Drupal 7 нужен не одному мне, поэтому желающие скинуться приветствуются.

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

Ajax Microblog – стремимся реализовать Twitter.com

Рад общественности представить новый модуль. Это Ajax microblog. Данный модуль реализует функционал Twitter и будет развиваться в этом направлении. Целью модуля или пакета модулей является организация полной копии функционала предоставляемой всеми известной системой микроблогинга Twitter.com

Ссылка на проект: http://css.mirocow.com/projects/microblog
скачать тут: http://css.mirocow.com/projects/microblog/repository

Спонсор модуля: www.ruh.kz

Прикрепленный файл Размер e6674f3201affd625334c0d00cb96301.jpg 71.2 кб

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

Модуль Промокодов для клуба

Кто помнит или не помнит – я писал когда то, что под заказ пишу модуль для Промокодов (пруфлинк).
Собственно постепенно я его дописываю и сегодня ударным темпом закрыл одну из хотелок.

В чем профит модуля, спросите вы?
Все просто. Если вам нужно пользователю присвоить уникальный номер из заданного диапазона и присвоить ему роль – этот модуль предназначен именно для этого. Администратор генерит промокоды через админку, выдает людям. При регистрации или при редактировании профиля пользователь может указать в специальном поле промокод и получить номер и роль. Полученный номер можно использовать, к примеру, для выдачи значков или футболок и т.п. На роль можно повесить специфические права и доступы.

Для проекта открыл sandbox http://drupal.org/sandbox/softovick/1190802 – если кто желает, может поучаствовать в тестировании и фидбеке. На всякий случай прикрепил к посту архив с модулем.

UPD:
+ добавлен выбор роли, которая присваивается при активации промокода
+ сделан прототип более детального списка промокодов в виде таблицы с ссылкой на профиль пользователя.

Прикрепленный файл Размер promocode.zip 49.19 кб

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

Загрузка поля cck ajax-запросом.

На главной странице есть лента новостей. Она состоит из:
1. Дата новости;
2. Анонс новости;
3. Ссылка на саму новость.

Захотелось мне реализовать ajax-загрузку основного текста новости на место ссылки.
Изучив “как создать свой модуль”, основы javascript, jquery и вспомнив основы php-программирования я все таки реализовал свою идею. Возможно для профи это 5 минутное дело, у меня ушло около 5 дней в совокупности. Работу модуля можете посмотреть на www.appri.ru.
Модуль назвал loadnews. Здесь обноленный код.
Файл loadnews.module: <?php
/*
 * Implementing hook_init
 */

function loadnews_init() {
    drupal_add_css(drupal_get_path('module', 'loadnews') . "/loadnews.css");
  drupal_add_js(drupal_get_path('module', 'loadnews') ."/loadnews.js");
}

/*
 * Implementation hook_perm
 */
function loadnews_perm() {
  return array('access onthisdate content');
}

/**
 * Implementation hook_menu()
 */
function loadnews_menu() {
  // Элемент меню с соответствующим путем
  $items['loadnews'] = array (
    // Функция, которая будет "обрабатывать" путь
    'page callback' => 'loadnews_ajax',
    // Права на доступ к пути
    'access arguments' => array('access content'),
    // Элемент не будет отображаться в меню сайта
    'type' => MENU_CALLBACK,
  );
  return $items;
}

/* Функция обработки запроса */
function loadnews_ajax() {
    /*
     * Ссылка на на новость передается методом GET в переменной 'url'
     * В БД алисы адресов хранятся без первого слеша, поэтом удаляем его
    */
    $url = substr($_GET['url'], 1);
    // По полученному алиасу ищем в таблице url_alias соответствующий системный адрес
    $sys_url = db_result(db_query("SELECT n.src FROM {url_alias} n WHERE dst = '%s'", $url));
    /* Адрес получаем в виде "node/nid". Нам нужно получить параметр nid.
     * Для этого разбиваем строку на массив из 2-х элементов, второй который наш nid
    */
    $sys_url_array = explode('/',$sys_url);
    // Сохраняем наш nid в переменную
    $nid = $sys_url_array['1'];
    // Выбираем поле основного текста новости "field_news_text_value" из таблицы "content_type_news"
    $result = db_result(db_query("SELECT n.field_news_text_value FROM {content_type_news} n WHERE n.nid = '%d'", $nid));
    // Наш ответ клиенту
    drupal_json(array('status' => 1, 'data' => $result));
}
?>

Файл loadnews.js: Drupal.behaviors.loadnews = function(context) { // Добавляем для всех ссылок в блоке новостей class =loadnews $('#block-views-news-block_news', context).find('a').addClass('loadnews') // Реагируем на клик .bind('click', function() { // Передаем с методом get адрес ссылки var href = $(this).attr('href'); // Переменная, это куда мы будем выводить ответ var target = $(this).parents(".field-content"); // Прячем ссылку $(this).hide(); // Вместо нее выводим анимацию $(target).append("<div class=loading></div>"); // Получаем данные с сервера $.get(Drupal.settings.basePath + 'loadnews', {url:href} , function(response) { // Сохраняем ответ в переменной var result = Drupal.parseJson(response); // Прячем анимацию $(target).find(".loading").hide(); // Вместо нее ставим "Свернуть" $(target).append("<span class=hidenews>Свернуть</span>"); $(target).append("<span class=shownews>Подробнее...</span>"); $(target).find(".shownews").hide(); // Создаем блок для вывода текста новости $(target).append("<div class='newstext'></div>"); // Изначально блок будет скрыт, чтобы потом красиво его развернуть $(target).find("div.newstext").hide(); // Загружаем текст из переменной в блок $(target).find("div.newstext").html(result.data); // Красиво раскрываем наш блок $(target).find("div.newstext").slideDown("fast").addClass("active"); // Реализация скрытия и раскрытия блока (нужно оптимизировать код) $(target).find(".hidenews").click(function() { $(target).find(".hidenews").hide(); $(target).find("div.newstext").slideUp("fast").removeClass("active"); $(target).find(".shownews").show(); }); $(target).find(".shownews").click(function() { $(target).find(".shownews").hide(); $(target).find("div.newstext").slideDown("fast").addClass("active"); $(target).find(".hidenews").show(); }); }); return false; }); }

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

Прикрепленный файл Размер loadnews_v6.x-1.6.zip 3.62 кб

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

Фотогалерея для Drupal 7 (ajax)

Статья здесь – http://drupal.in.ua/content/fotogalereya-dlya-drupal-7-ajax
Тестовый сайт – http://gallery.drupal.in.ua
Реализует функционал фотогалереи с просмотром фото при наведение «мыши» на миниатюру и листанием миниатюр с использованием технологии ajax.

Особенности:

Модуль создает свой тип материала для галереи; Создает свой тип стиля изображения ( Image style ) для миниатюр; Не требует дополнительных модулей (contributed modules); Просмотр фото, при наведение указателя «мыши» и при клике на миниатюру; Плавное появление изображения при просмотре; Ссылка на полное изображение с возможностью открытия в окне (window.open) Работает при отключенном js; Дополнительные настройки (admin/config/content/drig) не обязательны; Проверена совместимость с браузерами IE6/…, FireFox, Opera, Chrome, Safari.

27/05/2011: версия 2 – устранены визуальные искажения при медленной загрузке картинок.
28/05/2011:

Во время процесса загрузке image навигация отключается “Бегунок” загрузки помещен на image При навигация превью появляются плавно после полной подгрузки (ajax)

31/05/2011

Добавлена проверка корректности навигационной ссылки, при ручном вводе; Добавлена обработке ajax status error

01/06/2011
Добавлена возможность использование в любом материале с полем типа image. ( настройка на странице admin/config/content/drig )

Прикрепленный файл Размер drig.zip 22.43 кб

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

Модуль uc_sberbank

Модуль выставления счета “сбербанка”

функциональность

Создание платежки на базе шаблона
Защита платежки от просмотра третьими лицами
Сохранение платежки в личном кабинете.
Отправка платежки на почту клиента.
Отправка платежки на почту компании, на адрес. куда поступают письма с заказами.

Скачать http://css.mirocow.com/projects/sberbank/files

Реализация

1. Создание платежки на базе шаблона

Платежка формируется из JPG темплэйт файла. Заполнение платежки происходит с помощью imagettftext.
Данные платежки имеют защищенный вид хранения. Принцип формирования платежки аналогичен ImageCache.
Защита платежки строится след принципом. Создается каталог хранения платежек sites\default\files\sberbank.
В нем создаются каталоги с именем UID пользователя, в которых лежат хеши платежек вида 55_fe8a0ea4ce326398482061ad5eb1e58d.jpg.
Где fe8a0ea4ce326398482061ad5eb1e58d строится из md5(номера ордера + drupal_private_key), благодаря чему, хеши всегда будут иметь уникальный вид. (подбор хеша невозможен – защита от просмотра третьими лицами)

2. Сохранение платежки в личном кабинете

Для доступа к платежам используется URI вида http:// имя_сайта /sberbank/номер ордера.jpg. Данная ссылка и сама картинка выводится в управляющем меню счета и доступна владельцу счета или администратору магазина.

3. Отправка платежки на почту клиента
Для шаблона писем формируются токены след вида: защищенный и прямой
Примеры:

* http:// имя_сайта /sites/default/files/sberbank/58.png – защищенный
* http:// имя_сайта /sites/default/files/sberbank/5/55_fe8a0ea4ce326398482061ad5eb1e58d.jpg – полный путь до файла платежки

4. Отправка платежки на почту компании, на адрес. куда поступают письма с заказами

Данные формируются аналогично пункту 4
Требования

* Используемые модули (зависимости): Token
* Необходимые библиотеки: GD

Модуль настроен и работает тут http://motodart.ru

Подробнее тут: http://css.mirocow.com/projects/sberbank/wiki/Wiki

Прикрепленный файл Размер sberbank.gif 2.82 кб

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

Патч модуля для редиректа внешних ссылок Gotwo

Многим знаком модуль  gotwo. Он делает редирект внешних ссылок. Неудобство модуля в том что он использует нестандартный тег GO. Решил его поправить. Чтобы не было необходимости использовать нестандартные теги. Так-же в оригинальном модуле создавался новый элемент. Я же решил вносить изменения для редиректа в стандартный тег A если установлен класс GO.
Собственно сами изменения. Прошу указать на ошибки, если что не так.
Меняем только функцию _gotwo_link в файле gotwo.module
Было

<?php
function _gotwo_link($text, $filter) {
  $html_dom = filter_dom_load($text);

  $goNodesToRemove = array();
  foreach ($html_dom->getElementsByTagName('go') as $goNode) {
    // Clone <go> link to <a> link and keep all attributes intact.
    $linkNode = $goNode->ownerDocument->createElement('a');
    if ($goNode->attributes->length) {
      foreach ($goNode->attributes as $attribute) {
        $linkNode->setAttribute($attribute->nodeName, $attribute->nodeValue);
      }
    }

    // Clone all <go> child nodes inside the new <a> tag.
    while ($goNode->hasChildNodes()) {
      $childNodes = $goNode->childNodes;
      $linkNode->appendChild($childNodes->item(0));
    }

    // Verify if the url exists in the {gotwo} table. If the url is missing,
    // add the url with link title to the {gotwo} table.
    $href = $goNode->getAttribute('href');
    $title = $goNode->getAttribute('title');

    if (!empty($href)) {
      $linkNode->setAttribute('href', _gotwo_get_url($href, empty($title) ? NULL : $title));
    }

    // Insert the new $linkNode before the previous $goNode.
    $goNode->parentNode->insertBefore($linkNode, $goNode);

    // Save $goNode to remove array. We cannot remove the child here or the DOM
    // index will be cluttered and every second <go> link is not replacement.
    $goNodesToRemove[] = $goNode;
  }
?>

Стало

<?php
function _gotwo_link($text, $filter) {
  $html_dom = filter_dom_load($text);

  $goNodesToRemove = array();
  foreach ($html_dom->getElementsByTagName('a') as $goNode) {
    // Clone <go> link to <a> link and keep all attributes intact.
    if($goNode->getAttribute('class') == 'go') {
    $href = $goNode->getAttribute('href');
    $title = $goNode->getAttribute('title');
    if (!empty($href)) {
      $goNode->setAttribute('href', _gotwo_get_url($href, empty($title) ? NULL : $title));
    }
    
  }
  }

  // Now we are able to remove the child's without loosing the index.

  $text = filter_dom_serialize($html_dom);

  return trim($text);
}
?>

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

Экспорт в Яндекс.Новости

Сделал модуль для экспорта ленты сайта в Яндекс.новости.
Для views, с гибкими настройками маппинга полей. Под семерку.
Просьба потестить и рассказать про результаты проверки Яндексом ваших лент.
Баги – в issue tracker модуля, но можно и сюда.

http://drupal.org/project/ynews

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

Модуль для подключения препроцессора Less

http://dl.dropbox.com/u/6717893/less.zip

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

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

Disable vertical tabs (модуль для Drupal 7)

Привет всем! С переходом на Drupal 7 мне очень непонравилось то, что вертикальные закладки “vertical tabs” в наглую включили в ядро друпала и что самое ужасное – нигде в пользовательском интерфейсе это невозможно отключить. В то время как под D6 это был отдельный модуль, который можно было установить и включить по желанию.

После чего мною был сделан модуль, который при обработке форм везде где встречаются вертикальные закладки заменяет их на обычные поля “fieldset” как это было в Drupal 6 по-умолчанию.

http://drupal.org/sandbox/Dripman/1077122 – ссылка на сам модуль на drupal.org (качаем через GIT)

Или отсюда disable_vertical_tabs.zip

Прикрепленный файл Размер disable_vertical_tabs.zip 915 байтов

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

CMLService 2.08 – Модуль обмена данными с 1С

Модуль обмена данными с 1С (использует формат данных CommerceML 2)

Настройки

Для облегчения интерфейса и для стабильности хода выполнения операций, импорт продуктов из 1С разделен на 3 этапа.

Операция удаления продуктов

Операция импорта продуктов из 1С

Операция импорта ценовых предложений из 1С

Импорт
# Удаление ранее импортированных товаров (batch process)
# Импорт в полуавтоматическом режиме категорий из 1С (batch process)
# Импорт в полуавтоматическом режиме позиций товара, с привязкой к категориям (batch process)
# Импорт ценовых предложений из 1с
# Автоматический импорт (возможен только с модулем 1С www.cmlservice.com)

Экспорт
# Экспорт заказов из 1С
# Экспорт контрагентов из 1С
# Автоматический экспорт (возможен только с модулем 1С www.cmlservice.com)

скачать

Источник

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

CMLService 2.08 – Модуль обмена данными с 1С

Модуль обмена данными с 1С (использует формат данных CommerceML 2)

Настройки

http://drupal.org/project/cmlservice (теперь и на .org)
https://bitbucket.org/mirocow/cmlservice (и на bitbucket.org)

Для облегчения интерфейса и для стабильности хода выполнения операций, импорт продуктов из 1С разделен на 3 этапа.

Операция удаления продуктов

Операция импорта продуктов из 1С

Операция импорта ценовых предложений из 1С

Импорт
# Удаление ранее импортированных товаров (batch process)
# Импорт в полуавтоматическом режиме категорий из 1С (batch process)
# Импорт в полуавтоматическом режиме позиций товара, с привязкой к категориям (batch process)
# Импорт ценовых предложений из 1с
# Автоматический импорт (возможен только с модулем 1С www.cmlservice.com)

Экспорт
# Экспорт заказов из 1С
# Экспорт контрагентов из 1С
# Автоматический экспорт (возможен только с модулем 1С www.cmlservice.com)

скачать

Источник

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

Модуль date_picker

date_picker – Модуль привязки всплывающего календаря к любому CCK полю.

Для одного из проектов понадобилось прикрутить календарь к текстовому полю. Так как поле было сильно завязано на ряд модулей, было решено сделать обработчик вывода CCK поля. Препроцессинг вывода поля позаимствовал у CKeditor.

Исправленно определение локали
Добавлена поддержка текстовых полей
Добавлены зависимости модулей

Применяемые hooks:
content_field_edit_form – Функция препроцессора CCK поля
date_picker_content_fieldapi – Функция из API CCK ‘hook_content_fieldapi’
date_picker_elements – Функция для добавления действий с полем

Урл JS скрипта http://www.dynarch.com/projects/calendar/
Если у кого есть какие пожелания. пишите.
Настройки:

Внешний вид

Это пока глубокая альфа.

Прикрепленный файл Размер date_picker.rar 110.78 кб

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

Модуль date_picker

date_picker – Модуль привязки всплывающего календаря к любому CCK полю.

Для одного из проектов понадобилось прикрутить календарь к текстовому полю. Так как поле было сильно завязано на ряд модулей, было решено сделать обработчик вывода CCK поля. Препроцессинг вывода поля позаимствовал у CKeditor.

Исправленно определение локали
Добавлена поддержка текстовых полей
Добавлены зависимости модулей

Применяемые hooks:
content_field_edit_form – Функция препроцессора CCK поля
date_picker_content_fieldapi – Функция из API CCK ‘hook_content_fieldapi’
date_picker_elements – Функция для добавления действий с полем

Урл JS скрипта http://www.dynarch.com/projects/calendar/
Если у кого есть какие пожелания. пишите.
Настройки:

Внешний вид

Это пока глубокая альфа.

Прикрепленный файл Размер date_picker.rar 110.78 кб

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

Модуль, который позволяет обрезать фотографии и сохранять их на сервере

Недавно пришлось написать модуль, который обрезает изображения и автоматически сохраняет их на сервере. Назвал его image_cropper. Решил поделиться, может кому пригодится в хозяйстве. Скрипт изменения размеров взят отсюда (качать не надо, он уже запакован в модуле).
Перед употреблением прочитайте README.txt, там всего 2 строки.

Единственное что не удалось реализовать – это выбор контейнера, внутри которого будут обработаны все картинки, с помощью настроек внутри друпала, а не с помощью изменения js-файла. Если у кого-то есть идеи как это сделать – буду очень благодарен. Модуль в аттаче

Прикрепленный файл Размер image_cropper.rar 7.31 кб

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

Модуль, который позволяет обрезать фотографии и сохранять их на сервере

Недавно пришлось написать модуль, который обрезает изображения и автоматически сохраняет их на сервере. Назвал его image_cropper. Решил поделиться, может кому пригодится в хозяйстве. Скрипт изменения размеров взят отсюда (качать не надо, он уже запакован в модуле).
Перед употреблением прочитайте README.txt, там всего 2 строки.

Единственное что не удалось реализовать – это выбор контейнера, внутри которого будут обработаны все картинки, с помощью настроек внутри друпала, а не с помощью изменения js-файла. Если у кого-то есть идеи как это сделать – буду очень благодарен. Модуль в аттаче

Прикрепленный файл Размер image_cropper.rar 7.31 кб

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

Как можно программно создать форму для изменения значений ССК поля ноды

Иногда может потребоваться изменять значения какого-то CCK поля ноды не обновляя всю ноду.
Выкладываю заготовку для решения такой задачи (по мотивам тестового задания restyler).
В нижеприведенном коде создаются пути типа ‘test-form/%node’, на страницах с этими адресами выводится форма для заполнения одного CCK поля (сейчас захардкоденного, но легко меняется на выбираемое из админки или даже несколько полей) и кнопка сабмита для отправки формы. После отправки поле соответственного нода будет обновлено, в том числе работает с полями множественного выбора. Например, если зайти на страницу ‘test-form/4′ и есть такой нод и у него есть поле ‘field_test’, то после сабмита формы на этой странице у нода 4 в поле field_test будут обновленные значения.
Валидацию не делал, надо доделывать, если будете использовать где-то.

<?php

/**
 * Implementation of hook_menu().
 */
function test_module_menu() {
  $items = array();
  $items['test-form/%node'] = array(
    'page callback' => 'drupal_get_form',
    'page arguments' => array('test_form', 1),
    'access arguments' => array('access content'),
    'type' => MENU_CALLBACK,
  );
  return $items;
}

function test_form(&$form_state, $node) {
  $form['#node'] = $node;
  $field_name = 'field_test';
  $field = content_fields($field_name, $node->type);  
  $form['#field_info'][$field_name] = $field;  
  module_load_include('inc', 'content', 'includes/content.node_form');
  $form_element = content_field_form($form, $form_state, $field);
  $form += (array)$form_element;
  $form['submit'] = array(
    '#weight' => 100,
    '#type' => 'submit', 
    '#value' => t('Save'),
  );  
  return $form;
}

function test_form_submit($form, &$form_state) {
  //$f_name = 'field_test';
  $node = $form['#node'];
  $type_name = $node->type;
  $type = content_types($type_name);
  foreach ($type['tables'] as $table) {
    $schema = drupal_get_schema($table);
    $record = array();
    foreach ($schema['content fields'] as $field_name) {
      if (isset($form_state['values'][$field_name])) {
        $field = content_fields($field_name, $type_name);
        // Multiple fields need specific handling, we'll deal with them later on.
        if ($field['multiple']) {
          continue;
        }
        $db_info = content_database_info($field);
        foreach ($db_info['columns'] as $column => $attributes) {
          $record[$attributes['column']] = $form_state['values'][$field_name][0][$column];
        }
      }
    }
    if (count($record) || empty($schema['content fields'])) {
      $record['nid'] = $node->nid;
      $record['vid'] = $node->vid;
      if (db_result(db_query("SELECT COUNT(*) FROM {". $table ."} WHERE vid = %d", $node->vid))) {
        content_write_record($table, $record, array('vid'));
      }
      else {
        content_write_record($table, $record);
      }
    }
  }

  // Handle multiple fields.
  foreach ($type['fields'] as $field) {
    if ($field['multiple'] && isset($form_state['values'][$field['field_name']])) {
      $db_info = content_database_info($field);
      // Delete and insert, rather than update, in case a value was added.
      db_query('DELETE FROM {'. $db_info['table'] .'} WHERE vid = %d', $node->vid);
      foreach ($form_state['values'][$field['field_name']] as $delta => $item) {
        if($delta === $field['field_name']. '_add_more') continue; 
        $record = array();
        $not_empty = 0;
        foreach ($db_info['columns'] as $column => $attributes) {
          if($item[$column] && !$not_empty) $not_empty = 1;
          $record[$attributes['column']] = $item[$column];
        }
        $record['nid'] = $node->nid;
        $record['vid'] = $node->vid;
        $record['delta'] = $delta;
        //drupal_set_message(var_export($record, TRUE));
        if($not_empty) content_write_record($db_info['table'], $record);
      }
    }
  }
  cache_clear_all('content:'. $node->nid .':'. $node->vid, content_cache_tablename());
}
?>

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

Выпуск новых версий модулей. PGAPI beta6, pg_account beta1. Нужна помощь в написании документации.

Привет всем.

Для тех, кто пользуется pgapi есть хорошая новость – я таки выпустил новую версию.

В самом ядре pgapi изменений минимум – добавилась одна функция – pgapi_format_price_plain, которая выводит отформатировано сумму с символом валюты без html тегов.

Так же поправил опечатки и баги в платежных модулях pg_roboxchange, pg_webmoney. Добавил пару сообщений о необходимости поддержки XML/Serializer хостингом.

Серьезные изменения коснулись сабмодуля pg_account, который я вынес в отдельный проект на теперь – http://drupal.org/project/pg_account.

Протестировать работу новых версий можно тут: http://pgapi.devstaff.org/. Достаточно авторизироваться и попросить меня пополнить баланс на некую сумму.

Из новых возможностей:
- возможность иметь свою валюту для каждого языка (полезно для мультисайтинг инсталяций)
- история пополнения и снятия с баланса
- более продуманный UI страницы Лицевого счета.
- цветовое кодирование истории операций
- поддержка “операторов” выполняющих функции вывода денег с баланса (работает так. клиент подяет заявку на вывод. с его баланс а снимаются деньги, оператор видит у себя в списке запрос на вывод. отправляет деньги на реквизиты, и меняет статус операции на завершенную)
- грамотное раставление класов для елементов, позволяющее менять фофрмление страницы
- новые хуки (hook_accountTabs, hook_operatorTabs) для построения “закладок” на странице лицевого счета
- что то еще, но не помню что)

Из необычного.
- я отказался от стандартного друпал пейджера, он был заменен на конструкцию “Show 10 20 22 of 22 records”. Считаю ее более логичной.
- сделал свои “активные” табы, которые можно дополнять по хукам (hook_accountTabs, hook_operatorTabs) . Например вы хотите сделать свой таб “быстрая оплата услуг сайта”. В своем модуле делаете реализацию хука и по аналогии с pg_account_accountTabs реализовываете его поддержку. Все, закладка появится сама, будет сама открываться закрываться по клику, вам же надо обеспечить фору отображения и процессинг сабмита.

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

Вобщем жду ваших писем и мы как то решим, как именно вы сможете помочь проекту.

PS спонсор проекта Друпал Хостинг.

Прикрепленный файл Размер screen_shot_2010-10-31_at_2.21.26_pm.png 77.94 кб

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

Опыт использования и допиливания модуля спортивной статистики (футбольной)

Здравствуйте!

Хочу представить вам статью, которую я написал после опыта использования модуля LeagueSite модуль. Это относительно новый модуль спортивной статистики. Идея о написании родилась по ходу работы над проектом, захотелось донести до Drupal общественности полезную инфу о выборе подобного модуля. В статье я попытался описать все стороны прикручивания этого модуля к проекту, а также описал основные возможности и средства, которыми всё было осуществлено. Сейчас статья в песочнице Хабра потому как аккаунта нет. Если будет интересно и нужно, то сделаю перепост сюда, если конечно не получу инвайт на хабре))

http://habrahabr.ru/sandbox/18967/

UPD, в общем решил сюда перенести, плюс дополню на днях по просьбам

Здравствуйте! Из всего многообразия модулей созданных для Drupal есть не более десяти, посвящённых спортивным соревнованиям. Это странно, потому что сайтов, посвящённых разным видам спорта, довольно много. Мне самому пришлось столкнуться с дефицитом подобных модулей. Последним проектом, над котором я работал, был eurofootball.ru.

В ТЗ заказчик запросил модули новостной ленты, блогов, статей из ежемесячного журнала и еженедельной газеты, ну, и, самое главное, статистику по основным европейским чемпионатам. Всё, кроме последнего, было легко реализовано функционалом самой сms. Также я использовал несколько довольно известных модулей, таких как Advertisement для блока с рандомно-сменяющимися обложками журнала и газеты, Advanced Poll для возможности анонимного голосования с одного ip раз в 24 часа. Ну и стандартный набор Views, ImageCache, Panels, Content Construction Kit (CCK).

Для самой главной задачи — футбольной статистики — я долго искал подходящий модуль, пробовал clubindex, Results, Sports Club Management. Они не подошли либо из-за недостаточной функциональности, либо нужно было ставить столько зависимых модулей Sports Club Management), что опускались руки. В итоге выбор пал на LeagueSite модуль. Версия модуля была alpha 1 или 2, честно говоря, уже не помню, но было понятно, что, во-первых, предстоит покопаться в коде, а во-вторых, ждать развития модуля. Повезло, что автор модуля, Alun, шёл на контакт с энтузиазмом.

В первые пару недель я настроил модуль, перевёл всё необходимое на русский. На тот момент была возможность создания нескольких лиг, возможность занесения новых результатов, жутко тормозная админка матчей (мне нужно было одновременно админить с десяток лиг, а это порядка 600 команд, и матчи каждой из них выводились сразу, а уж потом можно было отфильтровать). Составов и, соответственно, статистики игроков не было, а заказчику нужен был реузльтат. Также не было некоторых других мелочей, вроде логотипов команд, информации о командах (вроде тренера и города из которого была команда), нормальной таблицы. Мелочи быстро сделал, страница команды стала выглядеть так:

Ну, а страница лиги так:

Здесь можно увидеть лого команды (кликабельно), родной город команды, название (кликабельно).

Я решил реализовать всё это стандартным набором модулей. Создал тип материала «Игрок». Связал его по node reference с «Командой». Наполнил игроками все основные команды.

После этого нужно было вывести текущие матчи, анонс и таблицы по каждой из лиг в блоки в правой части сайта. Всё сделал с помощью Views, единственное, пришлось немного пошаманить над видом вывода матча, в оригинале модуля было так “Команда 1 — Команда 0″, это не очень здорово. Сделал так:

После этого принялся за Календарь. Здесь опять же использовал Views плюс Panels, но эта часть получилась очень «тяжёлой» (очень много запросов к БД).

К тому времени автор модуля продвинулся ещё и сам сделал добавление игрков, однако, прикрутить обновление себе я уже не мог, слишком много было сделано. Объеденить наши усилия возможности тоже не было. Прошла новая волна переговоров с автором модуля. За это время сделал более приятный вывод статистики матча (посмотрите здесь на матч 10 тур, 10 мая 2010 г., Амкар — Зенит). Добавил вывод статистики по каждому игроку, время на поле, забитые мячи, красные и жёлтые карточки.

Ну, и осталась последняя часть, это вывод статистики по отдельным игрокам, рейтинг бомбардиров и т.п. Вот здесь я застопорился… Пытался опять же по node reference завязать, но так и не понял каким должен быть правильный запрос к бд, чтобы собиралась и складывалась статистика по игроку, например общее количество мячей.

К сожалению, возникли непредвиденные проблемы и заказчик принял решение прекратить развитие проекта. Сейчас, как видите, идёт только обновление новостной ленты…

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

Выводы:

-Действительно подходящего и готового модуля нет, всегда нужно «допиливать», само собой это не касается стандартных модулей

-На стадии переговоров необходимо обсудить все грани работы, постараться дать чёткие сроки, либо объяснить от чего они зависят

-Важно изначально правильно оценить свои возможности, в процессе «подучиться» не получится

 

Если тема окажется интересной, буду рад ответить на все ваши вопросы)

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

С уважением,
Сергей

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

Модуль авторизации Loginza

Всем привет!

Выкладываю первую версию модуля авторизации с помощью Loginza.ru

Поддерживаемые провайдеры: http://loginza.ru/features-and-benefits?sid=ca42687a5ba7454a097e022152e6…

Сразу после установки добавится роль Loginza User. Ей можно назначить нужные права. На странице admin/settings/loginza можете поставить галочки, где в комментариях надо выводить иконку провайдера.

УСТАНОВКА:

В файл settings.php вставьте:
$conf['cache_inc'] = ’sites/all/modules/loginza/cache.inc’; // путь к модулю

ВАЖНО:

Так как модуль создавался для комментирования анонимами, то полноценной авторизации не происходит. Юзер, залогиненный таким макаром, остается Гостем, но с отключенным кэшированием страниц и с ролью Loginza User.

Поэтому: если вы используете свой собственный обработчик кэша ($conf['cache_inc']), отличный от ./includes/cache.inc, вам надо внести в него изменения (см. cache.inc в модуле).

Прикрепленный файл Размер loginza-6.x-1.0b.zip 32.84 кб

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

Разработка плагина для файлового менеджера elFinder

Здравствуйте, сообщество!

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

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

NotCaptcha for Drupal

Добрый день.

Мы портировали wp-plugin “NotCaptcha Antispam” на Drupal 5.x, 6.x.

Скриншот:

Посмотреть как работает можно вот здесь: http://cloudgears.com/notcaptcha-for-drupal

Хочется критики, замечаний, пожеланий

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

Белый Дом открыл код нескольких модулей для CMS Drupal

На сайте резиденции Президента США whitehouse.gov появилось объявление о выпуске под свободной лицензией нескольких модулей для системы управления web-контентом Drupal, тем самым Белый дом продемонстрировал не только приверженность к использованию открытого ПО на потребительском уровне, но и желание непосредственного участия в жизни сообщества независимых разработчиков, внося свою лепту в развитие Open Source.

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

Открытые Белым домом модули добавляют функциональность к Drupal в трех основных направлениях:

* Масштабируемость. Модуль “Context HTTP Headers” позволяет добавлять произвольные мета-данные в зависимости от обрабатываемого контента. На сайте whitehouse.gov модуль используется для задания различного времени кэширования страниц в зависимости от их типа, например, для новостей время кэширования может быть установлено в 15 минут, а для статей – 30 минут.

Второй открытый в данной категории модуль “Akamai” дает возможность организовать использование на web-сайте распределенной сети быстрой доставки контента (Content Delivery Network) Akamai, отдающей посетителю контент с ближайшего к нему сервера.
* Обратная связь с посетителями. Модуль “GovDelivery” нацелен на обеспечение интеграции ранее используемого для взаимодействия с общественностью списка почтовой рассылки, отправлять сообщения в который теперь посетители могут через сайт. Для администрации предусмотрен web-интерфейс для предварительного модерирования сообщений. К работе модуля привлечены и другие открытые модули, например, обработка очереди сообщений производится при помощи интерфейса drush, а мониторинг работы сервиса – с привлечением Nagios.
* Доступность сайта для людей с ограниченными возможностями. Модуль “Node Embed” нацелен на обеспечение снабжения мета-данными всех размещаемых на сайте изображений и видеороликов для их надлежащего восприятия в системах экранного чтения, используемых при открытии сайта людьми с нарушенным зрением.

Источник

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

Модуль для экспорта в Яндекс.Новости

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

Что сейчас позволяет делать модуль:

Генерация страницы yandexnews.xml в формате годном для Яндекс.Новостей. Настройка выводимых в ленте материалов (количество, типы материалов). Настройка изображения для канала

Что ещё планируется сделать:

Добавление к элементу item следующих вложенных элементов: author category enclosure yandex:genre Создание плагина для Views Публикация модуля на Drupal.org

Так же существует другой подобный модуль.
Посмотреть его можно здесь: http://drupal.ru/node/25954

Жду ваших отзывов:)

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

Прикрепленный файл Размер yandexnews.zip 9.22 кб

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

48 советов для программистов от Lullabot [перевод]

48 Essential Drupal Development Tips From Lullabot

Оригинал статьи
http://www.missingfeatures.com/2010/02/16/48-essential-drupal-developmen…

От переводчика:
Автор статьи принимал участие в 4-х дневном курсе обучения Drupal от Lullabot по таким направлениям как: темизация, API форм, API меню, разработка модулей, jQuery и лучшие практики.

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

UPD: для хабралюдей: http://habrahabr.ru/blogs/drupal/86073/

1. Выводите переменную $body_classes в атрибут “class” тега “body” в вашем файле page.tpl.php для того, что бы иметь возможность использовать различные классы страничек, например “front” – главная, “not_front” – не главная, “logged-in” – для залогиненных и пр.

2. Страничка “/admin/build/block” это единственная админская страница, на которой не используется администраторская тема оформления. Это сделано для того, что бы вы имели представление о местонахождении своих блоков на сайте.

3. Чаще всего в шаблон page.tpl.php забывают вставлять переменные $closure и $tabs.

4. Наиболее распространенным методом темизации является копирование файлов шаблонов из модулей или тем оформления и редактирования их под свои потребности.

5. Для решения проблем с различным порядком слов в различных языках используйте плейхолдеры. Например:$variables['submitted'] = t(’On @date’, array(’@date’=>format_date($variables['created'],’custom’,'F jS’)));

6. [Лучшая практика] В случае обновления системы лучшей практикой является стирание и создание заново тех темизирующих функций, которые вы переопределяете. Таким образом вы можете включить любые изменения кода, которые вы не захватили.

7. Если вы не хотите использовать переменную $content в шаблоне node.tpl.php, то не используйте. Вы можете выводить различные поля отдельно друг от друга.

8. [Производительность] Во вьюс предпочитайте использовать стиль ряда “Fields” (поля), а не “Nodes” (ноды). В режиме “Nodes” происходит вызов node_load() на каждой ноде в вашем виде, что может стоить вам более 50 запросов на каждую ноду. В режиме “Fields” происходит просто сбор необходимой информации в одном запросе.

9. Обратите внимание на функцию dsm() – это что то типа функции pr() в CakePHP (http://cakephp.org/). Эта функция может выводить на страницу сложные структуры данных в удобном для восприятия виде. Требуется модуль  devel (http://drupal.org/project/devel).

10. Группируйте кастомные модули в одной и той же “группе” (“package”) и тогда Вам не придётся рыскать по странице со списком модулей в поисках того или иного модуля.

11. Для отслеживания изменений в API между D6 и D7 используйте модуль  coder (http://drupal.org/project/coder)

12. [Лучшая практика] Переменная $user относится к пользователю, который залогинен на сайте в момент исполнения кода, переменная $account относится к любому пользователю вне зависимости от того, залогинен он на сайте или нет.

13. [Производительность] На каждой странице происходит загрузка всей таблицы переменных (variable), поэтому имеет смысл следить за этой таблицей и удалять ненужные значения.

14. [Производительность] Функция variable_get() не вызывает запросов к базе данных т.к. все переменные хранятся в памяти в момент исполнения кода.

15. Не вызывайте функцию t() для названий и описаний пунктов меню. Они сохраняются в кеше в момент билда меню. Это значит, что язык, установленный в момент создания кеша меню будет использоваться для всех пользователей.

16. Используйте MENU_LOCAL_TASK для пунктов меню, которые Вы хотите сделать табами. Например, таким образом можно добавить табы для таких страниц как “node/*” или “user/*”

17. [Производительность] Используйте для Ваших коллбэк функций из меню отдельные файлы *.inc с помощью задания аттрибута “file” в массиве, определяющем элемент меню. Это приведет к более эффективному распределению памяти т.к. файл модуля *.module загружается на каждой странице, а заданные файлы *.inc загружаются только при вызове данного пункта меню.

18. При использовании %user или %node в определении пункта меню Drupal автоматически запускает функции node_load() или user_load() передавая этим функциям в качестве аргумента то, что стоит на их месте в url (обычно это ID) и возвращают объект – ноду или объект – пользователя

19. Вы можете определить свой собственный хендлер % в определении меню. Например, %example будет вызывать Вашу функцию example_load(). Эта функция должна находиться в главном файле модуля *.module а не в файлах *.inc

20. В своем модуле Вы можете использовать $GLOBALS['conf']['cache'] = false . В этом случае будет отключено кеширование данной страници. Обратите внимание на то, что если эта страница была закеширована ранее, то потребуется скинуть кеш.

21. Вы без труда определите, что данный сайт работает на Drupal если посмотрите в заголовках “page expire date” дату устаревания страницы. У Drupal это 11/19/1978 – дата рождения создателя Drupal. (http://drupal.org/user/1)

22. Использовать “маршрутизацию” (перенаправление) в Drupal можно с помощью функций custom_url_rewrite_inbound() и custom_url_rewrite_outbound()

23. К вопросу выбора правильного типа поля “дата” в CCK:
- Дата (ISO) – хорошо подходит для не точных дат (например, только год)
- “Datestamp” ( штамп даты, кол. секунд с момента начала эры Unix) – тот же формат используется в ядре Drupal
- Лучше всего использовать “Datetime”, этот формат имеет ту же точность что и “Datestamp”. Кроме того, “Datetime” сохраняет данные в родном формате базы данных, что позволяет проводить различные манипуляции прямо на уровне базы данных (что очень быстро).

24. [Лучшая практика] Разбивайте Вашу папку “sites/all/modules” на две дополнительные папки “contrib” и “custom”, для скачанных и своих модулей соответственно.

25. [Лучшая практика] Если Вам необходимо модифицировать код чужих модулей, то отслеживайте все изменения и сохраняйте их в специальных файлах патчей. Создайте отдельную директорию для сохранения всех файлов патчей. Каждый раз, когда Вы обновляете модуль, удостоверьтесь, что Ваш патч все ещё необходим. Примените совой патч к новой версии модуля (если это требуется), либо удалите патч из Вашей папки (если патч уже включен в модуль).

26. [Лучшая практика] Хук hook_menu() должен быть первой функцией в Вашем модуле, потому что он играет роль “индекса” для модуля, который описывает что делает Ваш модуль и когда он это делает. (Имеется ввиду не программная сторона, а девелоперская. Любой разработчик глядя на Ваш hook_menu() может легко начать ориентироваться в Вашем модуле).

27. Причина по которой аттрибуты форм начинаются со знака “#” в массиве $form заключается в возможности создавать вложенности форм в массиве.

28. Атрибут “clicked_button” используется для управления сабмитом кнопок, которые являются картинками. Т.к. интернет эксплорер не использует при сабмите имена кнопок, как это делают другие браузеры.

29-30. Вы обычно устанавливаете ошибку в поле во вложенной форме используя формат parent][child (Например "home][street")? А Вы знаете, что form_error() позволяет устанавливать ошибку в поле с использованием более логичного форматирования чем form_set_error()
form_set_error('home][street','You must enter the street address.');
form_error($form['home']['city'], ‘You must enter the street address.’);

31. Если в переменной $form_storage находится хотя бы что то, в этом случае Drupal будет игнорировать любые редиректы и будет просто делать ребилд формы при сабмите. Что бы избежать этого, в некоторых случаях придется делать unset $form_storage.

32. [Лучшая практика] Вы можете использовать любой HTML код в Ваших функциях темизации потому, что система темизации построена таким образом, что она может переопределять HTML в своих собственных функциях.

33. Drupal будет автоматически рендерить любые неотрендеренные части массива $form. Поэтому Вам совсем не обязательно рендерить вручную каждую часть. Только если вы хотите управлять этой частью индивидуально и отдельно от остальных.

34. Для быстрого переключения между базами данных используйте db_set_active(). Эта функция позволяет переключаться между соединениями с базами, которые Вы указали в своем файле settings.php.

35. Модуль  Table Wizard (http://drupal.org/project/tw) позволяет создать описание любой таблицы для views. Вы даже можете выбрать ключи таблицы, которые используются для джоинтов.

36. Если Вы установите для элемента формы атрибут “#value” (например, для скрытого поля), то Drupal при обработке сабмита всегда будет устанавливать значение этого поля в то, что Вы укажете в “#value” независимо от того, что будет получено от пользователя т.к. при сабмите происходит ребилд формы, а уже затем обработка.

37. Если тип элемента формы (”#type”) это “value”, то этот элемент формы не будет включен в HTML форму на пользовательской стороне. Пользователь вообще не увидит этих данных, но в обработчиках формы в Drupal эти данные будут доступны на ряду с другими данными формы.
Например: $form['element_name'] = array(”#type” => “value”, “#value” => “My Value”);
My Value – будет доступен в $form_state['values']['element_name'], но не будет присутствовать на страничке с формой.

38. [HTML] Если в страницу включен JavaScript (инлайн, прямо в тексте страницы), то в этом месте будет происходить полная остановка загрузки всего, что идет после этого скрипта (HTML, JavaScript и др.) до тех пор, пока код не загрузится.

39. [JQuery] VisualjQuery.com это удобное, визуальное API к JQuery

40. [Firebug] можно запустить JavaScript прямо в консольном табе Firebug если использовать “>>>” который находится внизу консоли.

41. [HTML] Некоторые браузеры будут вырезать теги “A” если для них не определен атрубут “href”.

42. [Производительность JQuery] Если указать тег вместе с классом, то поиск этого элемента будет происходить намного быстрее чем если указать просто класс.
Например:
Медленно: $(’.content’);
Быстро: $(’div.content’);

43. [Производительность JQuery] Использование $(this) внутри функций селекторов дает большую скорость чем использование селектора еще раз заново.

44. Самым удобным способом управления вьюсами является экспортирование необходимого вьюса и сохранение его в своем модуле. Это приводит к тому, что вы можете следить за изменением вида с помощью систем контроля версий. Еще ваш вид становится защищенным от случайных ошибок пользователей, Вы всегда можете сделать “revert” и возвратиться к исходному состоянию.

45. Управление патчами: Создайте пустой модуль и используйте хук hook_update() для того, что бы вносить в сайт большие изменения, например, в настройках и пр. Таким способом можно, например, после обновления модуля еще запустить update.php и накатить на новый модуль Ваш патч.

46. Безопасность данных: По большому счету, на уровне темизации все данные должны быть уже безопастны. Что бы обезопасить свой сайт от данных, введенных пользователем используйте check_plain (все теги вырезаются) или check_markup (текст проходит обработку фильтром ввода поумолчанию).

47. Вы можете создать drush_make скрипт для  Drush (http://drupal.org/project/drush), который будет создавать чистую установку Drupal со свежими версиями модулей, которые будут скачаны с Drupal.org прямо в момент установки.

48. Как можно больше используйте функции cache_get() и cache_set() т.к. они уменьшат количество запросов к базе данных.

Из комментариев Советы по JQuery:

1. Если только возможно, то используйте ID для селекторов jquery.
$(‘#block-menu-1″) это очень быстро, примерно в 100 раз быстрее чем $(‘div.block’)
а $(‘div.block’) всего лишь немного быстрее чем $(‘.block’)

2. Кешируйте данные.
Плохо:
$(‘#wombat’).hide();
$(‘#wombat’).remove();

Хорошо:
var wombat = $(‘#wombat’);
wombat.hide();
wombat.remove():

Отлично:
$(‘#wombat’)
.hide()
.remove();

3. Вы можете передать переменную в Firebug с использованием console.log()
var lemmeSee = $(‘#wombat’);
console.log(lemmeSee)

Другие полезные функции модуля Devel

dpm() – впечатывает объект в сообщение.

dargs($once = TRUE) – печатает аргументы текущей фукнции, $once = TRUE в этом случае печатает их только один раз.

dd() – записывает объект в файл /tmp/drupal_debug.txt – очень полезно, когда нужно сделать дебаг Ajax запросов. если запросы идут из Flash плеера, то у них другой ID сессии. Можно так же использовать watchdog(‘debug’, print_r($object, TRUE)) , в этом случае объект будет записан в базу данных.

dfb() – выводит информацию в firebug (нужно установить FirePHP в модуле Devel)

Как узнать какие переменные доступны в файлах шаблонов:

Это сделать очень легко вызвав dpm(get_defined_vars())
или var_dump(get_defined_vars())

Еще немного советов:

Вы можете без труда создать схему базы данных для Вашего модуля по следующему алгоритму:

1. Создайте необходимую таблицу (или таблицы) в Вашем любимом инструменте (например, в phpMyAdmin)
2. Экспортируйте таблицу с помощью модуля  Schema (http://drupal.org/project/schema). Вы можете просто скопировать полученный массив в Ваш модуль, в хук hook_schema

Вы можете экспортировать Ваш тип контента (CCK) с использованием модуля “CCK Content Copy” (который входит в пакет CCK) и вставить этот код к инсталяционный хук Вашего модуля.

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

Возврат картинки AHAH-коллбеком

Для получения картинки при клике по кнопке AHAH-запросом, нужна форма и AHAH-обработчик. Форма содержит текстовое поле (если нужно чтобы возвращаемая картинка содержала наш текст), кнопку submit, div для вывода сгенерированной картинки.
Текстовое поле для отправки текста. Текст отправлять не обязательно. Можно возвращать картинку или текст просто по кнопке submit, но это более простой случай, потому его рассматривать не будем. Кнопка содержит обязательные для AHAH-запроса массив #ahah, с параметром path, с информацией о AHAH-коллбеке – mymodule_message_js() (функцией, отвечающей за возврат результата в форму).
Кросс-пост с моего блога http://jdrupal.ru | На хабре только ссылкой

function mymodule_form(){ global $user; $form['title'] = array( '#type' => 'textfield', '#title' => t('My text'), '#default_value' => $node->title, '#size' => 60, '#maxlength' => 60, '#required' => TRUE, );   $form['submit'] = array( '#type' => 'submit', '#value' => t('click me'), '#ahah' => array( 'event' => 'click', 'path' => 'mymodule/message_js/', 'wrapper' => 'target', 'effect' => 'fade', ) );   $form['target'] = array( '#type' => 'markup', '#prefix' => '<div id="target">', '#value' => t('This text will be replaced by a picture'), '#suffix' => '</div>', ); return $form; }

AHAH-коллбек должен вернуть картинку, и, возможно, текст. Картинка удобно генерируется отдельным запросом (который не забываем прописать в хуке mymodule_menu). Функция drupal_json() возвращает скомпанованные данные. Будет ли картинка рисоваться с нуля или создаваться на основе заранее подготовленного изображения не важно. AHAH-коллбек возвратит ее в <div id=”target”>.

Переменная $str нужна для передачи текста в скрипт генерации изображения. Это не лучший вариант, но если особые требования не оговорены можно использовать его. Альтернативой может быть сохранение текста в БД и генерация картинки на основе значений из БД (генерация баннеров, статистики).

function mymodule_message_js(){ if ($str = $_POST['title']){ $output = '<img src="myimage.png/'.$str.'"></a>';} drupal_json(array('status' => TRUE, 'data' => $output)); }

Самая главная часть с hook_menu. Пункты в меню:

$items['mypath'] отвечает за страницу где расположена описанная выше форма. $items['mymodule/message_js'] – AHAH-коллбек $items['myimage.png/%'] – генерация картинки

function mymodule_menu() {   $items['mypath'] = array( 'title' => 'Custom caption', 'page callback' => 'drupal_get_form', 'page arguments' => array('stitch_form'), 'access callback' => user_access('myaccess'), );   $items['mymodule/message_js'] = array( 'page callback' => 'mymodule_message_js', 'page arguments' => $form_state, 'type' => MENU_CALLBACK, 'access callback' => user_access('myaccess'), );   $items['myimage.png/%'] = array( 'page callback' => 'mymodule_image', 'type' => MENU_CALLBACK, 'access callback' => user_access('myaccess'), 'page arguments' => array(1), );   return $items; }

Функция mymodule_image($str) реализуется с учетом основных требований для генерации картинки: отправка header-информации, генерации картинки, настройки кириллицы (если нужен кириллический текст), организации пути хранения файла шрифта на сервере.

function mymodule_image($str){ drupal_set_header("Content-type: image/png");   putenv('GDFONTPATH=' . realpath('.')); $image = imagecreate(88, 31); $background_color = imagecolorallocate($image, 2, 122, 198); $text_color = imagecolorallocate($image, 255, 255, 255); imagefill($image, 0, 0, $background_color);   $path_to_ttf = "modules/mymodule/arial.ttf"; $text_color = imagecolorallocate ($image, $color_red=255, $color_green=255, $color_blue=255);   imagettftext($image, $size=8, $angle=0, $x=20, $y=10, $text_color, $path_to_ttf, $str);   imagepng($image); imagedestroy($image); exit();

Функция imagepng($image) в этом случае выводит картинку в части $output функции mymodule_message_js()
Результатом работы модуля при введенном тексте “jdrupal.ru”, будет картинка

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

Subzones – Организация логических зон на сайте

Subzones 1

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

Добавлен мультисайтинг

логическая зона – Это некоторая область сайта удовлетворяющая определенным заранее правилам. Эти правила можно формировать из Меню (Начиная от корневого меню), Путей (path), Нод.

Пример таких зон:
Магазин, Журнал, Фонд, МЕРОПРИЯТИЯ, КОНФЕРЕНЦИЯ – Каждая из этих зон должна иметь свой набор блоков, свое меню (причем более одного на зону).

После анализа drupal.org, было решено писать свой модуль, так как аналогов просто нет. И так.
Я рад Вам представить Subzones – уникальный модуль для построения логических зон на Вашем сайте

Что может:

Организовывать зоны в зависимости от меню и его пунктов Организовывать зоны в зависимости от пути Организовывать зоны в зависимости ноды Организовывать зоны в зависимости имени хоста



Что включается в зону:

Организация наборов блоков Организация наборов меню Расширенная база темплайтов Организация темы Организация CSS


Добавлен мультисайтинг

Теперь зоной может быть и субдомен аля test.drupal.ru

http://drupal:8090

http://test.drupal:8090



Темплайты для зоны:
Определение темплайта для всех зон
Определение темплайта для зоны
Определение темплайта для главной страницы
Определение темплайта для внутренней страницы
Определение темплайта для ноды
Определение темплайта vocabulary
Определение темплайта термина

Темы:
Возможность определения темы для зоны

Что планируется:
Добавить определение принадлежности к зоне по таксономии
Добавить таксономию привязанную к зоне (аля таксономи блок или конкретного vocabulary или группы терминов)
Добавить поддержку темплайтов для блоков в зависимости от зоны
Добавить поддержку Views
Добавить поддержку Token

Особенности:
Кеширование зон
Использование всего одной таблицы для хранения зон
Четкая и логическая структура представления данных
одна и таже нода может быть в разных сабзонах

А теперь откуда скачать это чудо:
SVN https://77.220.134.88:8443/svn/drupal/trunk/modules/subzones логин anonymous

Прикрепленный файл Размер subzones.rar 44.07 кб

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

Custom Node Template API

pCustom Node Template API/p
pМаленькое удобное дополнениеbr /
Помогает вывести node используя заданный template/p
pПример использования:br /
div class=geshifilterpre class=drupal6_ru geshifilter-drupal6_ru style=font-family:monospace;span style=color: #0000ff;$result/span = a href=http://api.drupal.ru/api/function/db_query/6span style=color: #000066;db_query/span/aspan style=color: #66cc66;#40;/spanspan style=color: #ff0000;quot;SELECT * FROM {node} n WHERE n.status = 1quot;/spanspan style=color: #66cc66;#41;/span;
span style=color: #b1b100;while/span span style=color: #66cc66;#40;/spanspan style=color: #0000ff;$node/span = a href=http://api.drupal.ru/api/function/db_fetch_object/6span style=color: #000066;db_fetch_object/span/aspan style=color: #66cc66;#40;/spanspan style=color: #0000ff;$result/spanspan style=color: #66cc66;#41;/spanspan style=color: #66cc66;#41;/span span style=color: #66cc66;#123;/span
a href=http://www.php.net/echospan style=color: #000066;echo/span/a custom_node_viewspan style=color: #66cc66;#40;/spanspan style=color: #0000ff;$node/span, span style=color: #000000; font-weight: bold;true/span,span style=color: #000000; font-weight: bold;FALSE/span,span style=color: #000000; font-weight: bold;FALSE/span,span style=color: #ff0000;’news’/spanspan style=color: #66cc66;#41;/span;
span style=color: #66cc66;#125;/span/pre/div/p
pили шуточный так:br /
div class=geshifilterpre class=drupal6_ru geshifilter-drupal6_ru style=font-family:monospace;span style=color: #0000ff;$templates/span=a href=http://www.php.net/arrayspan style=color: #000066;array/span/aspan style=color: #66cc66;#40;/spanspan style=color: #ff0000;’template1′/span,span style=color: #ff0000;’template2′/span,span style=color: #ff0000;’template3′/span,span style=color: #ff0000;’template4′/spanspan style=color: #66cc66;#41;/span;
span style=color: #0000ff;$count/span=a href=http://www.php.net/countspan style=color: #000066;count/span/aspan style=color: #66cc66;#40;/spanspan style=color: #0000ff;$templates/spanspan style=color: #66cc66;#41;/span;
span style=color: #0000ff;$result/span = a href=http://api.drupal.ru/api/function/db_query/6span style=color: #000066;db_query/span/aspan style=color: #66cc66;#40;/spanspan style=color: #ff0000;quot;SELECT * FROM {node} n WHERE n.status = 1quot;/spanspan style=color: #66cc66;#41;/span;
span style=color: #b1b100;while/span span style=color: #66cc66;#40;/spanspan style=color: #0000ff;$node/span = a href=http://api.drupal.ru/api/function/db_fetch_object/6span style=color: #000066;db_fetch_object/span/aspan style=color: #66cc66;#40;/spanspan style=color: #0000ff;$result/spanspan style=color: #66cc66;#41;/spanspan style=color: #66cc66;#41;/span span style=color: #66cc66;#123;/span
a href=http://www.php.net/echospan style=color: #000066;echo/span/a custom_node_viewspan style=color: #66cc66;#40;/spanspan style=color: #0000ff;$node/span, span style=color: #000000; font-weight: bold;true/span,span style=color: #000000; font-weight: bold;FALSE/span,span style=color: #000000; font-weight: bold;FALSE/span,span style=color: #0000ff;$templates/spanspan style=color: #66cc66;#91;/spana href=http://www.php.net/randspan style=color: #000066;rand/span/aspan style=color: #66cc66;#40;/span0, span style=color: #0000ff;$count/spanspan style=color: #66cc66;#41;/spanspan style=color: #66cc66;#93;/spanspan style=color: #66cc66;#41;/span;
span style=color: #66cc66;#125;/span/pre/div/p
pДля использования темплайтов достаточно в папке темы создать одноименные template файлы с префиксом custom-br /
Те для вывода custom_node_view($node, FALSE,FALSE,FALSE,’strongmy_quality_template/strong’]);br /
Необходимо создать файл strongcustom-my-quality-template.tpl.php/strong/p
pPS:br /
Яж делаю такbr /
custom_node_view($node, FALSE,FALSE,FALSE,’strongс1/strong’]);br /
файл strongcustom-с1.tpl.php/strongbr /
И писать мало и удобно в понимании/p
table id=attachments class=sticky-enabled
theadtrthПрикрепленный файл/ththРазмер/th /tr/thead
tbody
tr class=oddtda href=http://www.drupal.ru/files/cntapi_0.rarcntapi.rar/a/tdtd1.07 кб /td /tr
/tbody
/table

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

Решение проблемы с обновлением аватар пользователями

Довольно назойливая проблема – когда пользователь меняет свой аватар, то новый файл как правило имеет то же самое имя, что предыдущий, исключением является только загрузка файла с другим расширением, ибо имена файлов формируются как picture-{uid}.{расширение оригинального файла}

Так как модуль  Imagecache Profiles перекрывает вывод аватар через свою функцию препроцессинга (предобработки), то можно к имени файла прикрепить дату его создания, что даст уникальный url для каждой загруженной/измененной аватары.

Требуются желающие протестировать и соответственно, отзывы о работе. обновленную версию можно взять в issue http://drupal.org/node/615304

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

Новый модуль Gallery API

Представляю Вашему вниманию модуль разработанный в нашей студии, начиналась разработка мной, а заканчивалась коллегой по цеху  taldy@drupal.org
http://drupal.org/project/galleryapi

Модуль идет в коробке с плагинами input методов для views и ССК imagefield и output методами slideshow и djembegallery

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

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

© 2009 Обзор CMS