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

Новости проекта OpenStore

***OpenStore – это сборка готового интернет-магазина на основе Ubercart и Drupal***

Предистория
Сайт проекта
Скачать сборку
Тут мы ловим блох

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

Добрые вести на 6.02.2011

Вышла Openstore Beta 2. Версия представляет собой перебродивший прежний dev + 2 новых модуля:

Yml export производства товарища restyler. Честно говоря, я не сильно в восторге от этого модуля, он сильно прост (хотя возможно это плюс) да и принцип действия не особо нравится, к тому же, пришлось немножко подправить, но, тем не менее, респект и уважение автору.

Долгожданный модуль интеграции 1С с Уберкарт производства товарища Mirocow, а точнее его demo. Доступна полнофункциональная версия, но за деньги. Купить можно (и нужно) через меня. Покупая что-то через меня, вы поддерживате проект и энтузиазм мой, его творящий.

Качаем, торопливо отстранив только что откупоренный пивас

Важные объявления:

Разобрался в настройках Openstore сам и хочешь помочь другим? Нужны добровольцы для написания руководства пользователя интернет магазина на основе Уберкарт!

Сделал таки магазин с использованием сборки OpenStore?

Отправь своё детище на мыло openstore.org.ua@gmail.com c указанием своего логина на сайте проекта www.openstore.org.ua. Я размещу на этот магазин прямую ссылку с сайта проекта!

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

Новости проекта OpenStore

***OpenStore – это сборка готового интернет-магазина на основе Ubercart и Drupal***

Предистория
Сайт проекта
Скачать сборку
Багтреккер

Обновление от 27.03.2011

ВНИМАНИЕ

Проект заморожен в связи с переездом автора в США. В ближайшие как минимум 6 мес (начиная с апреля 2011) я вряд ли смогу хоть как-то заниматься этим проектом. Это значит, что как минимум на этот срок:

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

Спасибо за понимание!

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

Drupal 7 и Приватные файлы

С чего все началось? С темы которая всех на этом форме мягко говоря удивила: “Прикрепить файлы к статье Joomla“. Несмотря на название, само содержимое топика (опуская слово Joomla) было вполне адекватным! А именно поставлена следующая задача.

Задача: Прикрепить к статье файл.

Основные требования:
1. Файл должен загружаться с компьютера автора, в процессе ввода текста. *Хороший пример – этот форум. Тут можно прикрепить файл непосредственно при вводе сообщения.
2. Файл должен быть защищён от скачивания НЕ зарегистрированными пользователями. *не просто скрыта ссылка, а именно защита от скачивания и хотлинков.

Дополнительные (не обязательные, но крайне жалетельные) требования:
1. Если пользователь не загистрирован, то ссылка на файл не исчезает, он просто не может его скачать
2. Если не зарегистрированный пользователь пытается скачать файл – система его уведомляет о необходимости регистрации
3. Счётчик скачивания файла где-нибудь недалеко от ссылки “скачать”
4. Статика в админке, “кто, когда и что” скачал (это было бы вообе шикарно!)

Подопытным для всего этого как не странно стала не Joomla, а Drupal 7.

Сама задача для друпала не хитрая “Прикрепить к статье (материалу) файл” нам позволяет замечательная фишка семерки “Field API” т.е. по сути первый пункт основных требований выполнили. Идем дальше:

Цитата:

Файл должен быть защищён от скачивания НЕ зарегистрированными пользователями. *не просто скрыта ссылка, а именно защита от скачивания и хотлинков.

Это для меня был самый интересный вопрос, поэтому на нем я и заострю внимание.

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

cd /путь/к/папке/с/установленным/друпалом/sites/default chmod 755 . mkdir files-private chmod 555 .

Для тех кто не в теме, расшифровываю. Сначала папке /sites/default задал права на запись, создал в ней папку, затем вернул права на “только доступ”. поскольку папку /sites/default/files по умолчанию отдана апачу, я решил не создавать приватную папку в ней, чтоб еще не писать правила для запрета апача гулять туда (хотя подозреваю что оповестить его о запрете все равно придется).
После этой процедуры вернемся в админку друпала, а именно идем по адресу admin/config/media/file-system и в настройках “Приватный путь файловой системы” вписываем только что созданную нами папку sites/default/files-private после чего сохраняем настройки.
Далее идем по направлению Структура » Типы содержимого » наш тестовый тип » Управлять полями создаем поле типа “файл” (для изображений аналогично) и в настройках указываем Хранилище Личные файлы сохраняем и смотрим что получилось.

Я минут 5 втыкал что за фигня получилась, вроде как файлы приватные загружаются в одну структуру, отдаются из другой, но отдаются всем подряд. После чего я начал гуглить… и первым делом нагуглил следующее:

Цитата:

Setting the download method to “Private” doesn’t have any effect by itself…
what the private download setting does do, is fire off an extra event, hook_download()

Тут кстати автор опЯчататься. На самом деле хук называется  hook_file_download
А вообщем это все можно перевести как “Сама по себе приватная файловая система ничего не делает т.е. по сути это api и которая дает один (может и больше, не интересовался) хук с помощью которого мы можем управлять скачиванием этих файлов. После чего я набросал модуль из двух хуков, один создает новое право для ролей  hook_permission, а второй тот самый  hook_file_download в котором указано что если у пользователя нет права на просмотр приватных файлов слать его лесом! Получившийся модуль искать в прикрепленных файлах.

После активации модуля идем на страницу прав пользователей admin/people/permissions и выдаем новое правило “View private files” кому положено качать приватные файлы т.е. зарегистрированным пользователям. На этом собственно второй пункт выполнен, все анонимы идут лесом.

Теперь идем по дополнительным пунктам:

Цитата:

1. Если пользователь не загистрирован, то ссылка на файл не исчезает, он просто не может его скачать

Уже сделано.

Цитата:

2. Если не зарегистрированный пользователь пытается скачать файл – система его уведомляет о необходимости регистрации

В нашем модуле надо просто $uri прировать не к -1 а к странице регистрации.

3 и 4 пункты решает модуль  Download Count вот только портировать под 7-ку еще надо его. А вот это  Download Tools для семерки, но сам его не тестил.

Ну в общем-то тема раскрыта, комментируем.

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

Drupal 7 и Приватные файлы

С чего все началось? С темы которая всех на этом форме мягко говоря удивила: “Прикрепить файлы к статье Joomla“. Несмотря на название, само содержимое топика (опуская слово Joomla) было вполне адекватным! А именно поставлена следующая задача.

Задача: Прикрепить к статье файл.

Основные требования:
1. Файл должен загружаться с компьютера автора, в процессе ввода текста. *Хороший пример – этот форум. Тут можно прикрепить файл непосредственно при вводе сообщения.
2. Файл должен быть защищён от скачивания НЕ зарегистрированными пользователями. *не просто скрыта ссылка, а именно защита от скачивания и хотлинков.

Дополнительные (не обязательные, но крайне жалетельные) требования:
1. Если пользователь не загистрирован, то ссылка на файл не исчезает, он просто не может его скачать
2. Если не зарегистрированный пользователь пытается скачать файл – система его уведомляет о необходимости регистрации
3. Счётчик скачивания файла где-нибудь недалеко от ссылки “скачать”
4. Статика в админке, “кто, когда и что” скачал (это было бы вообе шикарно!)

Подопытным для всего этого как не странно стала не Joomla, а Drupal 7.

Сама задача для друпала не хитрая “Прикрепить к статье (материалу) файл” нам позволяет замечательная фишка семерки “Field API” т.е. по сути первый пункт основных требований выполнили. Идем дальше:

Цитата:

Файл должен быть защищён от скачивания НЕ зарегистрированными пользователями. *не просто скрыта ссылка, а именно защита от скачивания и хотлинков.

Это для меня был самый интересный вопрос, поэтому на нем я и заострю внимание.

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

cd /путь/к/папке/с/установленным/друпалом/sites/default chmod 755 . mkdir files-private chmod 555 .

Для тех кто не в теме, расшифровываю. Сначала папке /sites/default задал права на запись, создал в ней папку, затем вернул права на “только доступ”. поскольку папку /sites/default/files по умолчанию отдана апачу, я решил не создавать приватную папку в ней, чтоб еще не писать правила для запрета апача гулять туда (хотя подозреваю что оповестить его о запрете все равно придется).
После этой процедуры вернемся в админку друпала, а именно идем по адресу admin/config/media/file-system и в настройках “Приватный путь файловой системы” вписываем только что созданную нами папку sites/default/files-private после чего сохраняем настройки.
Далее идем по направлению Структура » Типы содержимого » наш тестовый тип » Управлять полями создаем поле типа “файл” (для изображений аналогично) и в настройках указываем Хранилище Личные файлы сохраняем и смотрим что получилось.

Я минут 5 втыкал что за фигня получилась, вроде как файлы приватные загружаются в одну структуру, отдаются из другой, но отдаются всем подряд. После чего я начал гуглить… и первым делом нагуглил следующее:

Цитата:

Setting the download method to “Private” doesn’t have any effect by itself…
what the private download setting does do, is fire off an extra event, hook_download()

Тут кстати автор опЯчататься. На самом деле хук называется  hook_file_download
А вообщем это все можно перевести как “Сама по себе приватная файловая система ничего не делает т.е. по сути это api и которая дает один (может и больше, не интересовался) хук с помощью которого мы можем управлять скачиванием этих файлов. После чего я набросал модуль из двух хуков, один создает новое право для ролей  hook_permission, а второй тот самый  hook_file_download в котором указано что если у пользователя нет права на просмотр приватных файлов слать его лесом! Получившийся модуль искать в прикрепленных файлах.

После активации модуля идем на страницу прав пользователей admin/people/permissions и выдаем новое правило “View private files” кому положено качать приватные файлы т.е. зарегистрированным пользователям. На этом собственно второй пункт выполнен, все анонимы идут лесом.

Теперь идем по дополнительным пунктам:

Цитата:

1. Если пользователь не загистрирован, то ссылка на файл не исчезает, он просто не может его скачать

Уже сделано.

Цитата:

2. Если не зарегистрированный пользователь пытается скачать файл – система его уведомляет о необходимости регистрации

В нашем модуле надо просто $uri прировать не к -1 а к странице регистрации.

3 и 4 пункты решает модуль  Download Count вот только портировать под 7-ку еще надо его. А вот это  Download Tools для семерки, но сам его не тестил.

Ну в общем-то тема раскрыта, комментируем.

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

Guestbook for Drupal 7

Есть такой замечательный модуль Guestbook. Позволяет делать гостевую книгу для сайта и персональные гостевые для пользователей.
Подготовил версию для 7.x. В основу взял 6.x-2.0.
Удалена поддержка Panels.

Скачать можно здесь.

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

Guestbook for Drupal 7

Есть такой замечательный модуль Guestbook. Позволяет делать гостевую книгу для сайта и персональные гостевые для пользователей.
Подготовил версию для 7.x. В основу взял 6.x-2.0.
Удалена поддержка Panels.

Скачать можно здесь.

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

OpenADS for Drupal 7

Есть замечательный модуль OpenADS. Нужен для интеграции банерообменной системы OpenX c Drupal.

Подготовил версию для 7.x. В основу взял 6.x-1.0.
Тестировалась с OpenX 2.8.7, возможны глюки с другими версиями.
Скачать можно здесь

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

OpenADS for Drupal 7

Есть замечательный модуль OpenADS. Нужен для интеграции банерообменной системы OpenX c Drupal.

Подготовил версию для 7.x. В основу взял 6.x-1.0.
Тестировалась с OpenX 2.8.7, возможны глюки с другими версиями.
Скачать можно здесь

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

Предлагаю поддержать в twitter хэш-тег #drupal_ru

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

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

Среди прочих хэш-тегов есть хэш-тег #drupal – которым пользуется сообщество drupal разработчиков со всего мира. Но есть особенность, дело в том что данным хэш-тегом пользуется преимущественно англоязычное сообщество, и просматривая твиты чувствуешь себя немного неуютно, хочется чтобы было по-русски.
Поэтому я начал в своих твитах про Drupal использовать хэш-тег #drupal_ru, и видимо пока только я один им пользуюсь.

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

Кроме того, если еще нет такого, то предлагаю создать модуль, позволяющий вести трансляцию твитов по хэш-тегу на сайте. Как например сделано тут www.uwdc.ru “Tweets #uwdc”.

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

Аргументы Views. Часть1. Вывод в блоке элемента текущей страницы

Хочу рассказать о своем опыте работы с некоторыми аргументами Views.
И о тех случаях где их можно эффективно применять.

Часть 2.

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

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

Преимущество данного метода в том, что Views можно точнее настраивать, чем стандартные методы вывода.

Настройка аргумента.

В списке блоков нужно этот блок поместить в нужный регион.

Надеюсь, это будет полезно тем, кто этого не знал.

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

Аргументы Views. Часть1. Вывод в блоке элемента текущей страницы

Хочу рассказать о своем опыте работы с некоторыми аргументами Views.
И о тех случаях где их можно эффективно применять.

Часть 2.

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

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

Преимущество данного метода в том, что Views можно точнее настраивать, чем стандартные методы вывода.

Настройка аргумента.

В списке блоков нужно этот блок поместить в нужный регион.

Надеюсь, это будет полезно тем, кто этого не знал.

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

Drupal 6 мультисайтинг на it-patrol (из серии “Радио – начинающим”)

Хотел, как лучше, а получилось опять 12 листов формата А4, поэтому здесь только анонс

В статье «CMS Drupal + AuthorIT против CMS Drupal + FCKeditor» было вскользь упомянуто об организации мультисайтинга связкой CMS Drupal + AuthortIT, в настоящей же статье:

* отчаявшимся выложена пошаговая инструкция по организации мультисайтинга на Drupal на хостинге it-patrol;
* любознательным разъяснена «физика» сотворенного;
* делаварам приведены количественные, качественные и эфемерные преимущества мультисайтинга;
* склонным к интригам повествовано о трагической судьбе председателя в условиях суровой социалистической действительности…

А сама статья здесь – http://tdocs.su/15050

ЗЫ. Напоминаю, что статья от начинающего для начинающих, поэтому прошу ногами сильно не пинать.

Attached poll “Интересен ли материал статьи?”.
Register or login to poll
Results:
Очень: 3 голоса
Да: 10 голосов
Не очень: 2 голоса
Нет: 1 голос
Я окончил МЭИ (МИФИ, МФТИ, МГУ, ВВИА им. Жуковского) и, будучи человеком деликатным, никогда не выберу предыдущую опцию!: 0 голосов

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

Drupal 6 мультисайтинг на it-patrol (из серии “Радио – начинающим”)

Хотел, как лучше, а получилось опять 12 листов формата А4, поэтому здесь только анонс

В статье «CMS Drupal + AuthorIT против CMS Drupal + FCKeditor» было вскользь упомянуто об организации мультисайтинга связкой CMS Drupal + AuthortIT, в настоящей же статье:

* отчаявшимся выложена пошаговая инструкция по организации мультисайтинга на Drupal на хостинге it-patrol;
* любознательным разъяснена «физика» сотворенного;
* делаварам приведены количественные, качественные и эфемерные преимущества мультисайтинга;
* склонным к интригам повествовано о трагической судьбе председателя в условиях суровой социалистической действительности…

А сама статья здесь – http://tdocs.su/15050

ЗЫ. Напоминаю, что статья от начинающего для начинающих, поэтому прошу ногами сильно не пинать.

Attached poll “Интересен ли материал статьи?”.
Register or login to poll
Results:
Очень: 3 голоса
Да: 10 голосов
Не очень: 2 голоса
Нет: 1 голос
Я окончил МЭИ (МИФИ, МФТИ, МГУ, ВВИА им. Жуковского) и, будучи человеком деликатным, никогда не выберу предыдущую опцию!: 0 голосов

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

Улучшение advanced catalog

Захотелось чтоб в Ubercart advanced catalog при выборе категории отображались товары из вложенных подкатегорий, а список категорий отображался картинками.
Результат можно посмотреть здесь: http://www.krasmebel.ru/shop/catalog/ofisnaya-mebel
Для этого
1. В представлении advanced_catalog заменил Аргумент Таксономия: ID Термина на
Таксономия: ID Термина (с глубиной)
2. Поправил
/sites/all/modules/uc_advanced_catalog/uc_advanced_catalog.module

Обновлено (исправленный вариант):

<?php
  if ($count > 0) {
/*    if (count($links)) {
      $output .= theme('links', $links, array('class' => 'links inline uc-categories')) ."<br />\n";
    }

    // creating pager
    ksort($row);
    $rows[] = $row;
    $pager = theme('table', array(), $rows, array('class' => 'pager-field'));

    // output construction
    $output .= $catalog->description;
*/
//My begin

    // creating pager
    ksort($row);
    $rows[] = $row;
    $pager = theme('table', array(), $rows, array('class' => 'pager-field'));

    // original code
    // Display table of child categories similar to an osCommerce site's front page.
    $columns = variable_get('uc_catalog_category_columns', 3);
    $cat_rows = array();
    $row1 = array();
    $i = 1;
    foreach ($child_list as $cell) {
      $row1[] = array('data' => $cell, 'class' => 'category');
      if ($i % $columns == 0) {
        $cat_rows[] = $row1;
        $row1 = array();
      }
      $i++;
    }
    if (count($row1) > 0 && count($row1) < $columns) {
      if (count($cat_rows) >= 1) {
        $row1 = array_merge($row1, array_fill(count($row1), $columns - count($row1), array('data' => '&nbsp;', 'class' => 'category')));
      }
      $cat_rows[] = $row1;
    }
    $output .= $catalog->description;
    $output .= theme('table', array(), $cat_rows, array('class' => 'category'));

//My end

?>

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

Улучшение advanced catalog

Захотелось чтоб в Ubercart advanced catalog при выборе категории отображались товары из вложенных подкатегорий, а список категорий отображался картинками.
Результат можно посмотреть здесь: http://www.krasmebel.ru/shop/catalog/ofisnaya-mebel
Для этого
1. В представлении advanced_catalog заменил Аргумент Таксономия: ID Термина на
Таксономия: ID Термина (с глубиной)
2. Поправил
/sites/all/modules/uc_advanced_catalog/uc_advanced_catalog.module

Обновлено (исправленный вариант):

<?php
  if ($count > 0) {
/*    if (count($links)) {
      $output .= theme('links', $links, array('class' => 'links inline uc-categories')) ."<br />\n";
    }

    // creating pager
    ksort($row);
    $rows[] = $row;
    $pager = theme('table', array(), $rows, array('class' => 'pager-field'));

    // output construction
    $output .= $catalog->description;
*/
//My begin

    // creating pager
    ksort($row);
    $rows[] = $row;
    $pager = theme('table', array(), $rows, array('class' => 'pager-field'));

    // original code
    // Display table of child categories similar to an osCommerce site's front page.
    $columns = variable_get('uc_catalog_category_columns', 3);
    $cat_rows = array();
    $row1 = array();
    $i = 1;
    foreach ($child_list as $cell) {
      $row1[] = array('data' => $cell, 'class' => 'category');
      if ($i % $columns == 0) {
        $cat_rows[] = $row1;
        $row1 = array();
      }
      $i++;
    }
    if (count($row1) > 0 && count($row1) < $columns) {
      if (count($cat_rows) >= 1) {
        $row1 = array_merge($row1, array_fill(count($row1), $columns - count($row1), array('data' => '&nbsp;', 'class' => 'category')));
      }
      $cat_rows[] = $row1;
    }
    $output .= $catalog->description;
    $output .= theme('table', array(), $cat_rows, array('class' => 'category'));

//My end

?>

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

[РЕШЕНО] Drupal 7 – вывод всех нод заданной таксономии. (/all)


Много вопросов задается куда делось /all.
Погуглив нашел модуль taxonomy_filter
Его младший брат http://drupal.org/project/tf_views, который добавляет только эту функцию без описанного ниже.

Taxonomy Filter Core – добавляется возможность /all и xxx+yyy, а так же есть 3 блока для вывода инфы и действий с ними: current criteria, refine criteria, search results.

current criteria показывает количество просто какой термин выбран и количество нод с ним (показывает по нулям, хоть ноды есть)
(на скрине блок 1, при нажатии удаляет с выдачи термин)

Блок search results выводит список терминов, которые которые сейчас присутстуют в выдаче (remove обрабатывается правильно)
(На скрине блок 2, “Место расположение” – имя словаря))

refine criteria – охерезная штука, в search results позволяет добавлять сущестующие еще не выбранные варианты таксономии в уже готовую выдачу или удалить из нее.. (На скрине снизу, динамическая)

Баги: выдача есть только по /all, ак же в списке блоков нет какого то блока, на который в настройках модуля матюхается)

Получается модуль будет обязательным для сайтов на d7.

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

[РЕШЕНО] Drupal 7 – вывод всех нод заданной таксономии. (/all)


Много вопросов задается куда делось /all.
Погуглив нашел модуль taxonomy_filter
Его младший брат http://drupal.org/project/tf_views, который добавляет только эту функцию без описанного ниже.

Taxonomy Filter Core – добавляется возможность /all и xxx+yyy, а так же есть 3 блока для вывода инфы и действий с ними: current criteria, refine criteria, search results.

current criteria показывает количество просто какой термин выбран и количество нод с ним (показывает по нулям, хоть ноды есть)
(на скрине блок 1, при нажатии удаляет с выдачи термин)

Блок search results выводит список терминов, которые которые сейчас присутстуют в выдаче (remove обрабатывается правильно)
(На скрине блок 2, “Место расположение” – имя словаря))

refine criteria – охерезная штука, в search results позволяет добавлять сущестующие еще не выбранные варианты таксономии в уже готовую выдачу или удалить из нее.. (На скрине снизу, динамическая)

Баги: выдача есть только по /all, ак же в списке блоков нет какого то блока, на который в настройках модуля матюхается)

Получается модуль будет обязательным для сайтов на d7.

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

Уменьшение цены на определенный процент в Ubercart

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

 

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

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

Уменьшение цены на определенный процент в Ubercart

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

 

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

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

Табличная темизация многозначных полей CCK

С такой задачей я сталкиваюсь, когда приходится использовать многозначное поле imagefield для построения фотогалерей. Вывод иконок изображений в таблице лучше заполняет пространство веб-страницы да и выглядит аккуратнее, чем какой-либо другой способ. Конечно, есть и CSS-правила, позводляющие отображать любой тег HTML, как табличный, но работают они не во всех браузерах. И чем пытаться написать кроссбраузерный CSS, иногда проще вывести поля CCK в таблицу явно.

Для этого нам понадобиться переписать один шаблон для вывода поля и добавить в файл template.php вашей темы одну функцию.

Нам потребуется файл шаблона theme/content-field.tpl.php из модуля cck. Скопируйте его дважды в папку вашей темы (пусть она называется mytheme). У первую копии файла оставьте оригинальное название content-field.tpl.php, а вторую назовите content-field-ИМЯ_ПОЛЯ.tpl.php, где ИМЯ_ПОЛЯ – системное название того поля, которое вы хотите видеть в табличном виде.

Исходный код второго файла content-field-ИМЯ_ПОЛЯ.tpl.php потребуется изменить:

<?php if (!$field_empty) : ?> <div class="field field-type-<?php print $field_type_css ?> field-<?php print $field_name_css ?>"> <?php if ($label_display == 'above') : ?> <div class="field-label"><?php print t($label) ?>:&nbsp;</div> <?php endif;?> <?php $attributes = array('class'=>'field-items'); $caption = $label_display == 'inline' ? t($label) : NULL; print theme('table', array(), mytheme_fields2table($items, 3, NULL, TRUE), $attributes, $caption); ?> </div> <?php endif; ?>

Как видите, изменения коснулись вывода заголовка поля (в случае настройки inline он выводится в caption таблицы), добавилась также дополнительная функция, которая преобразует набор значений поля $items в вид пригодный для прямого вывода в таблицу из трех столбцов.
Главная задача функции mytheme_fields2table() состоит в том, чтобы преобразовать список полей $items в массив, подходящий для функции theme_table(). Её код надо разместить в файле tempalte.php вашей темы (если файла нет, создайте его). Название функции должно начинаться с системного названия вашей темы (апример, mytheme).

Код функции:

function mytheme_fields2table($items, $width=NULL, $height=NULL, $by_strings=TRUE){ // Считаем количество непустых полей $count = 0; $tmp = array(); foreach ($items as $delta => $item) if (!$item['empty']) { $tmp[] = $item; $count++; } // Вычисляем размер таблицы на основании числа полей и принятых параметров высоты и/или ширины if(!$width && !$height && !$by_strings) { $sqrt = sqrt((float) $count); $height = ceil($sqrt); $width = ceil($count/$height); } elseif(!$width && !$height && $by_strings) { $sqrt = sqrt((float) $count); $width = ceil($sqrt); $height = ceil($count/$width); } elseif($width && $height && !$by_strings) { $max_count = $width*$height; $width = $max_count > $count ? ceil($count/$height) : $width; } elseif($width && $height && $by_strings) { $max_count = $width*$height; $height = $max_count > $count ? ceil($count/$width) : $height; } elseif($width) { $height = ceil($count/$width); } else { $width = ceil($count/$height); } // Заполняем строки таблицы при необходимости добавляя пустые ячейки или отбразывая лишние поля $rows = array(); $empty = array('data'=>'', 'class'=>'field-item-empty'); for ($i=0;$i<$height;$i++){ $line = array(); for ($j=0;$j<$width;$j++){ $index = $by_strings ? $i*$width+$j : $j*$height+$i; $line[] = empty($tmp[$index]) ? $empty : array('data'=>$tmp[$index]['view'], 'class'=>'field-item'); } $rows[] = $line; } return $rows; }

Параметры функции:
$items – исходные массив значений поля. Часто он содержит больше элементов, чем есть полей на самом деле, поэтому их количество отдельно считается в начале функции.
$width – ширина таблицы или количество ячеек в строке.
$height – высота таблицы или количество ячеек в столбце.
$by_strings – способ заполнения таблицы. TRUE – заполняется по строкам, FALSE – по столбцам.

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

Способ подходит для любых полей CCK.

Источники:

Табличная темизация многозначных полей CCK
Модуль CCK
Исходный код файла content-field.tpl.php

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

Табличная темизация многозначных полей CCK

С такой задачей я сталкиваюсь, когда приходится использовать многозначное поле imagefield для построения фотогалерей. Вывод иконок изображений в таблице лучше заполняет пространство веб-страницы да и выглядит аккуратнее, чем какой-либо другой способ. Конечно, есть и CSS-правила, позводляющие отображать любой тег HTML, как табличный, но работают они не во всех браузерах. И чем пытаться написать кроссбраузерный CSS, иногда проще вывести поля CCK в таблицу явно.

Для этого нам понадобиться переписать один шаблон для вывода поля и добавить в файл template.php вашей темы одну функцию.

Нам потребуется файл шаблона theme/content-field.tpl.php из модуля cck. Скопируйте его дважды в папку вашей темы (пусть она называется mytheme). У первую копии файла оставьте оригинальное название content-field.tpl.php, а вторую назовите content-field-ИМЯ_ПОЛЯ.tpl.php, где ИМЯ_ПОЛЯ – системное название того поля, которое вы хотите видеть в табличном виде.

Исходный код второго файла content-field-ИМЯ_ПОЛЯ.tpl.php потребуется изменить:

<?php if (!$field_empty) : ?> <div class="field field-type-<?php print $field_type_css ?> field-<?php print $field_name_css ?>"> <?php if ($label_display == 'above') : ?> <div class="field-label"><?php print t($label) ?>:&nbsp;</div> <?php endif;?> <?php $attributes = array('class'=>'field-items'); $caption = $label_display == 'inline' ? t($label) : NULL; print theme('table', array(), mytheme_fields2table($items, 3, NULL, TRUE), $attributes, $caption); ?> </div> <?php endif; ?>

Как видите, изменения коснулись вывода заголовка поля (в случае настройки inline он выводится в caption таблицы), добавилась также дополнительная функция, которая преобразует набор значений поля $items в вид пригодный для прямого вывода в таблицу из трех столбцов.
Главная задача функции mytheme_fields2table() состоит в том, чтобы преобразовать список полей $items в массив, подходящий для функции theme_table(). Её код надо разместить в файле tempalte.php вашей темы (если файла нет, создайте его). Название функции должно начинаться с системного названия вашей темы (апример, mytheme).

Код функции:

function mytheme_fields2table($items, $width=NULL, $height=NULL, $by_strings=TRUE){ // Считаем количество непустых полей $count = 0; $tmp = array(); foreach ($items as $delta => $item) if (!$item['empty']) { $tmp[] = $item; $count++; } // Вычисляем размер таблицы на основании числа полей и принятых параметров высоты и/или ширины if(!$width && !$height && !$by_strings) { $sqrt = sqrt((float) $count); $height = ceil($sqrt); $width = ceil($count/$height); } elseif(!$width && !$height && $by_strings) { $sqrt = sqrt((float) $count); $width = ceil($sqrt); $height = ceil($count/$width); } elseif($width && $height && !$by_strings) { $max_count = $width*$height; $width = $max_count > $count ? ceil($count/$height) : $width; } elseif($width && $height && $by_strings) { $max_count = $width*$height; $height = $max_count > $count ? ceil($count/$width) : $height; } elseif($width) { $height = ceil($count/$width); } else { $width = ceil($count/$height); } // Заполняем строки таблицы при необходимости добавляя пустые ячейки или отбразывая лишние поля $rows = array(); $empty = array('data'=>'', 'class'=>'field-item-empty'); for ($i=0;$i<$height;$i++){ $line = array(); for ($j=0;$j<$width;$j++){ $index = $by_strings ? $i*$width+$j : $j*$height+$i; $line[] = empty($tmp[$index]) ? $empty : array('data'=>$tmp[$index]['view'], 'class'=>'field-item'); } $rows[] = $line; } return $rows; }

Параметры функции:
$items – исходные массив значений поля. Часто он содержит больше элементов, чем есть полей на самом деле, поэтому их количество отдельно считается в начале функции.
$width – ширина таблицы или количество ячеек в строке.
$height – высота таблицы или количество ячеек в столбце.
$by_strings – способ заполнения таблицы. TRUE – заполняется по строкам, FALSE – по столбцам.

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

Способ подходит для любых полей CCK.

Источники:

Табличная темизация многозначных полей CCK
Модуль CCK
Исходный код файла content-field.tpl.php

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

Курсы валют для Ubercart

Особенности





Значения курсов валют задаются руками. Модуль рассчитывает, что ваша системная валюта – RUR, а сам модуль задает USD и EUR. Если вам нужны другие валюты – открывает crs.module и в первой функции меняем список. Если системная валюта совпадает с одной из валют модуля – я не знаю что будет Модуль добавляет на страницу редактирования ноды три поля для ввода цен с переключателями валют. Так же модуль расширяет схему uc_products для хранения новых цен и наименования валют. Родные поля с ценами Ubercart не затрагиваются. Как только модуль включен, цены начинаю пересчитывать из полей модуля. Для валюты можно указать дельту в %, тогда после пересчета в системную валюту значение цены будет увеличено (или уменьшено) на указанный процент. Настройка

Котировки валют задаются на странице admin/store/currency в единицах системной валюты.

Где взять

hg clone https://bitbucket.org/orangeudav/crs
или
https://bitbucket.org/orangeudav/crs/get/6.x-0.2.1.tar.gz

Как пересчитать старые цены в валюту

Допустим до установки модуля все цены были пересчитывались из EUR в рубли, системная валюта – RUR.
Положим 1 EUR = 41 RUR.
Теперь мы хотим в явном виде вводить цены в EUR.

Выставляем для всех товаров валюту EUR:
UPDATE uc_products SET crs_sell_price_cur = 'EUR'

Собственно пересчитываем цены:
UPDATE uc_products SET crs_sell_price = sell_price / 41

Исходные значения цен никуда не деваются (столбец sell_price не меняем), так что если отключить модуль – старые цены вновь начнут отображаться.

Прикрепленный файл Размер crs-2.png 17.45 кб crs-1.png 14.24 кб

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

Курсы валют для Ubercart

Особенности





Значения курсов валют задаются руками. Модуль рассчитывает, что ваша системная валюта – RUR, а сам модуль задает USD и EUR. Если вам нужны другие валюты – открывает crs.module и в первой функции меняем список. Если системная валюта совпадает с одной из валют модуля – я не знаю что будет Модуль добавляет на страницу редактирования ноды три поля для ввода цен с переключателями валют. Так же модуль расширяет схему uc_products для хранения новых цен и наименования валют. Родные поля с ценами Ubercart не затрагиваются. Как только модуль включен, цены начинаю пересчитывать из полей модуля. Для валюты можно указать дельту в %, тогда после пересчета в системную валюту значение цены будет увеличено (или уменьшено) на указанный процент. Настройка

Котировки валют задаются на странице admin/store/currency в единицах системной валюты.

Где взять

hg clone https://bitbucket.org/orangeudav/crs
или
https://bitbucket.org/orangeudav/crs/get/6.x-0.2.1.tar.gz

Как пересчитать старые цены в валюту

Допустим до установки модуля все цены были пересчитывались из EUR в рубли, системная валюта – RUR.
Положим 1 EUR = 41 RUR.
Теперь мы хотим в явном виде вводить цены в EUR.

Выставляем для всех товаров валюту EUR:
UPDATE uc_products SET crs_sell_price_cur = 'EUR'

Собственно пересчитываем цены:
UPDATE uc_products SET crs_sell_price = sell_price / 41

Исходные значения цен никуда не деваются (столбец sell_price не меняем), так что если отключить модуль – старые цены вновь начнут отображаться.

Прикрепленный файл Размер crs-2.png 17.45 кб crs-1.png 14.24 кб

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

Быстрый хак модуля Livejournal Crossposter (ljxp) для работы с полями CCK

Довольно распространенный модуль Livejournal Crossposter (ljxp) предназначен для автоматической публикации материалов Drupal-сайтов на Livejournal-совместимых сервисах. Я уже как-то писал о его установке и настройке у себя в блоге и на Drupal.ru. Но у модуля есть один существенный недостаток – он кросспостит в ЖЖ только стандартные заголовки ноды и ее тело (body) в виде тизера или полного текста. Поля CCK в нем полностью игнорируются. И устранить этот недостаток пока можно только хаком.

Сам модуль ljxp достаточно прост по своему устройству. Чтобы найти код, который формирует части сообщения передаваемого в ЖЖ через xmlrpc откроем основной файл модуля ljxp.module (я использовал последнюю версию 1.6). Найдем в нем функцию ljxp_post() в строке 402. Именно она и формирует из ноды требуемое по спецификации API ЖЖ сообщение и передает его на сайт. Если вы не используете системное body, то поля переменной $node->teaser и $node->body содержат пустое значение. Именно здесь мы их и можем заполнить любым содержанием.

В принципе на этом идея хака понятна, но приведу один практический пример из собственных проектов. Я редко использую body, а для имитации его функционала применяю два поля: Анонс (field_resume) и Полный текст (field_text). В моем случае хак выглядит так (со строки 403):

// begin of hack $node->teaser = $node->field_resume[0]['value']; $node->body = $node->field_resume[0]['value'] . $node->field_text[0]['value']; // end of hack

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

Есть и другой вариант, который подойдет для ноды с любым количеством полей:

// begin of hack $node->teaser = node_view($node, TRUE, FALSE, FALSE); $node->body = node_view($node, FALSE, FALSE, FALSE); // end of hack

Из недостатков, вы не сможете запостить таким образом поля со ссылками, файлы или картинки. Работа хака проверена только на текстовых полях.

Да, знаю хак это плохо, но в данном случае иначе никак.

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

Быстрый хак модуля Livejournal Crossposter (ljxp) для работы с полями CCK

Довольно распространенный модуль Livejournal Crossposter (ljxp) предназначен для автоматической публикации материалов Drupal-сайтов на Livejournal-совместимых сервисах. Я уже как-то писал о его установке и настройке у себя в блоге и на Drupal.ru. Но у модуля есть один существенный недостаток – он кросспостит в ЖЖ только стандартные заголовки ноды и ее тело (body) в виде тизера или полного текста. Поля CCK в нем полностью игнорируются. И устранить этот недостаток пока можно только хаком.

Сам модуль ljxp достаточно прост по своему устройству. Чтобы найти код, который формирует части сообщения передаваемого в ЖЖ через xmlrpc откроем основной файл модуля ljxp.module (я использовал последнюю версию 1.6). Найдем в нем функцию ljxp_post() в строке 402. Именно она и формирует из ноды требуемое по спецификации API ЖЖ сообщение и передает его на сайт. Если вы не используете системное body, то поля переменной $node->teaser и $node->body содержат пустое значение. Именно здесь мы их и можем заполнить любым содержанием.

В принципе на этом идея хака понятна, но приведу один практический пример из собственных проектов. Я редко использую body, а для имитации его функционала применяю два поля: Анонс (field_resume) и Полный текст (field_text). В моем случае хак выглядит так (со строки 403):

// begin of hack $node->teaser = $node->field_resume[0]['value']; $node->body = $node->field_resume[0]['value'] . $node->field_text[0]['value']; // end of hack

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

Есть и другой вариант, который подойдет для ноды с любым количеством полей:

// begin of hack $node->teaser = node_view($node, TRUE, FALSE, FALSE); $node->body = node_view($node, FALSE, FALSE, FALSE); // end of hack

Из недостатков, вы не сможете запостить таким образом поля со ссылками, файлы или картинки. Работа хака проверена только на текстовых полях.

Да, знаю хак это плохо, но в данном случае иначе никак.

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

OpenStore – моя сборка Drupal+Ubercart (тот самый философский камень)

Несколько запоздало (в свете выхода 7-й версии) представляю свою сборку Drupal 6.x + Ubercart 2.x под названием OpenStore.

Сайт проекта OpenStore

Скачать OpenStore

UPD от 22.01.2011 Качаем последний dev!

Более 2-х лет назад я столкнулся с такой штукой как Drupal пятой модели. Мой интерес был практический – сделать интернет-магазин, который можно было бы расширять по мере необходимости, имел бы понятную архитектуру, и тд… До этого у меня были непродолжительные романы с другими решениями для e-commerce вроде Oscommerce и проч., к которым я довольно быстро охладел.

Drupal был свеж, заманчив, обещал много разных благ, а в связке с Ubercart, похоже, должен был дать всё то, о чём я и не мечтал. Я решил смастерить свой свечной заводик в течении месяца-два… Но, господа, недаром Друпликон ухмыляется как Мона Лиза

Самостоятельная разботка интернет-магазина на основе Drupal для человека, незнакомого с API Drupal, и, тем более, с php, и, тем более, с базовыми знаниями CSS+HTML представляет собой кромешный ад и не может быть рекомендована, если вы хотите просто начать свой бизнес в сети, т.е вас интересует немедленный результат

Сборка OpenStore – это, образно говоря, попытка понизить пресловутый «порог вхождения» для систем на основе Drupal. При установке подключаются все нужные (как по мне) модули, делаются необходимые настройки путём записи соответсвующих значений в БД. Вы получаете готовый к употреблению магазин (во всяком случае так задумано), сэкономив КУЧУ времени, затраченное на курение мануалов, основная часть которых на английском и терзание Google

Аналогичные решения

На данный момент науке известны такие сборки на основе Drupal+Ubercart:

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

http://drupal-shop.ru – пожалуй первая попытка создания сборки магазина. Система мне неизвестна, так как небесплатна. По всем внешним признакам (динамика публикаций, выхода обновлений и тд) похоже, что проект приостановлен либо перешёл в вялотекущее состояние.

http://www.drushop.ru — наиболее известное бесплатное решение на сегодня, но обладающий одним существенным недостатком — установочный профиль загружает готовый дамп базы данных, содержащий настройки системы. Этот наиболее лёгкий и одновременно наиболее плохой способ переноса конфигураций для реального сайта, несущий серьёзные потенциальные проблемы в будущем при обновлении и дебага сборки. По всем внешним признакам (динамика публикаций, выхода обновлений и тд) похоже, что проект приостановлен либо перешёл в вялотекущее состояние.

В сравнении с вышеуказанными сборками, OpenStore – это лучшее, что может случиться с вами. Реально. Объективно.

Возможности сборки интернет-магазина OpenStore

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

Помним и благодарим героев

Дабы не утомлять сообщество перечислением фич, некоторые базовые возможности сборки указаны здесь

В чём изюм

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

Кто бы спорил, есть три вещи, на которые можно смотреть вечно:

1. как горит огонь
2. как течет вода
3. как кто-то пытается оттемизировать то, что породил Друпал

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

В OpenStore широко используется функция hook_preprocess(), позволяющая самостоятельно определять или модифицировать существующие переменные, которые выводят различную информацию (картинки, цены, кнопка «Добавить в корзину» и многое другое…)

Например, вывести в произвольном месте кнопку «Добавить в корзину»


<?php print $show_cart_button; ?>

Или, вывести одним махом блок с «быстрыми закладками», содержащий характеристики товара, медиа-файлы, отзывы, дополнительные картинки


<?php print $show_product_tabs; ?>

Пример, как это это может выглядеть

Функция hook_preprocess() используется не только для страниц товаров, а и для профиля пользователя, а также для форм редактирования и добавления страниц.
Ваши контент-менеджеры, заполняющие страницы с товаров, теперь скажут вам «Спасибо, друг!». С помощью нехитрых php-сниппетов, наподобии указанных выше, вы можете переставлять поля и кнопки как душе угодно

Внешнее оформление для фронт-енда (видят покупатели) и бэк-енда (видят администраторы) разделено. Тема “Frontend” и “Administrator” соответсвенно

Тема “Adminastrator” (рабочее название “Антиблондинка”) – самая симпатичная тема продвинутого администратора на данный момент

Ужас, летящий в ночи, под названием “Garland”…улетел.

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

1. Управление
2. Магазин
3. Очереди
4. Заказы
5. Страницы

Закладка «Управление» – основная страница по адресу /admin, так называемая «Панель управления» размечена на регионы, в которые можно вставлять любые блоки. Подчёркиваю, любые.

По умолчанию там выведены блоки с диаграммами, показывающие статистику посещений от Google Analytics, графики состояния ситемы (пользователи, страницы, системный журнал), последние заказы, последние зарегистрированные пользователи, последние рассылки

2 типа переключения блоков:

1. Горизонтальные «быстрые» закладки на Jquery
2. Сворачивающиеся поля с эффектом запоминания (используются cookie) положения на Jquery

Закладка «Магазин» – страница по адресу /admin/store, где собрано всё, что касается именно Ubercart. Раньше это была скучная таблица, теперь — сексуальный интерфейс.

Закладка «Очереди» – управление позициями элементов в разных списках («Рекомендованные товары», «Новости» и тд) через удобный drag&drop интерфейс

Закладка «Заказы» – страница с последними заказами магазина

Закладка «Страница» – основной менеджер страниц магазина с фильтрами и массовыми операциями.

Если вы делаете магазина на заказ и применяете в нём «Adminastrator», думаю, ваш заказчик будет отсатисфачен по-полной.

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

Установка

Всё как обычно. Скачиваете зелёненькое, распаковываете архив со сборкой куда надо, например в корневую директорию домена domain.com, затем набираете http://domain.com, выбираете профиль установки «OpenStore» и следуете дальнейшим инструкциям. Может потребоваться корректировка параметра max_execution_time в сторону увеличения.

В планах, помимо исправления текущих ошибок:

1) Написание глобальной документации для администраторов магазина. Скорее всего это будет встроенная справка, через модуль Advanced Help

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

3)Разобраться с применением скидок, т.е упорядочить через Сonditional Actions и, в перспективе, через Rules (для 7-й версии)

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

5) Разобраться с массовым обновлением цен и наличия. В составе сборки есть такой модуль, но он требует улучшения

6)Предпринять попытку интегрировать таки с 1С

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

Помочь проекту

1) Мне нужен фидбек от каждого, кому интересна эта тема. На основании вашей активности я решу, должна ли существовать и в каком направлении развиваться эта сборка. Будут версии для Друпал 7 и выше и на качественно новом уровне, но в том случае, если я увижу, что это будет реально востребовано.

2) Нужна помощь дизайнера. То, как это всё выглядет сейчас мне не очень нравится. Нужно разработать единый стиль всего проекта и сделать дизайн в графическом формате. Я имею ввиду внешний вид админки, самого фронтенда, сайта проекта. Я не могу платить за дизайн именно сейчас, поэтому предлагаю взамен такие блага:

Общее оздоровление кармы за счёт участия в Open Source Почётное звание дизайнера проекта, со ссылкой на ваш ресурс с главной сайта проекта Ссылки на вас со страниц разработанных вами тем Лучшие рекомендации с моей стороны, приоритет в сотрудничестве в будущем. Всё разработанное вами может и ДОЛЖНО быть использовано в вашем портфолио. Незачем наполнять свой портфель, задёшево продавая свои умения. Сделайте для всех и без денег.

3) Нужна помощь программеров. Приоритетные задачи: интеграция с 1С, толковый импорт/обновление товарной базы. Плюс куча всего по мелочам. Форма сотрудничества оговаривается индивидуально, но принцип всегда один — «ты мне, я тебе»

…и ещё

Отзывы, замечания о найденных багах, пожелания просьба оставлять ТОЛЬКО в багтреккере проекта. Не оставляйте их в этом топике, мне их будет сложно отслеживать.

Проект реализован по общественной лицензии GNU . Никаких гарантий и ответственности за возможный ущерб до тех пор, пока вы не платите за софт.

Это beta релиз. Я долго и упорно работал над этой сборкой, было несколько глобальных переделок. Что-то могло затереться, очевидные вещи могут не работать или работать не так, как это ожидается. Всё же я решил сделать публичный релиз, чтобы народ посмотрел свежим глазом. Просьба относиться с пониманием.

Для опытных программистов: местами мой код не отличается изяществом. Буду рад конструктивным замечаниям по оптимизации этого.

Вот то, что я хотел сказать на данный момент.

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

————————————

Важные объявления:

Разобрался в настройках Openstore сам и хочешь помочь другим? Нужны добровольцы для написания руководства пользователя интернет магазина на основе Уберкарт!

Сделал таки магазин с использованием сборки OpenStore?

Отправь своё детище на мыло openstore.org.ua@gmail.com c указанием своего логина на сайте проекта www.openstore.org.ua. Я размещу на этот магазин прямую ссылку с сайта проекта!

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

OpenStore – моя сборка Drupal+Ubercart (тот самый философский камень)

Несколько запоздало (в свете выхода 7-й версии) представляю свою сборку Drupal 6.x + Ubercart 2.x под названием OpenStore.

Сайт проекта OpenStore

Скачать OpenStore

UPD от 22.01.2011 Качаем последний dev!

Более 2-х лет назад я столкнулся с такой штукой как Drupal пятой модели. Мой интерес был практический – сделать интернет-магазин, который можно было бы расширять по мере необходимости, имел бы понятную архитектуру, и тд… До этого у меня были непродолжительные романы с другими решениями для e-commerce вроде Oscommerce и проч., к которым я довольно быстро охладел.

Drupal был свеж, заманчив, обещал много разных благ, а в связке с Ubercart, похоже, должен был дать всё то, о чём я и не мечтал. Я решил смастерить свой свечной заводик в течении месяца-два… Но, господа, недаром Друпликон ухмыляется как Мона Лиза

Самостоятельная разботка интернет-магазина на основе Drupal для человека, незнакомого с API Drupal, и, тем более, с php, и, тем более, с базовыми знаниями CSS+HTML представляет собой кромешный ад и не может быть рекомендована, если вы хотите просто начать свой бизнес в сети, т.е вас интересует немедленный результат

Сборка OpenStore – это, образно говоря, попытка понизить пресловутый «порог вхождения» для систем на основе Drupal. При установке подключаются все нужные (как по мне) модули, делаются необходимые настройки путём записи соответсвующих значений в БД. Вы получаете готовый к употреблению магазин (во всяком случае так задумано), сэкономив КУЧУ времени, затраченное на курение мануалов, основная часть которых на английском и терзание Google

Аналогичные решения

На данный момент науке известны такие сборки на основе Drupal+Ubercart:

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

http://drupal-shop.ru – пожалуй первая попытка создания сборки магазина. Система мне неизвестна, так как небесплатна. По всем внешним признакам (динамика публикаций, выхода обновлений и тд) похоже, что проект приостановлен либо перешёл в вялотекущее состояние.

http://www.drushop.ru — наиболее известное бесплатное решение на сегодня, но обладающий одним существенным недостатком — установочный профиль загружает готовый дамп базы данных, содержащий настройки системы. Этот наиболее лёгкий и одновременно наиболее плохой способ переноса конфигураций для реального сайта, несущий серьёзные потенциальные проблемы в будущем при обновлении и дебага сборки. По всем внешним признакам (динамика публикаций, выхода обновлений и тд) похоже, что проект приостановлен либо перешёл в вялотекущее состояние.

В сравнении с вышеуказанными сборками, OpenStore – это лучшее, что может случиться с вами. Реально. Объективно.

Возможности сборки интернет-магазина OpenStore

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

Помним и благодарим героев

Дабы не утомлять сообщество перечислением фич, некоторые базовые возможности сборки указаны здесь

В чём изюм

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

Кто бы спорил, есть три вещи, на которые можно смотреть вечно:

1. как горит огонь
2. как течет вода
3. как кто-то пытается оттемизировать то, что породил Друпал

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

В OpenStore широко используется функция hook_preprocess(), позволяющая самостоятельно определять или модифицировать существующие переменные, которые выводят различную информацию (картинки, цены, кнопка «Добавить в корзину» и многое другое…)

Например, вывести в произвольном месте кнопку «Добавить в корзину»


<?php print $show_cart_button; ?>

Или, вывести одним махом блок с «быстрыми закладками», содержащий характеристики товара, медиа-файлы, отзывы, дополнительные картинки


<?php print $show_product_tabs; ?>

Пример, как это это может выглядеть

Функция hook_preprocess() используется не только для страниц товаров, а и для профиля пользователя, а также для форм редактирования и добавления страниц.
Ваши контент-менеджеры, заполняющие страницы с товаров, теперь скажут вам «Спасибо, друг!». С помощью нехитрых php-сниппетов, наподобии указанных выше, вы можете переставлять поля и кнопки как душе угодно

Внешнее оформление для фронт-енда (видят покупатели) и бэк-енда (видят администраторы) разделено. Тема “Frontend” и “Administrator” соответсвенно

Тема “Adminastrator” (рабочее название “Антиблондинка”) – самая симпатичная тема продвинутого администратора на данный момент

Ужас, летящий в ночи, под названием “Garland”…улетел.

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

1. Управление
2. Магазин
3. Очереди
4. Заказы
5. Страницы

Закладка «Управление» – основная страница по адресу /admin, так называемая «Панель управления» размечена на регионы, в которые можно вставлять любые блоки. Подчёркиваю, любые.

По умолчанию там выведены блоки с диаграммами, показывающие статистику посещений от Google Analytics, графики состояния ситемы (пользователи, страницы, системный журнал), последние заказы, последние зарегистрированные пользователи, последние рассылки

2 типа переключения блоков:

1. Горизонтальные «быстрые» закладки на Jquery
2. Сворачивающиеся поля с эффектом запоминания (используются cookie) положения на Jquery

Закладка «Магазин» – страница по адресу /admin/store, где собрано всё, что касается именно Ubercart. Раньше это была скучная таблица, теперь — сексуальный интерфейс.

Закладка «Очереди» – управление позициями элементов в разных списках («Рекомендованные товары», «Новости» и тд) через удобный drag&drop интерфейс

Закладка «Заказы» – страница с последними заказами магазина

Закладка «Страница» – основной менеджер страниц магазина с фильтрами и массовыми операциями.

Если вы делаете магазина на заказ и применяете в нём «Adminastrator», думаю, ваш заказчик будет отсатисфачен по-полной.

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

Установка

Всё как обычно. Скачиваете зелёненькое, распаковываете архив со сборкой куда надо, например в корневую директорию домена domain.com, затем набираете http://domain.com, выбираете профиль установки «OpenStore» и следуете дальнейшим инструкциям. Может потребоваться корректировка параметра max_execution_time в сторону увеличения.

В планах, помимо исправления текущих ошибок:

1) Написание глобальной документации для администраторов магазина. Скорее всего это будет встроенная справка, через модуль Advanced Help

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

3)Разобраться с применением скидок, т.е упорядочить через Сonditional Actions и, в перспективе, через Rules (для 7-й версии)

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

5) Разобраться с массовым обновлением цен и наличия. В составе сборки есть такой модуль, но он требует улучшения

6)Предпринять попытку интегрировать таки с 1С

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

Помочь проекту

1) Мне нужен фидбек от каждого, кому интересна эта тема. На основании вашей активности я решу, должна ли существовать и в каком направлении развиваться эта сборка. Будут версии для Друпал 7 и выше и на качественно новом уровне, но в том случае, если я увижу, что это будет реально востребовано.

2) Нужна помощь дизайнера. То, как это всё выглядет сейчас мне не очень нравится. Нужно разработать единый стиль всего проекта и сделать дизайн в графическом формате. Я имею ввиду внешний вид админки, самого фронтенда, сайта проекта. Я не могу платить за дизайн именно сейчас, поэтому предлагаю взамен такие блага:

Общее оздоровление кармы за счёт участия в Open Source Почётное звание дизайнера проекта, со ссылкой на ваш ресурс с главной сайта проекта Ссылки на вас со страниц разработанных вами тем Лучшие рекомендации с моей стороны, приоритет в сотрудничестве в будущем. Всё разработанное вами может и ДОЛЖНО быть использовано в вашем портфолио. Незачем наполнять свой портфель, задёшево продавая свои умения. Сделайте для всех и без денег.

3) Нужна помощь программеров. Приоритетные задачи: интеграция с 1С, толковый импорт/обновление товарной базы. Плюс куча всего по мелочам. Форма сотрудничества оговаривается индивидуально, но принцип всегда один — «ты мне, я тебе»

…и ещё

Отзывы, замечания о найденных багах, пожелания просьба оставлять ТОЛЬКО в багтреккере проекта. Не оставляйте их в этом топике, мне их будет сложно отслеживать.

Проект реализован по общественной лицензии GNU . Никаких гарантий и ответственности за возможный ущерб до тех пор, пока вы не платите за софт.

Это beta релиз. Я долго и упорно работал над этой сборкой, было несколько глобальных переделок. Что-то могло затереться, очевидные вещи могут не работать или работать не так, как это ожидается. Всё же я решил сделать публичный релиз, чтобы народ посмотрел свежим глазом. Просьба относиться с пониманием.

Для опытных программистов: местами мой код не отличается изяществом. Буду рад конструктивным замечаниям по оптимизации этого.

Вот то, что я хотел сказать на данный момент.

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

————————————

Важные объявления:

Разобрался в настройках Openstore сам и хочешь помочь другим? Нужны добровольцы для написания руководства пользователя интернет магазина на основе Уберкарт!

Сделал таки магазин с использованием сборки OpenStore?

Отправь своё детище на мыло openstore.org.ua@gmail.com c указанием своего логина на сайте проекта www.openstore.org.ua. Я размещу на этот магазин прямую ссылку с сайта проекта!

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

Модуль расчета доставки EMS Russian Post – для Ubercart

По мотивам обсуждения http://drupal.ru/node/53748 сделал модуль расчета доставки средствами EMS Russia.
Модуль использует родные поля доставки, предоставленные уберкартом.
Т.е. человек при оформлении заказа выбирает область, и вписывает город. город при необходимости (если не найден в базе ems) чистится от “г,пос,…”, и проверяется еще раз. Если фейл – считаем как до региона. Есть поддержка международных отправлений.

Адрес проекта: http://drupal.org/project/uc_ems

Скрины:

“Нет связи с EMS”:

Страница сеттингов:

Как видите, есть настройки типа добавочной стоимости.

В итоге был так же создан багрепорт в Уберкарт (устарели регионы России, модуль это пока решает динамической подменой вводимых пользователем данных):
http://drupal.org/node/1027060

Если кто-то хочет материально отблагодарить разработчика, т.е. меня, я не против
В комментарии к переводу просьба писать “ems от [ник на drupal.ru]“, если хотите быть упомянуты на странице модуля drupal.org – сообщайте с каким урлом/именем.
Yandex.money
transfer-pay@yandex.ru
или номер счета: 4100190415303
Webmoney
Z352678179207
R114412215620
E406623242647

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

Модуль расчета доставки EMS Russian Post – для Ubercart

По мотивам обсуждения http://drupal.ru/node/53748 сделал модуль расчета доставки средствами EMS Russia.
Модуль использует родные поля доставки, предоставленные уберкартом.
Т.е. человек при оформлении заказа выбирает область, и вписывает город. город при необходимости (если не найден в базе ems) чистится от “г,пос,…”, и проверяется еще раз. Если фейл – считаем как до региона. Есть поддержка международных отправлений.

Адрес проекта: http://drupal.org/project/uc_ems

Скрины:

“Нет связи с EMS”:

Страница сеттингов:

Как видите, есть настройки типа добавочной стоимости.

В итоге был так же создан багрепорт в Уберкарт (устарели регионы России, модуль это пока решает динамической подменой вводимых пользователем данных):
http://drupal.org/node/1027060

Если кто-то хочет материально отблагодарить разработчика, т.е. меня, я не против
В комментарии к переводу просьба писать “ems от [ник на drupal.ru]“, если хотите быть упомянуты на странице модуля drupal.org – сообщайте с каким урлом/именем.
Yandex.money
transfer-pay@yandex.ru
или номер счета: 4100190415303
Webmoney
Z352678179207
R114412215620
E406623242647

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

Автоматическая установка Drupal 7 с командной строки

В 7-й версии появилась возможность автоматизировать процесс установки, создав конфигурационный файл install.site.php, где site – название вашего сайта. Этот файл нужно поместить туда же, где расположен стандартный install.php (в корне сайта). В файл install.site.php добавить следующий скрипт:


<?php
include_once 'install.php';
$settings = array(
  'parameters' => array(
    'profile' => 'default',
    'locale' => 'en',
  ),
  'forms' => array(
    'install_settings_form' => array(
      'driver' => 'mysql',  //тип базы данных
      'database' => 'my_db_name', //имя базы данных
      'username' => 'my_db_username', //имя пользователя базы данных
      'password' => 'my_db_password' //пароль к базе данных
    ),
    'install_configure_form' => array(
      'site_name' => 'My site',  //название для вашего сайта
      'site_mail' => 'admin@mymail.com', //email сайта
      'account' => array(
        'name' => 'admin',  //имя суперпользователя сайта
        'mail' => 'admin@mymail.com',  //email суперпользователя (обычно совпадает с email сайта)
        'pass' => array(
          'pass1' => 'password_for_site',  //пароль суперпользователя
          'pass2' => 'password_for_site',  //подтверждение пароля суперпользователя
        ),
      ),
      'update_status_module' => array(1 => TRUE),  //включить иодуль Update Manager
      'clean_url' => TRUE,  //включить чистые ссылки
    ),
  ),
);
install_drupal($settings);
?>

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

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

[урок] Осваиваем Hierarhical Select

Как и было обещано, пишу.
Задача:
Изучить возможности Hierarhical Select и научиться его использовать в своих сайтах.

Техническое задание:
Разработать сайт, который будет показывать участников в проектах.

Набор софта:
Drupal 6.20 русская локаль
Модули: CCK, taxonomy, hierarchital_select

Начнём с установки.
Как ставить друп рассказывать не буду (смайлик). CCK и taxonomy закидываются в modules, HS закидывается в sites/all/modules
Отмечаем их галками в /admin/build/modules/list и жмём “сохранить конфигурацию”.
После этого делаем /update.php для корректной установки HS. Идём в /admin/reports/status и убеждаемся в корректности установки.

Установка закончена.

Теперь, давайте подготовим словарь, для реализации нашего ТЗ.
Словарь будет иметь структуру отдел->сотрудник
Сделаем это!

Готовим словарь
Добавляем новый словарь /admin/content/taxonomy/add/vocabulary
Заполняем данные

Галки для привязки с типу материала не ставим!
Ставим галку “обязательно” и жмём “сохранить”.
Убедились, что словарь создан

Добавляем данные
Как я говорил выше, что словарь будет в формате отдел->сотрудник, давайте научимся это делать!

Жмём добавить термины. (в данном случае я не пишу ссылку, так как не совпадут идентификаторы словарей)
Сначала сформируем структуру нашей компании, а потом будем наполнять её сотрудниками.
Через форму “добавить термин” просто забиваем список отделов

Заполняем пока просто “название термина” остальное не трогаем.
Получится примерно такая картина

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

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

Словарь готов. Настроим его.

Жмём уже “изменить словарь”
Нас пока интересует только настройка множественного выбора (в проекте ведь может участвовать несколько сотрудников)

Словарь настроен.

Создадим тип материала
Топаем в /admin/content/types/add
Заполняем поля

Сохраняем.
Добавляем поле /admin/content/node-type/project/fields

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

Сохраняем.
Идём в /node/add/project и наслаждаемся

БИНГО!

Спасибо за потраченное время. Жду помидоры.

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

i18n – главная страница сайта на разных языках

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

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

Решение, как часто бывает, нашлось на drupal.org

Итак, чтобы иметь возможность указать адрес страницы, отображаемой в качестве главной, для каждого языка, нужно в settings.php добавить следующие строки:

<?php
$conf['i18n_variables'] = array(
'menu_primary_links_source',
'menu_secondary_links_source',
'site_frontpage'
);
?>

В этом примере можно еще указать раздельные меню (primary и secondary links) для разных языков.

После этого заходим на страницу /admin/settings/site-information, выставляем там значения по умолчанию. Переключаемся на другой язык, выставляем эти значения для этого языка, и т.д.

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

<?php
$conf['i18n_variables'] = array(
// Site name, slogan, mission, etc..
'site_name',
'site_slogan',
'site_mission',
'site_footer',
'anonymous',
// Node help
'blog_help',
'story_help',
// User configuration
'user_registration_help',
'user_mail_welcome_subject',
'user_mail_welcome_body',
'user_mail_approval_subject',
'user_mail_approval_body',
'user_mail_pass_subject',
'user_mail_pass_body',
// Different front page for eah language
'site_frontpage',
// Primary and secondary links
'menu_primary_links_source',
'menu_secondary_links_source',
// Contact form information
'contact_form_information',
// For theme variables, read more below
'theme_settings',
'theme_garland_settings',
'theme_zen_settings',
);
?>

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

Drupal 7 Вышел

Вышел Drupal 7
Скачать со страницы http://drupal.org/project/drupal

Комментарии к релизу (много исправлений по сравнению с RC4)
Пресс-релиз на русском языке

Прикрепленный файл Размер d7.png 49.25 кб

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

Drupal 7 Вышел

Вышел Drupal 7
Скачать со страницы http://drupal.org/project/drupal

Комментарии к релизу (много исправлений по сравнению с RC4)
Пресс-релиз на русском языке

Прикрепленный файл Размер d7.png 49.25 кб

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

анонимное кэширование nginx

Небольшая статья по кэшированию nginx для анонимных пользователей друпала(хабраюзеры могут поддержать)
http://habrahabr.ru/blogs/drupal/110958/

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

До и после. Перевод на правильную платформу

Теоретически я всегда знал, что лучше использовать популярную CMS, чем какой либо непонятный “самопис”… Но я не предполагал, что есть умники, которые пытаются выдать более менее нормальную цмс за свое поделие, при этом изуродовав исходники…
Небольшой сказ о том, как перевести сайт на правильную систему управления (не забываем на каком ресурсе находимся )

Порядок действий Анализ существующего сайта

На это этапе необходимо выявить существующие недостатки сайта и способы их устранения. Вполне может получится так, что переводить его на другой движок смысла не будет, но проще доработать имеющееся. Стоит так же обратить внимание на посещаемость сайта и источники пользователей, а так же наличие внешних работающих ссылок. Если их количество достаточно большое, продумайте как сохранить адреса (лучше не просто редирект сделать, но оставить УРЛы старыми). Определите технические недостатки: верстка, скорость работы, наличие мета-тегов и тд.

Определение способов решений

И вот Вы определились, что старый движок не справляется с задачами проекта, и нужно его менять. Не буду заострять внимание, почему именно выбран Drupal, холиваров на эту тему хватает. Под “способами решений” я подразумеваю набор используемых модулей. Рекомендую включать модули, имеющие хорошую поддержку и высокую статистику, находящиеся в стабильном состоянии, а главное удовлетворяющие (а может даже и с заделом на будущее) текущим требованиям проекта.

Перед реализацией…

Еще раз оглянитесь назад и убедитесь, что ранее все сделали правильно. Все ок? Продолжаем.
Перед тем, как начать, сделайте набросок микрозадач, шагов на пути выполнения данной работы. С этого момента, по сути, идет разработка нового сайта, но с учетом недостатков предыдущего и, так как выбран drupal, заделом на светлое будущее.

Реализация задуманного

Эта тема совсем отдельного поста, так как здесь уже идет речь о разработке.
Так как статья все таки о Друпале, и полезна будет новичкам (что бы не бросались в бой раньше времени), привожу ссылку на очень хорошее руководство http://drupal.ru/quickstart

Практический пример

Не спроста мысли вышеизложенные в голову пришли, пришлось подобное делать.
Попал в руки недавно сайт, который нужно администрировать, наполнять и продвигать.
Разработчик сделал его на wordpresse и попытался удалить все воспоминания об используемой CMS. В итоге остались какие-то файлы со скриптами и оформление, а страницы он сделал вручную (сайт маленький, порядка 15 страниц на тот момент). В общем, я принял решение убить старое поделие, и обустроится на перспективной, стратегически верной платформе.
Коротко (до – после):

URL созданы вручную – ЧПУ, создаются автоматом; Отсутствие мета-тегов – Все на месте: заголовки, описания, ключевые слова; Некликабельный логотип – Логотип и название компании ведут на главную; Мелкие недочеты в оформлении – Исправлены нечитаемые шрифты4 Не адаптирован под разрешение 1024х768 – Поддерживаются разрешения мониторов 1024×768 и более; Табличная верстка – Блочная верстка; (новое) Добавлены дополнительные меню (строчка вверху и блок внизу) для повышения удобства, перелинковки; (новое) Добавлены “хлебные крошки”.

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

Редактирование материалов: CKeditor+IMCE; Создание фотогалереи: CCK+ImageField+ImageCach+ThickBox; Навигация по сайту: DHTML menu, Breadcrumbs menu; Категоризация материалов: Taxonomy, Tagadelic; Поисковое продвижение: Nodewords, Page title, Pathauto, Global Redirect.

Настройку и пошаговое руководство не вижу смысла приводить – это для каждого проекта эти действия уникальны.

Живой результат работы в сети: http://svelto.info
Конструктивная критика приветствуется.

Attached poll “Приходилось ли Вам и как часто переделывать чужую работу? Поделитесь своим опытом, коллеги”.
Register or login to poll
Results:
Да, очень часто приходится: 5 голосов
Да, бывает, но очень редко: 2 голоса
Нет: 0 голосов

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

Все Seo Drupal модули

Всем привет! Данная статья не для профессионалов, которые уже всё знают , а для новичков. Уверен, многим пригодится на ниве раскрутки и оптимизации сайта на движке Drupal.
Материал представляет собой вольный перевод статьи “A List of the Best Drupal SEO & Social Media Modules”, достопочтенного Джейсона, http://www.themesnap.com/blogs/jason

Полный перевод с ссылками на модули представлен на сайте SEO программы со скидками

Список лучших SEO и социальных модулей для Drupal

SEO DRUPAL

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

Наиболее распространенные модули Drupal SEO

1. Page Title Module – заголовок страницы можно найти в начале HTML кода внутри тега .Он также используется в поисковой выдаче (SERP) и может значительно повысить ваши сайты в SEO. Это, пожалуй, наиболее малоиспользуемый аспект при создании веб-страницы, как вебмастер не добавляет ценные ключевые слова для тега .

2. Nodewords - Эти SEO модули позволяют добавлять мета-теги для Drupal страниц, как вручную, так и автоматически в зависимости от различных параметров.Обратите внимание на мета-теги, такие как ключевые слова, описание и канонические URL, они могут помочь получить лучшее позиционирование в поисковой системе.

3. Nodewords Page Title – Этот модуль позволяет использовать возможности Nodewords в пользовательских страницах для установки заголовка страницы с использованием подстановочных путей и глобальных маркеров (Тoken).Отлично подходит для труднообрабатываемых названий страниц в модулях Views, Panels, и других не-узловых (non-node) путях.Этот модуль сочетает лучшие черты Nodewords и page_title модулей.

4. Related Content – это отличный SEO модуль позволяет разработчикам сайта легко выбрать для каждого узла основу, которая определит – какие узлы должны быть показаны вместе с этим узлом.Узлы, которые доступны для выбора имеют один или несколько видов, предоставляемых Views модулем.Как узлы отображаются настраивается, а также темизируется.Модуль также обеспечивает небольшой, но мощный API для продвинутых пользователей.

5. Pathauto - модуль Pathauto автоматически генерирует псевдонимы путей (дружественные поисковой системе URL) для различных видов контента (узлов, категорий, пользователей), не требуя от пользователя вручную указывать путь псевдонима.Это позволяет получить псевдонимы вроде /category/my-node-title.html вместо / node/123.Псевдонимы основаны на “паттернах” системы, которые Администратор может контролировать.

6. Sitemap - Этот модуль предоставляет карту сайта, которая дает посетителям краткий обзор вашего сайта.Он также может отображать RSS-каналы для всех блогов и категорий.Drupal генерирует RSS-каналы автоматически, но немногие, кажется, знают, что такое существует. Карта может показывать следующие пункты: сообщение, которое будет отображаться вверху карты, последние блоги, любые книги, любые меню, которые будут показываться полностью развернутыми, любые категории, т.е. словари, со всеми развернуыми терминами.При желании с количеством узлов и RSS-каналами.

7. Path Redirect – Этот модуль позволяет вам указать перенаправление с одного пути на другой путь или внешний URL, используя любой статус HTTP перенаправления .Это перенаправление модуля является большим для переадресации 301, 302 (временного перенаправления), и несколько других типов перенаправления, когда вы, возможно, потребуется удалить или переместить страницы вашего сайта Drupal.

8. Google Analytics Module – Добавляет веб-статистику Google Аналитикс систему слежения на ваш сайт.Этот модуль позволяет добавлять богатые возможности статистики Google на ваш сайт Drupal.

9. XML Sitemap – карты сайта Модуль XML создает карту сайта, что соответствует sitemaps.org спецификации .Это помогает поисковым системам более грамотно сканировать веб-сайт и хранить свои результаты в актуальном состоянии.Карта сайта созданная этим модулем может быть автоматически передана Ask, Google, Bing (ранее Windows Live Search) и Yahoo! поисковым системам.Модуль также поставляется с несколькими подмодулями, которые могут добавить карте сайта ссылки на содержание, пункты меню, термины таксономии, и профили пользователей.

Другие полезные модули Drupal SEO

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

1. Content Optimizer – Этот модуль позволяет быстро проанализировать сайт на предмет SEO, обеспечить мгновенный анализ контента на сайте, как краткое и доступное руководство для обеспечения лучших SEO методов и последовательности действий.Анализ показывает актуальную статистику контента и рекомендации для того, чтобы улучшить ранжирование поисковой системы.

2. Glossify Internal Links Auto SEO – Что он делает для SEO?Этот модуль автоматически генерирует внутренние ссылки узла (ноды) и на каждом узле базу внешних ссылок (перекрёстные ссылки) – идеально подходит для SEO оптимизации страниц вашего сайта и страниц партнеров.В настоящее время модуль основан на узле (ноде) и ищет названия узла (ноды) в теле узла и делает ссылками. В общем, поставьте и поймете. Есть планы распространить его действие на термины таксономии тоже.

3. Scribe SEO – Scribe SEO является программным обеспечением поисковой оптимизации для Drupal и других платформ CMS – представьте себе этот модуль как помощника оптимизации контента, который анализирует веб-страницы, сообщения в блогах, и интернет-пресс-релизы по одному нажатию кнопки.Затем Scribe SEO говорит веб-мастерам, как настроить их контент, чтобы получить больше трафика с поисковых систем, при сохранении качества содержания текстов для читателя.

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

5. QA Checklist – Этот модуль дает перечень лучших методов для гарантии качества сайта на Drupal.Он предоставляет список, который поможет вам отслеживать, какие задачи необходимо сделать.Во-первых, вы увидите, какие модули вы уже установили.Тогда все что вам нужно сделать, это пролистать вниз списка не отмеченных элементов и отметить их.

6. SEO Friend – SEO Friend показывает обзор всех имеющихся отчетов и список SEO-связанных модулей Drupal и, если они были установлены и включены, например, Meta Tags (узлов), Meta Тагс (путь), Page Title отчет, и Referrer Report – показывает резюме ссылающихся на Ваш сайт.

7. Related Block – Это поиск узлов, которые тесно связаны с названием и содержанием текущего узла.Блок показывается только на конкретных типах узлов.Слова в заголовке имееют более сильный приоритет, чем те, что в содержании.Отбираются часто используемые слова (пока только для английского языка), и игнорирует слова до 3-х символов.

8. Similar by Terms - Этот Drupal модуль обеспечивает контекстную связь для элементов контента, показывая блок со ссылками на другие, похожие по содержанию статьи.Сходство на основе терминов таксономии привязанных к содержимому.Блоки доступны по сходству в рамках каждого из определенных словарей на сайте, а также, имеется блок для сходства во всех словарях.

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

Все Seo Drupal модули

Всем привет! Данная статья не для профессионалов, которые уже всё знают , а для новичков. Уверен, многим пригодится на ниве раскрутки и оптимизации сайта на движке Drupal.
Материал представляет собой вольный перевод статьи “A List of the Best Drupal SEO & Social Media Modules”, достопочтенного Джейсона, http://www.themesnap.com/blogs/jason

Полный перевод с ссылками на модули представлен на сайте SEO программы со скидками

Список лучших SEO и социальных модулей для Drupal

SEO DRUPAL

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

Наиболее распространенные модули Drupal SEO

1. Page Title Module – заголовок страницы можно найти в начале HTML кода внутри тега .Он также используется в поисковой выдаче (SERP) и может значительно повысить ваши сайты в SEO. Это, пожалуй, наиболее малоиспользуемый аспект при создании веб-страницы, как вебмастер не добавляет ценные ключевые слова для тега .

2. Nodewords - Эти SEO модули позволяют добавлять мета-теги для Drupal страниц, как вручную, так и автоматически в зависимости от различных параметров.Обратите внимание на мета-теги, такие как ключевые слова, описание и канонические URL, они могут помочь получить лучшее позиционирование в поисковой системе.

3. Nodewords Page Title – Этот модуль позволяет использовать возможности Nodewords в пользовательских страницах для установки заголовка страницы с использованием подстановочных путей и глобальных маркеров (Тoken).Отлично подходит для труднообрабатываемых названий страниц в модулях Views, Panels, и других не-узловых (non-node) путях.Этот модуль сочетает лучшие черты Nodewords и page_title модулей.

4. Related Content – это отличный SEO модуль позволяет разработчикам сайта легко выбрать для каждого узла основу, которая определит – какие узлы должны быть показаны вместе с этим узлом.Узлы, которые доступны для выбора имеют один или несколько видов, предоставляемых Views модулем.Как узлы отображаются настраивается, а также темизируется.Модуль также обеспечивает небольшой, но мощный API для продвинутых пользователей.

5. Pathauto - модуль Pathauto автоматически генерирует псевдонимы путей (дружественные поисковой системе URL) для различных видов контента (узлов, категорий, пользователей), не требуя от пользователя вручную указывать путь псевдонима.Это позволяет получить псевдонимы вроде /category/my-node-title.html вместо / node/123.Псевдонимы основаны на “паттернах” системы, которые Администратор может контролировать.

6. Sitemap - Этот модуль предоставляет карту сайта, которая дает посетителям краткий обзор вашего сайта.Он также может отображать RSS-каналы для всех блогов и категорий.Drupal генерирует RSS-каналы автоматически, но немногие, кажется, знают, что такое существует. Карта может показывать следующие пункты: сообщение, которое будет отображаться вверху карты, последние блоги, любые книги, любые меню, которые будут показываться полностью развернутыми, любые категории, т.е. словари, со всеми развернуыми терминами.При желании с количеством узлов и RSS-каналами.

7. Path Redirect – Этот модуль позволяет вам указать перенаправление с одного пути на другой путь или внешний URL, используя любой статус HTTP перенаправления .Это перенаправление модуля является большим для переадресации 301, 302 (временного перенаправления), и несколько других типов перенаправления, когда вы, возможно, потребуется удалить или переместить страницы вашего сайта Drupal.

8. Google Analytics Module – Добавляет веб-статистику Google Аналитикс систему слежения на ваш сайт.Этот модуль позволяет добавлять богатые возможности статистики Google на ваш сайт Drupal.

9. XML Sitemap – карты сайта Модуль XML создает карту сайта, что соответствует sitemaps.org спецификации .Это помогает поисковым системам более грамотно сканировать веб-сайт и хранить свои результаты в актуальном состоянии.Карта сайта созданная этим модулем может быть автоматически передана Ask, Google, Bing (ранее Windows Live Search) и Yahoo! поисковым системам.Модуль также поставляется с несколькими подмодулями, которые могут добавить карте сайта ссылки на содержание, пункты меню, термины таксономии, и профили пользователей.

Другие полезные модули Drupal SEO

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

1. Content Optimizer – Этот модуль позволяет быстро проанализировать сайт на предмет SEO, обеспечить мгновенный анализ контента на сайте, как краткое и доступное руководство для обеспечения лучших SEO методов и последовательности действий.Анализ показывает актуальную статистику контента и рекомендации для того, чтобы улучшить ранжирование поисковой системы.

2. Glossify Internal Links Auto SEO – Что он делает для SEO?Этот модуль автоматически генерирует внутренние ссылки узла (ноды) и на каждом узле базу внешних ссылок (перекрёстные ссылки) – идеально подходит для SEO оптимизации страниц вашего сайта и страниц партнеров.В настоящее время модуль основан на узле (ноде) и ищет названия узла (ноды) в теле узла и делает ссылками. В общем, поставьте и поймете. Есть планы распространить его действие на термины таксономии тоже.

3. Scribe SEO – Scribe SEO является программным обеспечением поисковой оптимизации для Drupal и других платформ CMS – представьте себе этот модуль как помощника оптимизации контента, который анализирует веб-страницы, сообщения в блогах, и интернет-пресс-релизы по одному нажатию кнопки.Затем Scribe SEO говорит веб-мастерам, как настроить их контент, чтобы получить больше трафика с поисковых систем, при сохранении качества содержания текстов для читателя.

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

5. QA Checklist – Этот модуль дает перечень лучших методов для гарантии качества сайта на Drupal.Он предоставляет список, который поможет вам отслеживать, какие задачи необходимо сделать.Во-первых, вы увидите, какие модули вы уже установили.Тогда все что вам нужно сделать, это пролистать вниз списка не отмеченных элементов и отметить их.

6. SEO Friend – SEO Friend показывает обзор всех имеющихся отчетов и список SEO-связанных модулей Drupal и, если они были установлены и включены, например, Meta Tags (узлов), Meta Тагс (путь), Page Title отчет, и Referrer Report – показывает резюме ссылающихся на Ваш сайт.

7. Related Block – Это поиск узлов, которые тесно связаны с названием и содержанием текущего узла.Блок показывается только на конкретных типах узлов.Слова в заголовке имееют более сильный приоритет, чем те, что в содержании.Отбираются часто используемые слова (пока только для английского языка), и игнорирует слова до 3-х символов.

8. Similar by Terms - Этот Drupal модуль обеспечивает контекстную связь для элементов контента, показывая блок со ссылками на другие, похожие по содержанию статьи.Сходство на основе терминов таксономии привязанных к содержимому.Блоки доступны по сходству в рамках каждого из определенных словарей на сайте, а также, имеется блок для сходства во всех словарях.

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

Новая бесплатная тема для Drupal

Поздравляю товарищи!

Пятничный подарок Готовая новая тема для Drupal! Называется “Silver“. В скором времени она появится на drupal.org, а у вас есть возможность попробовать первыми




Дизайн строгий, классический.
Посмотреть пример: Посмотреть
Скачать можно с этого топика или здесь

Вопросы можно отправлять на: itnextos сабака gmail.com
Отзывы и предложения приветствуются!

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

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

Новая бесплатная тема для Drupal

Поздравляю товарищи!

Пятничный подарок Готовая новая тема для Drupal! Называется “Silver“. В скором времени она появится на drupal.org, а у вас есть возможность попробовать первыми




Дизайн строгий, классический.
Посмотреть пример: Посмотреть
Скачать можно с этого топика или здесь

Вопросы можно отправлять на: itnextos сабака gmail.com
Отзывы и предложения приветствуются!

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

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

drupal + mysql – самые “дорогие” модули

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

Напишу сюда результат анализа лога mysql за примерно пол-месяца работы сайта на друпале.
О том, как нехорошо кешировать данные в mysql, я уже писал. Там рассматривалась работа CacheRouter при выборе хранилища в БД – то есть стандартное кеширование друпала.
Теперь был проведен анализ после перевода кеша в memcache.

Вот некоторая статистика:
#memcached-tool localhost stats
bytes_read 1593512968640 = 1.5 Терабайта
bytes_written 5899978353864 = почти 6 Терабайт

mysql: Трафик ø в час Принято 81 ГБ 217 МБ Отправлено 464 ГБ 1,234 МБ Всего 545 ГБ 1,451 МБ Анализ бинарного лога

Вот список запросов, которые изменяют информацию:

1. CAPTCHA – стоит графическая, при вводе комментариев: 36% запросов

Модуль: CAPTCHA
Число запросов: 696.77k (12.12%)
Запрос: UPDATE captcha_sessions SET token='S' WHERE csid=N

Модуль: CAPTCHA
Число запросов: 696.11k (12.11%)
Запрос: UPDATE captcha_sessions SET timestamp=N, solution='S' WHERE csid=N

Модуль: CAPTCHA
Число запросов: 695.75k (12.10%)
Запрос: INSERT INTO captcha_sessions (uid, sid, ip_address, timestamp, form_id, solution, STATUS, attempts) VALUES (N, 'S', 'S', N, 'S', 'S', N, N)

2. Стандартный модуль статистики, считает количество посещений ноды: 28% запросов
Модуль: Statistics
Число запросов: 1.60M (27.84%)
Запрос: UPDATE node_counter SET daycount = daycount + 1, totalcount = totalcount + 1, timestamp = N WHERE nid = N

3. Ядро (сессии) – записывает и обновляет сессии: 18% запросов
Модуль: Core
Число запросов: 835.58k (14.53%)
Запрос: UPDATE sessions SET uid = N, cache = N, hostname = 'S', session = 'S', timestamp = N WHERE sid = 'S'

Модуль: Core
Число запросов: 213.20k (3.71%)
Запрос: INSERT INTO sessions (sid, uid, cache, hostname, session, timestamp) VALUES ('S', N, N, 'S', 'S', N)

4. Database logging (core) – записывает события в базу данных: 10% запросов

Модуль: Database logging
Число запросов: 597.70k (10.39%)
Запрос: INSERT INTO watchdog (uid, type, message, VARIABLES, severity, link, location, referer, hostname, timestamp) VALUES (N, 'S', 'S', 'S', N, 'S', 'S', 'S', 'S', N)

Модуль:
Число запросов:
Запрос:  

Итого, 4 модуля делают 36% + 28% + 18% + 10% = 92% !!! запросов на изменение информации

Что может быть предложено:

1. Капча – сейчас она показывается всем, кто смотрит ноду, т.к. стоит модуль ajax_comments и комментарии вместе с формой расположены на той же странице. Т.к. оставляет комментарии намного меньше людей, чем те, кто смотрят ноду, то если форму для комментариев разместить на отдельной странице – нагрузка снизится почти до нуля.
Либо альтернативный вариант помещать ее каким-то образом в кеш – такое возможно?

2. Модуль статистики – вещь полезная, например, для определения популярного контента за сегодня / за все время по числу просмотров. Сейчас ВСЯ таблица node_counter у меня весит 5-6 мегабайт!!! есть ли какой-то способ (модуль), чтобы поместить эту таблицу также в кеш, и, допустим, сбрасывать в mysql по крону? При таком подходе нагрузка также станет 0.

Также было замечено, что daycount имеет некорректное значение – по моему представлению, если я запускаю крон раз в час, то обновление должно происходить например в 00:00, когда вызывается крон – там же реализовано обновление через переменную, это неправильно, поскольку вначале переменная не установлена в 00:00, а потом, т.к. крон запускается в одно и то же время, statistics_day_timestamp может “убежать” на 1 сек, и следующий запрос уже будет выполнен в 01:00

<?phpstatistics.module , строка 179
function statistics_cron() {
  $statistics_timestamp = variable_get('statistics_day_timestamp', '');

  if ((time() - $statistics_timestamp) >= 86400) {
    // Reset day counts.
    db_query('UPDATE {node_counter} SET daycount = 0');
    variable_set('statistics_day_timestamp', time());
  }
}
?>

3. Сессии – я уменьшил время сессии в default.settings.php с 23 дней до 5 дней, сейчас размер этой таблицы 10-15 мегабайт. Хотелось бы также ее в кеш.

4. Лог – как изменится производительность системы, если весь лог отправлять в syslog? По идее, любая серверная программа отправляет в syslog – web сервер, mysql, почта и т.д. и тормозами от этого не страдает – думаю, надо настроить src и destination для друпала, пусть складывается все туда.

Итого: при выполнении этих действий нагрузка на сервер mysql по части изменений (update, insert) снизится более, чем в 10 раз!!!

Анализ медленных (или использующих много строк) запросов

Также был проанализирован slow_query.log на предмет отлавливания нехороших запросов.
Предпосылкой к этому стали следующие данные:

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

Handler_read_rnd 150 M

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

Handler_read_rnd_next 1,976 M

Количество временных таблиц, автоматически созданных сервером на диске, во время выполнения SQL-выражений. Если значение Created_tmp_disk_tables велико, следует увеличить значение переменной tmp_table_size, чтобы временные таблицы располагались в памяти, а не на жестком диске.

Created_tmp_disk_tables 2,458 k

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

Select_full_join 8,620

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

Sort_merge_passes 502

А также

Количество запросов, добавленных в кеш запросов.

Qcache_inserts 33 M

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

Qcache_lowmem_prunes 20 M

Очевидно, что делается скан таблиц с большим количеством строк

Вот анализ:

1. views – материал: новость, опубликован, рубрика = 10, 3 последних

Количество запросов: 14199 (3 последних) + 1485 (10 последних) + 268 (4 последних) + 153 (20 последних – таксономия)
Общее время: 16760 + 1906 + 227 + 185 = 19078 секунд, в среднем: 1.18 / 1.28 / 0.84 / 1.21
Количество строк: 13674 – 126552 /

SET timestamp=1292480648; SELECT node.nid AS nid, node.created AS node_created, node.title AS node_title FROM node node INNER JOIN term_node term_node ON node.vid = term_node.vid WHERE (node.type IN ('news')) AND (node.STATUS <> 0) AND (term_node.tid = 10) ORDER BY node_created DESC LIMIT 0, 3;

2. Облако тегов по словарю, модуль tagadelic

Количество запросов: 1053
Общее время: 936, в среднем: 0.89
Количество строк: 15154 – 15326
Запрос:

SELECT COUNT(*) AS count, td.tid, td.vid, td.name, td.description FROM term_data td INNER JOIN term_node tn ON td.tid = tn.tid INNER JOIN node n ON tn.vid = n.vid WHERE td.vid IN (5) GROUP BY td.tid, td.vid, td.name, td.description HAVING COUNT(*) > 0 ORDER BY count DESC LIMIT 0, 12;

3. xmlsitemap – я так понимаю, это запрос по крону на добавление новых нод в сайтмап – ПОЛНЫЙ СКАН

Количество запросов: 368
Общее время: 436, в среднем: 1.18
Количество строк: 171575 – 172750
Запрос:

SELECT n.nid FROM node n LEFT JOIN xmlsitemap x ON x.type = 'node' AND n.nid = x.id WHERE x.id IS NULL AND n.type IN ('news','reviews') ORDER BY n.nid DESC LIMIT 0, 100;

4. Снова xmlsitemap – выдача “подкарты” сайта – это даже хуже, чем полный скан

Количество запросов: 459
Общее время: 326, в среднем: 0.71
Количество строк: 134500 – 344905
Запрос:

SELECT x.loc, x.lastmod, x.changefreq, x.changecount, x.priority, x.LANGUAGE FROM xmlsitemap x WHERE x.access = 1 AND x.STATUS = 1 ORDER BY x.LANGUAGE, x.loc LIMIT 172500, 500;

5. url_alias – снова xmlsitemap ?

Количество запросов: 388
Общее время: 210, в среднем: 0.54
Количество строк: 171762 – 345745
Запрос:

SELECT src, dst FROM url_alias WHERE LANGUAGE = 'ru' ORDER BY pid;

Остальные запросы не такие затратные, или их мало.

Итого, самый “трудный” запрос является запрос views – материал: новость, опубликован, рубрика = 10, 3 последних – самая большая нагрузка – 19078 секунд – это больше 5 часов из 15 дней полной работы

Следующим запросом идет облако тегов по словарю – 936 секунд, а словарь еще до конца не заполнен.

И последние запросы относятся к xmlsitemap.

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

Самым “болезненным” запросом для моего сайта получается все-таки views, о том, что с ним можно сделать хотел бы услышать Ваши комментарии, с остальным вроде более-менее понятно, с tagadelic и xmlsitemap я пока готов смириться.

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

drupal + mysql – самые “дорогие” модули

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

Напишу сюда результат анализа лога mysql за примерно пол-месяца работы сайта на друпале.
О том, как нехорошо кешировать данные в mysql, я уже писал. Там рассматривалась работа CacheRouter при выборе хранилища в БД – то есть стандартное кеширование друпала.
Теперь был проведен анализ после перевода кеша в memcache.

Вот некоторая статистика:
#memcached-tool localhost stats
bytes_read 1593512968640 = 1.5 Терабайта
bytes_written 5899978353864 = почти 6 Терабайт

mysql: Трафик ø в час Принято 81 ГБ 217 МБ Отправлено 464 ГБ 1,234 МБ Всего 545 ГБ 1,451 МБ Анализ бинарного лога

Вот список запросов, которые изменяют информацию:

1. CAPTCHA – стоит графическая, при вводе комментариев: 36% запросов

Модуль: CAPTCHA
Число запросов: 696.77k (12.12%)
Запрос: UPDATE captcha_sessions SET token='S' WHERE csid=N

Модуль: CAPTCHA
Число запросов: 696.11k (12.11%)
Запрос: UPDATE captcha_sessions SET timestamp=N, solution='S' WHERE csid=N

Модуль: CAPTCHA
Число запросов: 695.75k (12.10%)
Запрос: INSERT INTO captcha_sessions (uid, sid, ip_address, timestamp, form_id, solution, STATUS, attempts) VALUES (N, 'S', 'S', N, 'S', 'S', N, N)

2. Стандартный модуль статистики, считает количество посещений ноды: 28% запросов
Модуль: Statistics
Число запросов: 1.60M (27.84%)
Запрос: UPDATE node_counter SET daycount = daycount + 1, totalcount = totalcount + 1, timestamp = N WHERE nid = N

3. Ядро (сессии) – записывает и обновляет сессии: 18% запросов
Модуль: Core
Число запросов: 835.58k (14.53%)
Запрос: UPDATE sessions SET uid = N, cache = N, hostname = 'S', session = 'S', timestamp = N WHERE sid = 'S'

Модуль: Core
Число запросов: 213.20k (3.71%)
Запрос: INSERT INTO sessions (sid, uid, cache, hostname, session, timestamp) VALUES ('S', N, N, 'S', 'S', N)

4. Database logging (core) – записывает события в базу данных: 10% запросов

Модуль: Database logging
Число запросов: 597.70k (10.39%)
Запрос: INSERT INTO watchdog (uid, type, message, VARIABLES, severity, link, location, referer, hostname, timestamp) VALUES (N, 'S', 'S', 'S', N, 'S', 'S', 'S', 'S', N)

Модуль:
Число запросов:
Запрос:  

Итого, 4 модуля делают 36% + 28% + 18% + 10% = 92% !!! запросов на изменение информации

Что может быть предложено:

1. Капча – сейчас она показывается всем, кто смотрит ноду, т.к. стоит модуль ajax_comments и комментарии вместе с формой расположены на той же странице. Т.к. оставляет комментарии намного меньше людей, чем те, кто смотрят ноду, то если форму для комментариев разместить на отдельной странице – нагрузка снизится почти до нуля.
Либо альтернативный вариант помещать ее каким-то образом в кеш – такое возможно?

2. Модуль статистики – вещь полезная, например, для определения популярного контента за сегодня / за все время по числу просмотров. Сейчас ВСЯ таблица node_counter у меня весит 5-6 мегабайт!!! есть ли какой-то способ (модуль), чтобы поместить эту таблицу также в кеш, и, допустим, сбрасывать в mysql по крону? При таком подходе нагрузка также станет 0.

Также было замечено, что daycount имеет некорректное значение – по моему представлению, если я запускаю крон раз в час, то обновление должно происходить например в 00:00, когда вызывается крон – там же реализовано обновление через переменную, это неправильно, поскольку вначале переменная не установлена в 00:00, а потом, т.к. крон запускается в одно и то же время, statistics_day_timestamp может “убежать” на 1 сек, и следующий запрос уже будет выполнен в 01:00

<?phpstatistics.module , строка 179
function statistics_cron() {
  $statistics_timestamp = variable_get('statistics_day_timestamp', '');

  if ((time() - $statistics_timestamp) >= 86400) {
    // Reset day counts.
    db_query('UPDATE {node_counter} SET daycount = 0');
    variable_set('statistics_day_timestamp', time());
  }
}
?>

3. Сессии – я уменьшил время сессии в default.settings.php с 23 дней до 5 дней, сейчас размер этой таблицы 10-15 мегабайт. Хотелось бы также ее в кеш.

4. Лог – как изменится производительность системы, если весь лог отправлять в syslog? По идее, любая серверная программа отправляет в syslog – web сервер, mysql, почта и т.д. и тормозами от этого не страдает – думаю, надо настроить src и destination для друпала, пусть складывается все туда.

Итого: при выполнении этих действий нагрузка на сервер mysql по части изменений (update, insert) снизится более, чем в 10 раз!!!

Анализ медленных (или использующих много строк) запросов

Также был проанализирован slow_query.log на предмет отлавливания нехороших запросов.
Предпосылкой к этому стали следующие данные:

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

Handler_read_rnd 150 M

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

Handler_read_rnd_next 1,976 M

Количество временных таблиц, автоматически созданных сервером на диске, во время выполнения SQL-выражений. Если значение Created_tmp_disk_tables велико, следует увеличить значение переменной tmp_table_size, чтобы временные таблицы располагались в памяти, а не на жестком диске.

Created_tmp_disk_tables 2,458 k

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

Select_full_join 8,620

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

Sort_merge_passes 502

А также

Количество запросов, добавленных в кеш запросов.

Qcache_inserts 33 M

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

Qcache_lowmem_prunes 20 M

Очевидно, что делается скан таблиц с большим количеством строк

Вот анализ:

1. views – материал: новость, опубликован, рубрика = 10, 3 последних

Количество запросов: 14199 (3 последних) + 1485 (10 последних) + 268 (4 последних) + 153 (20 последних – таксономия)
Общее время: 16760 + 1906 + 227 + 185 = 19078 секунд, в среднем: 1.18 / 1.28 / 0.84 / 1.21
Количество строк: 13674 – 126552 /

SET timestamp=1292480648; SELECT node.nid AS nid, node.created AS node_created, node.title AS node_title FROM node node INNER JOIN term_node term_node ON node.vid = term_node.vid WHERE (node.type IN ('news')) AND (node.STATUS <> 0) AND (term_node.tid = 10) ORDER BY node_created DESC LIMIT 0, 3;

2. Облако тегов по словарю, модуль tagadelic

Количество запросов: 1053
Общее время: 936, в среднем: 0.89
Количество строк: 15154 – 15326
Запрос:

SELECT COUNT(*) AS count, td.tid, td.vid, td.name, td.description FROM term_data td INNER JOIN term_node tn ON td.tid = tn.tid INNER JOIN node n ON tn.vid = n.vid WHERE td.vid IN (5) GROUP BY td.tid, td.vid, td.name, td.description HAVING COUNT(*) > 0 ORDER BY count DESC LIMIT 0, 12;

3. xmlsitemap – я так понимаю, это запрос по крону на добавление новых нод в сайтмап – ПОЛНЫЙ СКАН

Количество запросов: 368
Общее время: 436, в среднем: 1.18
Количество строк: 171575 – 172750
Запрос:

SELECT n.nid FROM node n LEFT JOIN xmlsitemap x ON x.type = 'node' AND n.nid = x.id WHERE x.id IS NULL AND n.type IN ('news','reviews') ORDER BY n.nid DESC LIMIT 0, 100;

4. Снова xmlsitemap – выдача “подкарты” сайта – это даже хуже, чем полный скан

Количество запросов: 459
Общее время: 326, в среднем: 0.71
Количество строк: 134500 – 344905
Запрос:

SELECT x.loc, x.lastmod, x.changefreq, x.changecount, x.priority, x.LANGUAGE FROM xmlsitemap x WHERE x.access = 1 AND x.STATUS = 1 ORDER BY x.LANGUAGE, x.loc LIMIT 172500, 500;

5. url_alias – снова xmlsitemap ?

Количество запросов: 388
Общее время: 210, в среднем: 0.54
Количество строк: 171762 – 345745
Запрос:

SELECT src, dst FROM url_alias WHERE LANGUAGE = 'ru' ORDER BY pid;

Остальные запросы не такие затратные, или их мало.

Итого, самый “трудный” запрос является запрос views – материал: новость, опубликован, рубрика = 10, 3 последних – самая большая нагрузка – 19078 секунд – это больше 5 часов из 15 дней полной работы

Следующим запросом идет облако тегов по словарю – 936 секунд, а словарь еще до конца не заполнен.

И последние запросы относятся к xmlsitemap.

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

Самым “болезненным” запросом для моего сайта получается все-таки views, о том, что с ним можно сделать хотел бы услышать Ваши комментарии, с остальным вроде более-менее понятно, с tagadelic и xmlsitemap я пока готов смириться.

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

Drupal 7.0 RC 2 Released

Сторонников Drupal радуют под новый год близким выходом релиза версии 7, а пока-что стал доступен релиз-кандидат под номером 2.
Напоминаю, что две недели назад вышел релиз-кандидат под номером 1, в котором были закрыты все критичные баги. В этот раз нас радуют исправлением выявленных недостатков и улучшениями, в том числе в темизации. Полный список изменений опубликован тут

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

Drupal 7.0 RC 2 Released

Сторонников Drupal радуют под новый год близким выходом релиза версии 7, а пока-что стал доступен релиз-кандидат под номером 2.
Напоминаю, что две недели назад вышел релиз-кандидат под номером 1, в котором были закрыты все критичные баги. В этот раз нас радуют исправлением выявленных недостатков и улучшениями, в том числе в темизации. Полный список изменений опубликован тут

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

Курим систему меню Drupal

Рассмотрим кусок меню на обычном сайте.

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

Неправильное решение

Можно попытаться присвоить пункту Компания тот же самый адрес node/45. Пользователь делает клик на Компания .. И тут мы обнаруживаем интересную особенность Друпала. Из двух пунктов меню с одинаковыми адресами активным (class=”active”) Друпал сделает только один – первый по списку. Кроме того, если вы играетесь с модулем Custom Breadcrumbs – вы получите неверные хлебные крошки.
Дальше у нас есть выбор – сдаться и сделать для пункта меню Компания отдельную нормальную страницу. Либо включить хитрость и сделать страницу-редиректор которая бы перекидывала пользователя с Компания на О компании.

Как не надо делать

Начитавшись Drupal API у вас может возникнуть “гениальная” идея. Создаем новый тип материала, например, fake_page, делаем новую ноду этого типа и в ней пишем


<?php
  drupal_goto('node/45');
?>

Плюсов у этого решения нет, одни недостатки:

Внезапно отваливается индексация поиска. И вообще весь крон. В watchdog вы увидите сообщение “Cron run exceeded the time limit and was aborted.”, хотя сам крон отрабатывается мгновенно. Через некоторое время (большое? вы обнаружите, что крон умирает именно в модуле search. И именно на ноде-редиректоре. Человек, пришедший после вас, при попытка посмотреть содержимое fake_page будет попадать в другое место и долго удивляться что за фигня. Правильное решение

Существует прекрасный модуль Path redirect, который в явном виде позволяет задать переадресацию с одного адреса на другой. А с помощью расово верного патча он позволяет делать переадресацию с уже существующего пути в любое другое место. Почему с уже существующего? Потому что Друпал не позволит создать пункт меню Компания с пустым адресом.
Теперь о том, где взять “уже существующий путь”. По прежнему мы можем создавать пустые ноды типа fake_page, делать им красивые алиасы и адреса этих нод указывать в качестве путей для меню. Но мне этот подход не нравится тем, что эти пустые ноды будут болтаться в списке контента.
Другой подход – следуя модному в стране тренду, сделать наномодуль . Который только тем и будет заниматься, что объявлять нужный нам адрес существующим. Далее пример такого модуля:

nanofake.info

name = Nanofake description = Emulates fake addresses core = 6.x

nanofake.module

<?php   function nanofake_menu() { $items['fake1'] = array( 'page callback' => 'nanofake_none', 'access arguments' => array('access content'), 'type' => MENU_CALLBACK, );   return $items; }   function nanofake_none() { return ''; }

Теперь для пункта меню мы можем указать fake1 в качестве path, а в path redirector сделать перенаправление с fake1 на node/45.
Все это конечно только мой опыт (вполне возможно это все велосипед) и если у кого-то есть опыт более позитивный – прошу в комментарии.

Прикрепленный файл Размер illustrate-1.png 6.44 кб nanofake.zip 592 байта

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

Курим систему меню Drupal

Рассмотрим кусок меню на обычном сайте.

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

Неправильное решение

Можно попытаться присвоить пункту Компания тот же самый адрес node/45. Пользователь делает клик на Компания .. И тут мы обнаруживаем интересную особенность Друпала. Из двух пунктов меню с одинаковыми адресами активным (class=”active”) Друпал сделает только один – первый по списку. Кроме того, если вы играетесь с модулем Custom Breadcrumbs – вы получите неверные хлебные крошки.
Дальше у нас есть выбор – сдаться и сделать для пункта меню Компания отдельную нормальную страницу. Либо включить хитрость и сделать страницу-редиректор которая бы перекидывала пользователя с Компания на О компании.

Как не надо делать

Начитавшись Drupal API у вас может возникнуть “гениальная” идея. Создаем новый тип материала, например, fake_page, делаем новую ноду этого типа и в ней пишем


<?php
  drupal_goto('node/45');
?>

Плюсов у этого решения нет, одни недостатки:

Внезапно отваливается индексация поиска. И вообще весь крон. В watchdog вы увидите сообщение “Cron run exceeded the time limit and was aborted.”, хотя сам крон отрабатывается мгновенно. Через некоторое время (большое? вы обнаружите, что крон умирает именно в модуле search. И именно на ноде-редиректоре. Человек, пришедший после вас, при попытка посмотреть содержимое fake_page будет попадать в другое место и долго удивляться что за фигня. Правильное решение

Существует прекрасный модуль Path redirect, который в явном виде позволяет задать переадресацию с одного адреса на другой. А с помощью расово верного патча он позволяет делать переадресацию с уже существующего пути в любое другое место. Почему с уже существующего? Потому что Друпал не позволит создать пункт меню Компания с пустым адресом.
Теперь о том, где взять “уже существующий путь”. По прежнему мы можем создавать пустые ноды типа fake_page, делать им красивые алиасы и адреса этих нод указывать в качестве путей для меню. Но мне этот подход не нравится тем, что эти пустые ноды будут болтаться в списке контента.
Другой подход – следуя модному в стране тренду, сделать наномодуль . Который только тем и будет заниматься, что объявлять нужный нам адрес существующим. Далее пример такого модуля:

nanofake.info

name = Nanofake description = Emulates fake addresses core = 6.x

nanofake.module

<?php   function nanofake_menu() { $items['fake1'] = array( 'page callback' => 'nanofake_none', 'access arguments' => array('access content'), 'type' => MENU_CALLBACK, );   return $items; }   function nanofake_none() { return ''; }

Теперь для пункта меню мы можем указать fake1 в качестве path, а в path redirector сделать перенаправление с fake1 на node/45.
Все это конечно только мой опыт (вполне возможно это все велосипед) и если у кого-то есть опыт более позитивный – прошу в комментарии.

Прикрепленный файл Размер illustrate-1.png 6.44 кб nanofake.zip 592 байта

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

Модуль 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

Новое чтиво по Drupal

книга для тех, кто еще не набил шишек на Drupal 7. В основном обзор тем людям, кто знакомится с новой версией.

http://www.wowebook.com/open-source/foundation-drupal-7.html

более “вкусная”, на мой взгляд, книга, как раз то, о чем идет много споров: Views или не views. Хоть выпуск и февраль 2010г., но на глаза попалась только сейчас, а шарить в views для серьезного разработчика на Drupal, думаю объяснений не нужно.

PS К ярым противникам views это не относится))

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

Новое чтиво по Drupal

книга для тех, кто еще не набил шишек на Drupal 7. В основном обзор тем людям, кто знакомится с новой версией.

http://www.wowebook.com/open-source/foundation-drupal-7.html

более “вкусная”, на мой взгляд, книга, как раз то, о чем идет много споров: Views или не views. Хоть выпуск и февраль 2010г., но на глаза попалась только сейчас, а шарить в views для серьезного разработчика на Drupal, думаю объяснений не нужно.

PS К ярым противникам views это не относится))

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

Перевод друпала (Новичкам и не только)

В связи с последними событиями и шумихой вокруг локализации – http://www.drupal.ru/node/52937

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

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

Возможно кому-то поможет переводить отдельные строки или фразы, а возможно и делать полноценные переводы, или редактировать и утверждать уже сделанные переводы (на данный момент – десятки тысяч строк не утверждённого перевода).

Что нужно, чтобы сделать перевод?

Немного логики, изучение терминологии друпала, терпения, “дофига” терпения и очень “дофига” терпения ) Так же не помешает использовать переводчик, например – http://translate.google.com/#

Ну и конечно – немного смелости Не бойтесь, вас никто не укусит, во всяком случае много раз

Что нужно, чтобы редактировать перевод?

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

Есть три варианта, как делать или редактировать перевод:

Первый – переводить в .PO файле. PO файл – это специальный формат файла для переводов. Для перевода вам надо с сервера локализации скачать файл, для перевода модуля – http://drupaler.ru/translate/languages/ru/export

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

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

Минусы – Чтобы увидеть результат перевода, надо его закачать на сайт и чтобы готовый перевод импортировать на сервер локализации, надо его вручную там добавить. Минусы небольшие (тратится на них 2 минуты), но минусы

Второй – Использовать l10n_client. Данный вариант пока не доступен на drupaler.ru, но в ближайшее время планируют обновлять сервер и наверняка будет внедрена эта возможность.

Плюсы – Сразу видим исходную строку и перевод (если есть), если нет, то можем переводить и тут же увидим результат на сайте и кроме того, можем отсылать сразу новый перевод на сервер локализации.

Минусы – Делаем перевод отдельных строк, а не целого модуля, соответственно, за бортом остаётся много НЕ переведённого содержания.

Третий – переводить или редактировать на сервере локализации.
Перевод – http://drupaler.ru/translate/languages/ru/edit
Редактирование – http://drupaler.ru/translate/languages/ru/moderate

Плюсы – сразу видим исходную строку и перевод (если есть), а так же предлагаемые другие варианты. Можно посмотреть в каких модулях используется строка.

Минусы – Не видим в каком именно месте выводится строка на сайте и соответственно можно неправильно просклонять предложение, что будет смотреться коряво. Так же не видим сразу все строки для модуля (надо листать страницы).

Какой вариант выбрать новичку? Наверно третий, но думаю вы сами можете определиться, что вам лучше

Рассмотрим несколько примеров.

Например, возьмём одну из первых исходных строк модуля Blog: “Post new blog entry.”
Переводчик нам выдаёт: “Начать новую запись в блоге.”

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

Рассмотрим пример немного сложнее.

Исходное – “@name’s blog”
В даном случае нам не нужен переводчик, так как и так всё понятно. blog – это блог, @name’s – это переменная выводящая имя пользователя. То есть в переводе мы получаем, например – Блог Axel’s

Вроде неплохо, но возникает вопрос – разве axel блог? Нет, он человек Поэтому уточняем, подставляя слово пользователь. Получаем – Блог пользователя axel’s. Уже лучше, но зачем нам буква S в конце? Понятно, что в английском идёт окончание, но у нас (в русском языке) невозможно закончить одной буквой. Поэтому убираем ‘S и заодно, отделим с помощью тире – имя пользователя от текста, чтобы не сливалось в единое и был отделён английский (чаще всего) от русского.

В конечном итоге получаем – “Блог пользователя – @name”
Выглядеть будет так: Блог пользователя – Axel

Таким образом мы не только сделали перевод, но и локализовали его.

Примечание: Локализация – процесс адаптации к культуре и языку какой-либо страны.

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

Ещё один пример.

В 7-ой версии друпала в модуле blog появились такие выражения – “Single-user blogs” и “Multi-user blogs”

В переводе – однопользовательские блоги и многопользовательские блоги.

Термины явно взяты из игр Звучит с одной стороны неплохо, но много букв и не совсем понятно, например – Что такое многопользовательский блог? Блог у которого много пользователей или что вообще подразумевается под этим словом?

В данном случае надо разобраться – где на сайте выводится это предложение, что означает и можно ли его сформулировать по другому?

Показывается оно в справке с объяснением работы модуля. Значит смотрим тот текст и от него пробуем отолкнуться в своём переводе.

Исходное – “Each user’s blog entries are automatically displayed with a link to the user’s main blog page. You can create as many single-user blogs as you have site users with permission to create blog content.”

и второе – “Blog entries from each single-user blog are also aggregated into one central multi-user blog, which displays the blog content of all users in a single listing.”

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

А приведу пример к какому варианту пришёл:

Single-user blogs – Персональные блоги
Multi-user blogs – Мультиблоговый сервис

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

Пояснение: В данном случае есть нюанс (новички могут не знать), что в плане блогов, есть некое подобие “войны” между drupal и wordpress. И применение термина – мультиблоговый сервис – связано в некоторой степени с этим. Кто не в курсе, друпал пытается догнать вордпресс в качестве удобства блогов.

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

Проверка перевода

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

Как проверить?

Закачайте перевод к себе на сайт. Это будет первая проверка, на то, везде ли стоят кавычки (”")
Если в какой-та строке вы забыли указать кавычки, то перевод не загрузится у вас на сайт и покажет в какой строке находится ошибка. Дальше посмотрите как он выглядет на сайте, как читается и нет ли ошибок.

После этого смело импортируйте перевод на сервер локализации.

Дополнительно:

Прочитайте правила перевода – http://drupaler.ru/forum/109

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

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

Перевод друпала (Новичкам и не только)

В связи с последними событиями и шумихой вокруг локализации – http://www.drupal.ru/node/52937

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

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

Возможно кому-то поможет переводить отдельные строки или фразы, а возможно и делать полноценные переводы, или редактировать и утверждать уже сделанные переводы (на данный момент – десятки тысяч строк не утверждённого перевода).

Что нужно, чтобы сделать перевод?

Немного логики, изучение терминологии друпала, терпения, “дофига” терпения и очень “дофига” терпения ) Так же не помешает использовать переводчик, например – http://translate.google.com/#

Ну и конечно – немного смелости Не бойтесь, вас никто не укусит, во всяком случае много раз

Что нужно, чтобы редактировать перевод?

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

Есть три варианта, как делать или редактировать перевод:

Первый – переводить в .PO файле. PO файл – это специальный формат файла для переводов. Для перевода вам надо с сервера локализации скачать файл, для перевода модуля – http://drupaler.ru/translate/languages/ru/export

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

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

Минусы – Чтобы увидеть результат перевода, надо его закачать на сайт и чтобы готовый перевод импортировать на сервер локализации, надо его вручную там добавить. Минусы небольшие (тратится на них 2 минуты), но минусы

Второй – Использовать l10n_client. Данный вариант пока не доступен на drupaler.ru, но в ближайшее время планируют обновлять сервер и наверняка будет внедрена эта возможность.

Плюсы – Сразу видим исходную строку и перевод (если есть), если нет, то можем переводить и тут же увидим результат на сайте и кроме того, можем отсылать сразу новый перевод на сервер локализации.

Минусы – Делаем перевод отдельных строк, а не целого модуля, соответственно, за бортом остаётся много НЕ переведённого содержания.

Третий – переводить или редактировать на сервере локализации.
Перевод – http://drupaler.ru/translate/languages/ru/edit
Редактирование – http://drupaler.ru/translate/languages/ru/moderate

Плюсы – сразу видим исходную строку и перевод (если есть), а так же предлагаемые другие варианты. Можно посмотреть в каких модулях используется строка.

Минусы – Не видим в каком именно месте выводится строка на сайте и соответственно можно неправильно просклонять предложение, что будет смотреться коряво. Так же не видим сразу все строки для модуля (надо листать страницы).

Какой вариант выбрать новичку? Наверно третий, но думаю вы сами можете определиться, что вам лучше

Рассмотрим несколько примеров.

Например, возьмём одну из первых исходных строк модуля Blog: “Post new blog entry.”
Переводчик нам выдаёт: “Начать новую запись в блоге.”

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

Рассмотрим пример немного сложнее.

Исходное – “@name’s blog”
В даном случае нам не нужен переводчик, так как и так всё понятно. blog – это блог, @name’s – это переменная выводящая имя пользователя. То есть в переводе мы получаем, например – Блог Axel’s

Вроде неплохо, но возникает вопрос – разве axel блог? Нет, он человек Поэтому уточняем, подставляя слово пользователь. Получаем – Блог пользователя axel’s. Уже лучше, но зачем нам буква S в конце? Понятно, что в английском идёт окончание, но у нас (в русском языке) невозможно закончить одной буквой. Поэтому убираем ‘S и заодно, отделим с помощью тире – имя пользователя от текста, чтобы не сливалось в единое и был отделён английский (чаще всего) от русского.

В конечном итоге получаем – “Блог пользователя – @name”
Выглядеть будет так: Блог пользователя – Axel

Таким образом мы не только сделали перевод, но и локализовали его.

Примечание: Локализация – процесс адаптации к культуре и языку какой-либо страны.

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

Ещё один пример.

В 7-ой версии друпала в модуле blog появились такие выражения – “Single-user blogs” и “Multi-user blogs”

В переводе – однопользовательские блоги и многопользовательские блоги.

Термины явно взяты из игр Звучит с одной стороны неплохо, но много букв и не совсем понятно, например – Что такое многопользовательский блог? Блог у которого много пользователей или что вообще подразумевается под этим словом?

В данном случае надо разобраться – где на сайте выводится это предложение, что означает и можно ли его сформулировать по другому?

Показывается оно в справке с объяснением работы модуля. Значит смотрим тот текст и от него пробуем отолкнуться в своём переводе.

Исходное – “Each user’s blog entries are automatically displayed with a link to the user’s main blog page. You can create as many single-user blogs as you have site users with permission to create blog content.”

и второе – “Blog entries from each single-user blog are also aggregated into one central multi-user blog, which displays the blog content of all users in a single listing.”

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

А приведу пример к какому варианту пришёл:

Single-user blogs – Персональные блоги
Multi-user blogs – Мультиблоговый сервис

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

Пояснение: В данном случае есть нюанс (новички могут не знать), что в плане блогов, есть некое подобие “войны” между drupal и wordpress. И применение термина – мультиблоговый сервис – связано в некоторой степени с этим. Кто не в курсе, друпал пытается догнать вордпресс в качестве удобства блогов.

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

Проверка перевода

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

Как проверить?

Закачайте перевод к себе на сайт. Это будет первая проверка, на то, везде ли стоят кавычки (”")
Если в какой-та строке вы забыли указать кавычки, то перевод не загрузится у вас на сайт и покажет в какой строке находится ошибка. Дальше посмотрите как он выглядет на сайте, как читается и нет ли ошибок.

После этого смело импортируйте перевод на сервер локализации.

Дополнительно:

Прочитайте правила перевода – http://drupaler.ru/forum/109

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

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

Ajax_comments и форма комментариев выше комментариев

Есть замечательный модуль Ajax_comments от neochief, который позволяет открывать форму комментария непосредственно под комментарием (посредством AJAX). И есть статья этого-же (кстати многоуважаемого лично мной) автора про перенос формы ввода комментария непосредственно под сам пост, перед списком остальных сообщений – Модуль «Форма комментариев поверх комментов» и даже есть модуль который все это реализует – Comment form above comments. Но есть один нюанс – не дружат эти модули между собой (по крайней мере у меня не получилось их подружить напрямую).
Просматривая исходные коды данных модулей в надежде их все таки подружить, я заметил что в принципе метод предложенный neochief, а именно подменой темы на некотором этапе рендеринга, на свою не единственный (опять же гибкость Drupal в этом плане меня поражает).

Поэтому хочу предложить свой метод, основанный на хуке hook_menu_alter, ведь в принципе ни кто нам не запрещает полностью переопределить вывод ноды подменив стандартный коллбэк «node/%node».

Статья достаточно объемная, с исходными кодами поэтому кому интересно можно посмотреть здесь
Ajax_comments и форма комментариев выше комментариев, там же находиться и архив с модулем.

Основная идея данного модуля, подменить стандартный вывод через node_page_view своим, и в нем проверить как настроен вывод комментария у данного типа ноды, если это стандартный вывод COMMENT_FORM_SEPARATE_PAGE или COMMENT_FORM_BELOW то вызываем стандартный node_show, если же наш новый тип вывода COMMENT_FORM_ABOVE, то вызовем свой обработчик acomment_node_show.
В принципе ничего интересного в самом коде нет, все функции дублируют аналогичные функции из стандартных модулей node и comment, единственное отличие функции
acomment_comment_render от comment_render из модуля comment – это замена строки
<?php$output .= comment_form_box(array('nid' => $nid), t('Post new comment'));?>
на
<?php$output = comment_form_box(array('nid' => $nid), t('Post new comment')) . $output;?>
где мы собственно и переносим форму ввода комментария, сразу после ноды.

Пример реализации в ветке форума моего нового проекта Loros Studio

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

Ajax_comments и форма комментариев выше комментариев

Есть замечательный модуль Ajax_comments от neochief, который позволяет открывать форму комментария непосредственно под комментарием (посредством AJAX). И есть статья этого-же (кстати многоуважаемого лично мной) автора про перенос формы ввода комментария непосредственно под сам пост, перед списком остальных сообщений – Модуль «Форма комментариев поверх комментов» и даже есть модуль который все это реализует – Comment form above comments. Но есть один нюанс – не дружат эти модули между собой (по крайней мере у меня не получилось их подружить напрямую).
Просматривая исходные коды данных модулей в надежде их все таки подружить, я заметил что в принципе метод предложенный neochief, а именно подменой темы на некотором этапе рендеринга, на свою не единственный (опять же гибкость Drupal в этом плане меня поражает).

Поэтому хочу предложить свой метод, основанный на хуке hook_menu_alter, ведь в принципе ни кто нам не запрещает полностью переопределить вывод ноды подменив стандартный коллбэк «node/%node».

Статья достаточно объемная, с исходными кодами поэтому кому интересно можно посмотреть здесь
Ajax_comments и форма комментариев выше комментариев, там же находиться и архив с модулем.

Основная идея данного модуля, подменить стандартный вывод через node_page_view своим, и в нем проверить как настроен вывод комментария у данного типа ноды, если это стандартный вывод COMMENT_FORM_SEPARATE_PAGE или COMMENT_FORM_BELOW то вызываем стандартный node_show, если же наш новый тип вывода COMMENT_FORM_ABOVE, то вызовем свой обработчик acomment_node_show.
В принципе ничего интересного в самом коде нет, все функции дублируют аналогичные функции из стандартных модулей node и comment, единственное отличие функции
acomment_comment_render от comment_render из модуля comment – это замена строки
<?php$output .= comment_form_box(array('nid' => $nid), t('Post new comment'));?>
на
<?php$output = comment_form_box(array('nid' => $nid), t('Post new comment')) . $output;?>
где мы собственно и переносим форму ввода комментария, сразу после ноды.

Пример реализации в ветке форума моего нового проекта Loros Studio

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

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

Недавно пришлось написать модуль, который обрезает изображения и автоматически сохраняет их на сервере. Назвал его 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

Создание новой темы Drupal

Создаем новую папку с название темы. Можно использовать только латинские буквы, цифры и знак подчеркивания. Название должно начинаться с буквы. Мое название темы будет Simple.

1. Создаем файл Название-темы.info. У меня это simple.info
Открываем. Здесь нужно прописать несколько строк.

Основные параметры и описание темы:

name = Simple
Название темы. Так она будет отображаться в списке установленных тем.

description = Моя тема
Описание темы. Краткий текст для пояснения. Также отображается в списке установленных тем.

screenshot = screenshot.png
Изображение темы. Не обязательно, но так удобнее ориентироваться в списке тем, особенно если у вас их много. У меня это маленькая картинка с логотипом.

core = “6.x”
Версия Drupa для которого написана тема.

engine = phptemplate
Название шаблонизатора. Это стандартный шаблонизатор для Drupal. Есть и другие, но это отдельная тема и сейчас ее разбиратьс смысла нет.

Далее подключаем файлы стилей.

stylesheets[all][] = style.css
Файл стилей для всех устройств. На этом можно остановиться. Если вы планируете сайт для мобильных устройств, или в основном для печати на принтерах можете добавить дополнительные файлы стилей. Например для принтера: stylesheets[print][] = printer.css

Указываем регионы (области страницы) для содержимого сайта.

regions[header] = Header
regions[content] = Content
regions[left] = Left
regions[right] = Right
regions[footer] = Footer
До знака равенства – “машинное” обозначение переменной региона. Вставляется в html-макет страницы. Справа “человеческое” название. Используется для отображения на сайте. Когда будете размещать свои блоки, их можно увидеть в макете страницы.
Это стандартные регионы, обычно используемые для большинства сайтов. Вы можете указать свои дополнительные регионы. Или наоборот убрать лишние.

Закончив, сохраняем файл и закрываем. Создам файл style.css (пока пустой) и screenshot.png

2.Создаем файл page.tpl.php

Пишем в нем стандартный html-код разметки страницы.
У нас будет шапка сайта (head), три колонки(left, center,right) и подвал(footer). В них мы укажем регионы, которые мы задали в info-файле.

У меня получился следующий код.

<html> <head> <title>title> </head> <body>   <!—Контейнер для всех частей --> <div id = "all">   <!-- Верхняя часть --> <div id = "header"> </div>   <!-- Левая часть --> <div id = "left"> </div>   <!-- Правая часть --> <div id = "right"> </div>   <!-- Центральная часть --> <div id = "center"> </div>   <!-- Нижняя часть --> <div id = "footer"> </div>   </div>   </body> </html>

Сохраним и пока оставим его.

Подведем прмежуточный итог. У нас есть четыре файла:
1. simple.info – файл описания темы
2. screenshot.png – изображение темы
3. style.css – файл стилей
4. page.tpl.php – файл разметки страницы.

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

3. Редактируем файл page.tpl.php

Для начала нам нужно организовать показ материалов, блоков и прочей информации.
Разместим регион для вывода основого контента сайта $content в центре нашего макета. Для этого нужно внутри блока прописать php код

<!-- Центральная часть --> <div id = "center"> <?php print $content_top; ?> </div>

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

Добавим вывод левой части сайта. Обычно там распологается блоки навигации, пользователей и прочей важной информации. Информация о них храниться в переменной $left.

<!-- Левая часть --> <div id = "left"> <?php print $left ?> </div>

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

<!-- Правая часть --> <div id = "right"> <?php print $right ?> </div>

Добавим загрузку файлов стилей для этого добавим в заголовок сайта строку, получим:

<head> <title></title> <?php print $styles; ?> </head>

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

<head> <title></title> <?php print $styles; ?> <?php print $scripts; ?> </head>

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

Открываем файл style.css м пишем в нем несколько строк:

body { background-color: #ffffff; сolor: #333333; }   #all { width: 1200px; margin: 0 auto; }   #left{ width: 200px; float: left; }   #right{ width: 200px; float: right; }   #center{ overflow:hidden; }

Этим мы указали ширину сайта в 1200 пикселей. Боковые панели по 200 пикселей. А центральная часть займет оставшееся положение между ними.
Обновите сайт в браузере и увидите что блоки выстроились и расположены как положено.

Добавим вывод тайтла – информации в верхнем углу браузера. Он содержиться в переменной $head_title. Допишем строку в заголовок сайта.

<head> <title><?php print $head_title; ?></title> <?php print $styles; ?> <?php print $scripts; ?> </head>

Добавим вывод верхней и нижней части сайта, дописав соответсвенно строки:

<!-- Верхняя часть --> <div id = "header"> <?php print $header; ?> </div>   <!-- Нижняя часть --> <div id = "footer"> <?php print $footer; ?> </div>

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

<?php if ($title): ?> <h1><?php print $title; ?></h1> <?php endif; ?>

Таже добавим вывод системных сообщений и вкладок которые появляються например на странице нод и позволяют легко перейти к ее редактированию. Для этого добавим еще две строки перед $content:

<?php print $messages; ?> <?php if ($tabs): ?> <div class="tabs"><?php print $tabs; ?></div> <?php endif; ?>

При желании можно добавить вывод т.н. «хлебных крошек» – цепочки ссылок, позволяющих пользователю лучше ориентироваться на сайте. Вставим строчку в шапку сайта.
<?php print $breadcrumb; ?>

Напоследок нам нужно добавить «закрывающую» переменную для обозначения области, где заканчиваються переменные. Ее содержание обязательно в файле page.tpl.php и распологают ее обычно в конце кода макета, перед тегом body:
<?php print $closure; ?>

Итоговый листинг кода файла page.tpl.php:

<html> <head> <title><?php print $head_title; ?></title> <?php print $styles; ?> <?php print $head; ?> <?php print $scripts; ?> </head> <body>   <!—Контейнер для всех частей --> <div id = "all">   <!-- Верхняя часть --> <div id = "header"> <?php print $header; ?> <?php print $breadcrumb; ?> </div>   <!-- Левая часть --> <div id = "left"> <?php print $left ?> </div>   <!-- Правая часть --> <div id = "right"> <?php print $right ?> </div>   <!-- Центральная часть --> <div id = "center"> <?php print $messages; ?> <?php if ($tabs): ?> <div class="tabs"> <?php print $tabs; ?> </div> <?php endif; ?> <?php if ($title): ?> <h1><?php print $title; ?></h1> <?php endif; ?> <?php print $content; ?> </div>   <!-- Нижняя часть --> <div id = "footer"> <?php print $footer; ?> </div>   </div> <?php print $closure; ?>   </body> </html>

У нас получилась «заготовка» . Ее нужно доработать до нормальной темы, добавив картинки и цвета, правильно расположить элементы.

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

Создание новой темы Drupal

Создаем новую папку с название темы. Можно использовать только латинские буквы, цифры и знак подчеркивания. Название должно начинаться с буквы. Мое название темы будет Simple.

1. Создаем файл Название-темы.info. У меня это simple.info
Открываем. Здесь нужно прописать несколько строк.

Основные параметры и описание темы:

name = Simple
Название темы. Так она будет отображаться в списке установленных тем.

description = Моя тема
Описание темы. Краткий текст для пояснения. Также отображается в списке установленных тем.

screenshot = screenshot.png
Изображение темы. Не обязательно, но так удобнее ориентироваться в списке тем, особенно если у вас их много. У меня это маленькая картинка с логотипом.

core = “6.x”
Версия Drupa для которого написана тема.

engine = phptemplate
Название шаблонизатора. Это стандартный шаблонизатор для Drupal. Есть и другие, но это отдельная тема и сейчас ее разбиратьс смысла нет.

Далее подключаем файлы стилей.

stylesheets[all][] = style.css
Файл стилей для всех устройств. На этом можно остановиться. Если вы планируете сайт для мобильных устройств, или в основном для печати на принтерах можете добавить дополнительные файлы стилей. Например для принтера: stylesheets[print][] = printer.css

Указываем регионы (области страницы) для содержимого сайта.

regions[header] = Header
regions[content] = Content
regions[left] = Left
regions[right] = Right
regions[footer] = Footer
До знака равенства – “машинное” обозначение переменной региона. Вставляется в html-макет страницы. Справа “человеческое” название. Используется для отображения на сайте. Когда будете размещать свои блоки, их можно увидеть в макете страницы.
Это стандартные регионы, обычно используемые для большинства сайтов. Вы можете указать свои дополнительные регионы. Или наоборот убрать лишние.

Закончив, сохраняем файл и закрываем. Создам файл style.css (пока пустой) и screenshot.png

2.Создаем файл page.tpl.php

Пишем в нем стандартный html-код разметки страницы.
У нас будет шапка сайта (head), три колонки(left, center,right) и подвал(footer). В них мы укажем регионы, которые мы задали в info-файле.

У меня получился следующий код.

<html> <head> <title>title> </head> <body>   <!—Контейнер для всех частей --> <div id = "all">   <!-- Верхняя часть --> <div id = "header"> </div>   <!-- Левая часть --> <div id = "left"> </div>   <!-- Правая часть --> <div id = "right"> </div>   <!-- Центральная часть --> <div id = "center"> </div>   <!-- Нижняя часть --> <div id = "footer"> </div>   </div>   </body> </html>

Сохраним и пока оставим его.

Подведем прмежуточный итог. У нас есть четыре файла:
1. simple.info – файл описания темы
2. screenshot.png – изображение темы
3. style.css – файл стилей
4. page.tpl.php – файл разметки страницы.

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

3. Редактируем файл page.tpl.php

Для начала нам нужно организовать показ материалов, блоков и прочей информации.
Разместим регион для вывода основого контента сайта $content в центре нашего макета. Для этого нужно внутри блока прописать php код

<!-- Центральная часть --> <div id = "center"> <?php print $content_top; ?> </div>

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

Добавим вывод левой части сайта. Обычно там распологается блоки навигации, пользователей и прочей важной информации. Информация о них храниться в переменной $left.

<!-- Левая часть --> <div id = "left"> <?php print $left ?> </div>

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

<!-- Правая часть --> <div id = "right"> <?php print $right ?> </div>

Добавим загрузку файлов стилей для этого добавим в заголовок сайта строку, получим:

<head> <title></title> <?php print $styles; ?> </head>

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

<head> <title></title> <?php print $styles; ?> <?php print $scripts; ?> </head>

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

Открываем файл style.css м пишем в нем несколько строк:

body { background-color: #ffffff; сolor: #333333; }   #all { width: 1200px; margin: 0 auto; }   #left{ width: 200px; float: left; }   #right{ width: 200px; float: right; }   #center{ overflow:hidden; }

Этим мы указали ширину сайта в 1200 пикселей. Боковые панели по 200 пикселей. А центральная часть займет оставшееся положение между ними.
Обновите сайт в браузере и увидите что блоки выстроились и расположены как положено.

Добавим вывод тайтла – информации в верхнем углу браузера. Он содержиться в переменной $head_title. Допишем строку в заголовок сайта.

<head> <title><?php print $head_title; ?></title> <?php print $styles; ?> <?php print $scripts; ?> </head>

Добавим вывод верхней и нижней части сайта, дописав соответсвенно строки:

<!-- Верхняя часть --> <div id = "header"> <?php print $header; ?> </div>   <!-- Нижняя часть --> <div id = "footer"> <?php print $footer; ?> </div>

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

<?php if ($title): ?> <h1><?php print $title; ?></h1> <?php endif; ?>

Таже добавим вывод системных сообщений и вкладок которые появляються например на странице нод и позволяют легко перейти к ее редактированию. Для этого добавим еще две строки перед $content:

<?php print $messages; ?> <?php if ($tabs): ?> <div class="tabs"><?php print $tabs; ?></div> <?php endif; ?>

При желании можно добавить вывод т.н. «хлебных крошек» – цепочки ссылок, позволяющих пользователю лучше ориентироваться на сайте. Вставим строчку в шапку сайта.
<?php print $breadcrumb; ?>

Напоследок нам нужно добавить «закрывающую» переменную для обозначения области, где заканчиваються переменные. Ее содержание обязательно в файле page.tpl.php и распологают ее обычно в конце кода макета, перед тегом body:
<?php print $closure; ?>

Итоговый листинг кода файла page.tpl.php:

<html> <head> <title><?php print $head_title; ?></title> <?php print $styles; ?> <?php print $head; ?> <?php print $scripts; ?> </head> <body>   <!—Контейнер для всех частей --> <div id = "all">   <!-- Верхняя часть --> <div id = "header"> <?php print $header; ?> <?php print $breadcrumb; ?> </div>   <!-- Левая часть --> <div id = "left"> <?php print $left ?> </div>   <!-- Правая часть --> <div id = "right"> <?php print $right ?> </div>   <!-- Центральная часть --> <div id = "center"> <?php print $messages; ?> <?php if ($tabs): ?> <div class="tabs"> <?php print $tabs; ?> </div> <?php endif; ?> <?php if ($title): ?> <h1><?php print $title; ?></h1> <?php endif; ?> <?php print $content; ?> </div>   <!-- Нижняя часть --> <div id = "footer"> <?php print $footer; ?> </div>   </div> <?php print $closure; ?>   </body> </html>

У нас получилась «заготовка» . Ее нужно доработать до нормальной темы, добавив картинки и цвета, правильно расположить элементы.

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

Яндекс открыл API → Блок «Поделиться»

Блок «Поделиться» поможет вашим посетителям разместить ссылку на страницу вашего сайта в своей социальной сети или блоге.
Теперь о том, как красиво добавить его в сайт на друпале.

http://api.yandex.ru/share/

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

Выводим КНОПКУ под нодой над коментариями:
1) Ставим полезный модуль  comment display, который позволяет выводить блоки над коментариями.
2) Выводим код в блоке(под нодой) с типом фильтра PHP

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

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

Яндекс открыл API → Блок «Поделиться»

Блок «Поделиться» поможет вашим посетителям разместить ссылку на страницу вашего сайта в своей социальной сети или блоге.
Теперь о том, как красиво добавить его в сайт на друпале.

http://api.yandex.ru/share/

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

Выводим КНОПКУ под нодой над коментариями:
1) Ставим полезный модуль  comment display, который позволяет выводить блоки над коментариями.
2) Выводим код в блоке(под нодой) с типом фильтра PHP

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

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

DB Tools – дамп бд, восстановление из дампа, восстановление испорченных таблиц


Я дано уже пользуюсь Sypex Dumper Lite дампером, и за это время было отловлено много ошибок, а также сильно не хватало функционала, поэтому я начал потихоньку исправлять баги а так же дописывать нужные мне фичи. Тем же временем основной проект ушел в сторону AJAX и прочих рюшек, при этом что печально, утратил надежность.
Я пытался несколько раз использовать 2 версию, но к сожалению она меня сильно подводила. Так я и решил продолжить совершенствовать 1.

Что может:

Дамб любых таблиц (экспорт) Восстановление их дампа таблиц (импорт) Операции над таблицами REPAIR и OPTIMIZE (причем операции производятся над выбранными БД а не таблицами) Что планирую:

Сделать выбор таблиц в виде списка при экспорте Парс SQL инструкций, для поиска и формирование по найденным таблицам, списка таблиц для импорта Прикрепленный файл Размер 2010_11_19_00-23-05-002.jpg 27.93 кб

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

Модуль для Drupal, который расставляет запятые между nodereference

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

Модуль предлагает два новых форматтера для полей noderefrence:

Title (link) comma separated Title (no link) comma separated

На выходе строка из title нод, на который ссылаются из поля, с ссылками или без, но через запятую
Смотрим, качаем, критикуем

По одночисленным заявкам дописал поддержку расставления запятых для content_taxonomy. см. cck_comma_v0.3.zip

Прикрепленный файл Размер cck_coma_v0.1.zip 967 байтов cck_comma_v0.2.zip 986 байтов cck_comma_screen.gif 35.42 кб cck_comma_v0.3.zip 1.06 кб

Attached poll “Продолжать писать модули?”.
Register or login to poll
Results:
да – полезная получилась вестч: 4 голоса
нет – аффтар выпей йаду: 5 голосов

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

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

Иногда может потребоваться изменять значения какого-то 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

Галерея с помощью модуля Gallery Assist, также установка и обзор видов Lightboxes для модуля

Галерея с помощью модуля Gallery Assist

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

Gallery Assist   Version 6.x-1.17

Gallery Assist Lightboxes  Version 6.x-1.4

Image FUpload (Gallery Assist)  Version 6.x-1.x-dev

 

Также в этой статье вы найдете сравнительную характеристику и настройки других видов Lightboxes для данной галереи.

Система на которую ставил:

drupal 6.19

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

Сразу можете закачать вот такие модули.

Gallery Assist   Version 6.x-1.17

Gallery Assist Lightboxes  Version 6.x-1.4

Image FUpload (Gallery Assist)  Version 6.x-1.x-dev

Image FUpload

 

Файлы:

SWFUpload v2.2.0.1 Core.zip (брал отсюда)

jquery-1.3.2.min.js (брал отсюда )

 

Загружаем модули в папку /sites/all/modules

Подключаем их на страничке /admin/build/modules

 

Разархивируем SWFUpload v2.2.0.1 Core.zip переписываем файлы в папку с модулем Image FUpload – modules\image_fupload\swfupload

в этой папке должны присутствовать файлы swfupload.swf, swfupload.js, swfupload.queue.js. Они находятся в разных папках SWFUpload v2.2.0.1 Core.zip. Я переписал эти три файла в корень папки modules\image_fupload\swfupload, также все остальные папки тоже переписал сюда же, на всякий случай. (76 килобайт, не страшно для хостинга).

 

Далее для того чтобы работали все виды Lightboxes, нужно обновить jquery. Самый последний 1.4.3 – плохо совместим с остальными функциями drupal, например collapsible menu, или модуль Dhtml menu, в общем многие стандартные функции менюшек перестали работать на версии 1.4.3.

Путем тестовых испытаний я остановился на версии jquery-1.3.2.min.js. При данной версии работают все меню и другие функции drupal, и ниже перечисленные виды Lightboxes.

 

Как обновить jquery в drupal:

jquery.js drupal находится в папке misc (от корневой папки drupal), скачиваем файл jquery-1.3.2.min.js, и заменяем старый файл.

Я переименовал старый (версия 2.6) и оставил его на всякий случай.

А файл jquery-1.3.2.min.js переписал сюда же и переименовав в " jquery.js " (без кавычек). На всякий случай очистим кеш. ( /admin/settings/performance самая нижняя кнопка очистить кеш).

Если Вы сделали все правильно, то на странице /admin/settings/gallery_assist система напишет "Current used JQuery version: 1.3.2"

Если кто использует модуль Lightbox2, будьте внимательны с Auto handle , так как у меня почему-то слетели коллапс меню после назначения действий для автозамены КРОМЕ Custom class image, в нем прописывал класс и все работало.

 

Галерея создается таким способом:

1. Создать материал – Gallery

Вводим Gallery title: *, если нужно описание галереи и пункт меню. Пока что функций галереи нету, не пугайтесь так надо. Особенность Gallery Assist, в том что сначала нужно создать node, сохранить, и снова войти в режим редактирования.

2. Сохраняем.

3. Снова заходим редактировать содержимое галлереи, и уже видим что появились:

поля для загрузки фотографий по одной; Multiple Uploads (Image FUploader) – массовая загрузка фотографий. Кликаем на пиктограмму в разделе Multiple Uploads, выделяем много фотографий, и нажимаем сохранить (кнопка данного раздела) и увидите что пошла закачка файлов.

 

В детали настройки  модуля Gallery Assist я не буду вдаваться, там относительно все понятно, если поможет русификация модуля. Единственное чего не нашел – это как убрать pager – ссылки на страницы с другими фотографиями. Можно только поставить максимальное количеств фотографий на одной странице. Альтернатива этому – прописать в настройках css для данной темы друпала #ga-pager-box {display:none;}. Таким образом мы просто скрываем ссылки на другие страницы, а  с помощью Lightboxes мы все равно можем вывести все фотографии так как они автоматически группируются, и в некоторых видах Lightboxes есть отображение Thumbnail (превьюшек), так что кликнув на оду из фотографий, мы все равно увидим все остальные, которые не отобразились на первой странице.

Галерею мы создали. Но теперь нужно вывести ее в красивом виде.

Тут нам поможет модуль Gallery Assist Lightboxes.

В настройках данного модуля (/admin/settings/gallery_assist/lightboxes_info) есть ссылки на все скрипты всех видов Lightboxes. которые модуль поддерживает.

Я скачал только некоторые виды Lightboxes, так как по примерам они показались мне более красочными.

Я не использовал Lightbox2, так как он в стандартном модуле.

Есть множество решений и статей по подключению lightbox2 к Gallery Assist.

 

Когда я скачал все виды Lightboxes, я разархивировал их в папку sites\all\modules\gallery_assist_lightboxes\lightboxes.

Каждый вид Lightboxes, записываем в папки желательно под такими же именами, как они назваются в таблице /admin/settings/gallery_assist/lightboxes_info например highslide (а не highslide-4-1-9).

Далее заходим /admin/settings/gallery_assist/extras

Кликаем на меню Lightboxes for Gallery Assist

Выбираем Lightboxes: и жмем сохранить.

При переключении между вариантами Lightbox-ов может писать ошибки – я не обращал на них внимания – так как после того как нажал сохранить выбор – они больше не появляются.

Снова заходим в меню Lightboxes for Gallery Assist и выбираем в меню Files to include.

Здесь мы подключаем внутренние файлы и настройки разных видов Lightboxes.

Ниже я указал какие настройки нужно поставить для разных видов Lightboxes, чтобы они заработали.

Не забывайте обновлять (может даже по 2-3 раза кликнуть на обновить) страницу галереи, когда меняете настройки, чтобы увидеть изменения. Так как подключаются уже другие файлы эффектов.

Files to include

color box

CSS files: colorbox.css или другой на свой вкус.

JS files:    jquery.colorbox.js

 

+ Есть функции слайдшоу.

+ Множество настроек, как времени слайд шоу, также что написать вместо слов NEXT Previous, затемнение, широкие настройки размеров – отступы внутри, снаружи и т.д. и многое другое.

- Автоматическое генерирование превьюшек Thumbnail ( вариант gallery_assist.highslide.theme2.selector.js)  

 

Highslide 4.1.9

CSS files:

highslide-ie6.css

highslide.css

JS files:

highslide-with-gallery.js

gallery_assist.highslide.theme1.selector.js – к примеру или другой на свой вкус.

+ Автоматическое генерирование превьюшек Thumbnail ( вариант gallery_assist.highslide.theme2.selector.js) 

+ Есть функции слайдшоу.

- Минимум настроек из админки (затемнение и размер картинок) 

 

PrettyPhoto

просто заработал, Выбора css и js не было.

настройки на свой вкус.

 

+ Автоматическое генерирование превьюшек Thumbnail

- Нету функции слайдшоу.

- Минимум настроек из админки (затемнение и размер картинок)

 

Shadowbox

CSS files:
shadowbox.css

JS files: 
shadowbox.js

- Из настроек только Show copyright, Show title

- Нет слайд шоу

- Отсутвует гененрирация Thumbnail

Надеюсь здесь Вы найдете ответы на свои вопросы.

Оригинал этой статьи на моем сайте www.ArtReaktor.com Прикрепленный файл Размер jquery-1.3.2.min_.rar 18.82 кб swfupload_v2.2.0.1_core.zip 75.96 кб

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

Оптимизация Drupal (кеширование и все остальное)

Всем добрый день.

Нашел на одном сайте очень хорошую лекцию по оптимизации Друпал 6. Сделал все как там написано, мой сайт стал просто летать.
В лекцию входят:
Встроенная оптимизация Drupal
Оптимизация Drupal с помощью модулей
Оптимизация конфигурации и обслуживания Drupal
Оптимизация сервера

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

Если это не противоречит правилам, то вот ссылка: http://www.intuit.ru/department/internet/algcso/8/2.html

Также рекомендую этот сайт для самообучения, надеюсь они никогда не уберут бесплатный доступ
З.Ы.: сайт не мой, хотя по-моему он на Друпале крутится, его раскрутка меня не интересует, материал выложил для помощи всем нуждающимся.

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

Массовое редактирование цен в Ubercart

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

Модуль позволяет изменять:

sku(model, артикул) title weight (вес/объем) weight_unit (вписываем g, kg, ml и тд прямо в поле, никаких выпадающих списков – все ради быстрого ввода) sell_price (обычная цена)

Никакие другие параметры в своем нынешнем виде модуль не изменяет!
Никаких проверок не делается – все пишется сразу в базу!!

После установки модуль будет доступен по адресу admin/store/masseditor юзверям с пермишеном administer products.

Модуль лежит на bitbucket
Взять можно либо так:

hg clone http://bitbucket.org/orangeudav/uc_masseditor

либо скачать архив руками, но тогда обновляться придется руками, а не как белые люди (hg pull && hg update):

http://bitbucket.org/orangeudav/uc_masseditor/get/tip.zip

UPD1: Никакой ответственности автор (то есть я) ни за что не несет. Так что перед использованием модуля рекомендую хотя бы в первый раз сделать полный бекам сайта и базы

UPD2: Скриншот

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

прежде чем писать на форум

перед написанием на форум о проблеме сделай следующее:
- вычисти кеш друпа
- вычисти кеш браузера с кукисами
- пни крон
- перестрой права доступа admin/content/node-settings/rebuild
- обнови страницу

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

Как прикрутить шрифт на сайт при помощи CSS

Иногда возникает необходимость использования на сайте нестандартных шрифтов. В данной статье будет рассказано о простом способе «прикрутить» шрифт на ваш сайт средствами CSS. Рассказывать буду на примере Franklin Gothic Medium Cond.
Решение подходит для: Opera, Firefox и IE.

Итак, приступим.

Для начала нам понадобится файл самого шрифта, в формате TTF (TrueType Font). Для этого можно воспользоваться этим сервисом. На нем вы найдете какой угодно шрифт и сразу проверите его в действии. После закачки необходимо .ttf сконвертировать в .eot (Embedded OpenType). Заходим сюда. Нашжав «Обзор» выбираем .ttf, после чего жмем кнопку «Convert TTF to EOF!». Сохраняем на диске. Создаем папку fonts в папке с нашим шаблоном и копируем туда Franklin.ttf и Franklin.eof. Кстати, файлы со шрифтами можете озаглавить как угодно. Далее необходимо добавить следующие строки в css файл нашего шаблона, причем выше стилей, к которым нужно будет привязать шрифт. Также хочу заметить порядок подключения файлов: сначала .eot, а потом .ttf. @font-face { font-family: "Franklin Gothic Medium Cond"; src: url("../fonts/Franklin.eot"); }   @font-face { font-family: "Franklin Gothic Medium Cond"; src: url("../fonts/Franklin.ttf"); }

Спросите почему подключаем два файла? Дело в том, что .ttf поддерживается Мозилой и Оперой, а .eof необходим для IE. Исп. пост glu2006 в теме Typeface – любой шрифт на сайте. В том же файле со стилями мы теперь можем указывать в классах наш шрифт: .content p { font-family: "Franklin Gothic Medium Cond"; }

Все готово! Жмем F5 и наслаждаемся новым шрифтом на нашем сайте из Оперы, Мозилы и IE.

Пример использования этого решения можете увидеть здесь. Левое меню и заголовок h2 выполнены с использованием нашего нестандартного шрифта.

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

jQuery 1.4.3 и Drupal

Как известно, если нельзя, но если очень хочется, то можно.

для друпала 6.19 получается примерно так как в архиве
теперь можно старый файл jquery.js заменить на новый

файлы подготовлены с помощью http://drupal.org/node/479368 и http://drupal.org/node/893538
специально для тех, кто слаб в английском и не очень хорошо умеет применять эти патчи, как например я

прошу потестировать

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

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

Раздельное двухуровневое меню (модификация)

Здравствуйте, уважаемые пользователи Drupal! Совсем недавно имею дело с Drupal, но всё больше и больше нравится мне работать с этой штукой, познавая ее гибкость. Сейчас хочу вспомнить один сниппет, которым многие пользуются. Речь идет о раздельном меню с использованием primary/secondary links. Я решил воспользоваться этим сниппетом для реализации меню на сайте. Но в проекте дизайна для каждого пункта меню планировался разный CSS и разный скрипт, который выполнялся при клике. Посему я решил немножко изменить код сниппета, чтоб получить нумерацию пунктов вида:

<li class="punkt1"> <li class="active2"> <li class="punkt3"> <li class="punkt4">

Для этого в template.php вставляем немного измененный код вместо предложенного по ссылке описанной выше:

<?php

function phptemplate_links($links, $attributes = array()) {

  if (!count($links)) {
    return '';
  }
  $new = 0;//add counter for menuitems
  
  $level_tmp = explode('-', key($links));
  $level = $level_tmp[0];
  $output = "<ul class=\"links-$level ".$attributes['class']. "\">\n";
  foreach ($links as $index => $link) {
    $output .= '<li';
    $new++;//add 1 to counter
    if (stristr($index, 'active')) {
      $output .= ' class="active'.$new.'"';
    }// frontpage AND current-link in menu is <front>
    elseif((drupal_is_front_page()) && ($link['href']=='<front>')){
      $link['attributes']['class'] = 'active';//add class active to <li
      $output .= ' class="active"';//add class active to <a
    }
    
    else $output .= " class=\"punkt".$new."\"";//add class punkt to <li
    $output .= ">". l($link['title'], $link['href'], $link['attributes'], $link['query'], $link['fragment']) ."</li>\n";
  }
  $output .= '</ul>';

  return $output;
}?>

Проверьте,всё работает! Теперь мы получили каждый пункт с разным классом и можем легко стилизовать наше меню!! Надеюсь, кому-нибудь поможет такой мод.

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

список терминов с картинками

Не знаю, может уже никому и не надо, но пусть полежит.

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

Решение:
Модули: taxonomy, views2
Идём в админку и для начала включаем разрешённый тег IMG admin/settings/filters/1/configure

Набиваем наш словарь терминами
далее, кладём картинки, которые будут использоваться в качестве показа с терминами в каталог. Пускай это будет sites\default\files\producers\

Идём в редактирование нашего словаря admin/content/taxonomy/2
И начинаем править каждый термин, прописывая для него картинку

N.B. – прописываем относительный путь и учитываем регистр!

Делаем вывод
Идём делать вьюшку admin/build/views/add
Тип – термин!
Фильтр – словарь → укажите ваш словарь
Поля – “Таксономия: Описание термина” и “Таксономия: Термин”
У “Таксономия: Термин” укажите связать вывод со страницей термина

Добавляем вывод “страница” и указываем путь, куда выводить.
Сохраняем
Наслаждаемся!

Вопросы? Велкам в камменты!

Блягодарю, за потраченное время

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

Выпуск новых версий модулей. 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

Есть что почитать на досуге.

В инете появилось очередное чтиво от Packt, Drupal 7, выпуск сентябрь 2010

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

Файл i18n-ascii.txt для русской транслитерации pathauto. Кому надо – качаем!

Всем привет.
Как известно, чтобы транслитировать УРЛы, создаваемые модулем pathauto, нужен файлик i18n-ascii.txt. Если брать его из поставки pathauto, то там можно найти много лишнего, к тому же, не все символы адекватно интерпретированы.

Например:

Е = “Ie” (хотелось бы видеть E)
Й = “I” (хотелось бы видеть J)

На выходе получаются не совсем адекватные УРЛы, которые могут помешать продвижению сайта. Кроме того, они некрасивы.

Например:

тёща => t-shcha (буквы ё там тоже не было)
сколько => skol-ko
бессонница => biessonnitsa

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

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

Прикрепленный файл Размер i18n-ascii.txt 1.01 кб

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

Система темизации Drupal 6

Вспомнилось мне недавно мое участие на Extreme Camp, проходившем в Москве и, как следствие, мой доклад на этом действе. Доклад был поднят, перечитан и несколько подредактирован – получилось весьма симпатичное HOWTO по системе темизации Drupal.

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

Доклад представляет из себя набор слайдов с подробной текстовой информацией и иллюстрациями, переведенный в PDF-формат. Также доклад содержит ссылку на видеоролик по использованию ThemeGenie.

   

В докладе освещены следующие вопросы как темизации, так и создания темы оформления:

Структура темы оформления Drupal 6, первые шаги Описание файлов темы оформления Синтаксис и список некоторых возможных переменных для файлов шаблонов Использование средств разработки: Devel, Adobe Dreamweaver CS4(5) + Themegenie, Firebug Краткое разъяснение понятия темизации Drupal

С документом можно ознакомиться по этой ссылке

Видеоролик доступен и на youtube

Гурманы могут скачать PDF-документ и видео в архиве.

С уважением,
Каражас Эльдар aka teamfighter,
соучредитель сообщества разработчиков SoftInterGroup

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

Способ создания пункта меню “Редактировать личные данные” или “Мой трекер”

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

Как часто хочется добавить в меню пункт “Редактировать профиль” или “Мой трекер”, но стандартные средства Друпала не позволяют это сделать (возможно плохо искал) и приходится писать код или смириться с невозможность вывести эти пункты меню.

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

Описываю шаги:

Заходим в базу MySQL Жмем ссылку SQL (см. скрин) В текст запроса вставляем текст из файла menu_create.sql Жмем ОК Если ошибок не было, то заходим на свой сайт в Secondary menu Очищаем кеш (опционально) Готово!

Помимо ссылки “Редактировать профиль” создаются еще несколько ссылок, если не используете модули, выводящие эти ссылки в профиле пользователя – просто удалите их из Secondary menu обычным способом.

ЗЫ: при импорте в базу может выпасть сообщение о невозможности создания индекса – это значит, что меню с индексами, которые я прописал в sql-файле (50001, 50002, …) уже имеются в базе, выход – отредактировать menu_create.sql.

Прикрепленный файл Размер attach.zip 50.98 кб screen.jpg 67.12 кб

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

Twitter PIN-based OAuth, include к модулям

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

Написал include чтобы твиттовать в Twitter с помощью PIN-based OAuth. Модуль twitter слишком “большой” для этого.

Использована статья http://articles.sitepoint.com/article/oauth-for-php-twitter-apps-part-1
Используется класс TwitterOAuth от Abraham Williams, смодифицироанный по статье, я его сразу включил в архив.

Использование:
1. Естественно регистриуем свой сайт в http://dev.twitter.com/apps/new , в Application Type выбираем Client, а Default Access type в Read & Write!. Остальные поля неважны, записываем выданные consumer и secret keys.

2. В файлах архива и в коде YOURMODULE меняем на название своего модуля всюду.

2. Теперь прописываем в своём модуле следующее, доступ по меню значит админский:

function YOURMODULE_menu() { // меню настройки вашего модуля уже можеть быть! $items['admin/settings/YOURMODULE'] = array( 'title' => 'YOURMODULE settings', 'page callback' => 'drupal_get_form', 'page arguments' => array('YOURMODULE_settings'), 'access arguments' => array('administer site configuration'), ); //... //а вот это обязательно: $items['admin/settings/YOURMODULE/twitter/register'] = array( 'title' => 'Twitter register', 'description' => 'Call register for OAUTH in twitter.', 'page callback' => 'YOURMODULE_twitter_register', 'access arguments' => array('administer site configuration'), 'file' => 'YOURMODULE.twitter.inc', 'type' => MENU_CALLBACK, ); $items['admin/settings/YOURMODULE/twitter/validate'] = array( 'title' => 'Twitter validate', 'description' => 'Call validate for OAUTH in twitter.', 'page callback' => 'YOURMODULE_twitter_validate', 'access arguments' => array('administer site configuration'), 'file' => 'YOURMODULE.twitter.inc', 'type' => MENU_CALLBACK, ); //... return $items; } ... /** * Settings page of YOURMODULE module. */ function YOURMODULE_settings() { $form = array();   // .... module_load_include('inc', 'YOURMODULE', 'YOURMODULE.twitter'); $form += YOURMODULE_twitter_settings(); // ....   return system_settings_form($form); }

4. Вылаживаем архив в модуль, как описано в hook_menu=>item=>file.

5. Заходим в настройки вашего сайта по адресу: http://вашсайт/admin/settings/YOURMODULE

6. Следуем инструкции, внизу будет ругаться что не сделано, кликаем и вводим.

7. Твиттуем в вашем модуле:

module_load_include('inc', 'YOURMODULE', 'YOURMODULE.twitter');   $status = 'bla-bla-bla'; $response = YOURMODULE_tweet($status);   if (is_object($response) && $response->error) { watchdog('YOURMODULE', 'Error occured while twitting: %response', array('%response'=>print_r($response,1)), WATCHDOG_ALERT); }

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

Прикрепленный файл Размер yourmodule.twitter.zip 11.17 кб

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

© 2009 Обзор CMS