Заметки начинающего друпаллурга

Поскольку мало еще на русском языке того, что называют заметками по настройке CMF Drupal, вснесу и свою скромную лепту в это дело. Кроме того, кратко о самой системе управления сайтом и подборка документации на неё.

Сайт курсов валют – e-oriental.ru (бывш. currency.servisator.ru)

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

Доступны курсы валют России (рубль), Украины (гривна), Китая (юань), Европы (евро), Израиля (шекель), Казахстана, Грузии, Армении, Канады, Австралии, Монголии, Ирана и Мадагаскара на трех языках (русский, английский, китайский).

Drupal: В Интернете появилась доменная НОДА

Новости ‪Drupal‬ (тут смайлик):
В интернете появилась аж целая доменная НОДА. Домен Грузии на грузинском გე в punycode выглядит как XN--NODE.

http://servisator.ru/news/2015/06/13/xn--node

Устройство файловой системы Drupal 6

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

Начну с файлов внизу изображения.

Коротко о Drupal 6

Drupal 6 - это гибкая модульная система управления содержанием сайта, написанная на PHP. Для хранения данных применяются БД MySQL или Postgre SQL. Механизмы кеширования могут использовать базу данных (по умолчанию), файловую систему сайта или кеширование в оперативной памяти сервера (memcached и пр.) как по отдельности, так и в комбинации в зависимости от вида кеша. На Drupal 6 легко реализуется многоязычность (включая разные домены), мультисайтинг (как с общим кодом, так и с общей БД), а также общие пользователи для разных сайтов. Бэкэнд в ядре системы не отделен от фронтэнда, обработка запросов к сайту происходит одинаково, но формально путь http://example.com/admin является заглавной страницей административной части. Drupal поддерживает на одном функционале несколько разных дизайнов сайта или тем в местной терминологии. Практически всегда используется перезапись путей на сайте (так называемые "чистые URL") через модуль Apache mod_rewrite. Возможна работа с nginx, часто применяется связка обоих серверов. Возможна работа и на веб-серверах других типов.

Вводный курс Drupal 6 для разработчика

Потребовалось ввести пару человек в работу над моими проектами на Drupal 6, которые были до этого с ним незнакомы. С друпалом. Поэтому решил написать для специалистов уже хорошо знакомых с веб-разработкой и программированием на других CMS/CMF, но новичков в Drupal. Эта статья поможет вам войти в курс дела и узнать с чем вы столкнетесь на любом большом или не очень Drupal-сайте, если вам вдруг привалило счастье его поддерживать. А также узнать, как все это работает. А для меня это обобщение своего опыта, связанного с поддержкой и разработкой как своих, так и чужих проектов. Написанное, во многих моментах относится и к Drupal 7, но новшества и особенности семерки я затрагивать не буду. В следующий раз. :) Все ссылки даны на официальную англоязычную, документацию, она наиболее полна, либо на статьи некоторых разработчиков системы. А найти соответствующие топики на русском, вы сможете сами, вбив соответствующие ключевые слова в поиске. Часть документации Drupal, переведённую на русский язык, можно найти на сайте русскоязычной поддержки Drupal, который посещают более 100 тысяч посетителей ежемесячно.

Быстрый способ оптимизации параллельных загрузок на Друпал и nginx

Однажды разглядывая «водопадный» дисплей работы сети в Опере по мере того, как в него грузился один из моих проектов, я понял, что пора и на нем сделать оптимизацию того типа, который указан в заголовке статьи. При довольно быстром в пол-секунды получении кода страницы, полсотни вставленных в нее картинок секунд на пять оттягивали заветное событие DOM loaded, да и разница между DOM loaded и Page loaded тоже была того же порядка. Растём-с.

Спецификация HTTP 1.1 рекомендует браузерам запрашивать не более двух соединений на хост одновременно. Принята спецификация довольно давно, еще когда деревья были кустарниками, а интернет приходил в дом с телефонного коммутатора, и тогда это имело смысл. Сейчас интернет изрядно потолстел и большинство разработчиков браузеров эту рекомендацию уже давно не соблюдают. Но тем не менее типичные умолчания болтаются где-то в районе 4-х коннектов на хост, а простых пользователей интернета, что способны ускорить его себе, просто увеличив это значение до доступного максимума, я пока не встречал. Так что рекомендации увеличить количество параллельных загрузок, доступных для клиента на серверной стороне, если число объектов веб-страницы превышает десятки штук, уже давно прописались во всех руководствах по оптимизации сайтов. Достигается это довольно простым способом: часть внедряемого контента страниц размещается на других поддоменах вашего сайта и соответственно меняются ссылки в его страницах. Физически эти файлы или скрипты могут располагаться на том же сервере, что и сайт, более того, в той же самой корневой папке.

Сайт компании «Подшипник-Сервис» – podshipnik-servis.ru

Скриншот сайта компании «Подшипник-Сервис»Сайт компании «Подшипник-Сервис», крупного поставщика подшипников на Дальнем Востоке.

Весь последний год работал над этим проектом. Он еще не закончен, еще два месяца впереди. И вообще, есть ощущения, что меня на нем поженят. smiley

Вкладка Добавить в типах материалов

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

Люблю простые решения:

/**
 * Implementation of hook_menu().
 */

function mymodule_menu() {
// Вкладки Добавить в типах материалов.
// Получаем список типов
  $types = node_get_types();
// Перебираем его
  foreach($types as $type) {
// Формируем адрес страницы рядом с вкладками Управления и Отображения полей
    $items['admin/content/node-type/'. str_replace('_', '-', $type->type) .'/add'] = array(
// Заголовок с плейсхолдером для функции t()
      'title' => 'Add new @name',
// В параметры для t() добавляем имя типа
      'title arguments' => array('@name' => $type->name),
// Собственно, вкладка меню
      'type' => MENU_LOCAL_TASK,
// Вызываем системную функцию перенаправления на страницу
      'page callback' => 'drupal_goto',
// Формируем для drupal_goto() адрес страницы добавления материала
      'page arguments' => array('node/add/'. str_replace('_', '-', $type->type)),
// Права доступа на добавление контента этого типа
      'access arguments' => array('create '. $type->type .' content'),
// Размещаем вкладку после всех имеющихся
      'weight' => 20,
    );
  }
// PROFIT
  return $items;
}

Модуль клонирования типов страниц (нод, контента, содержимого) в Drupal 6

Модуль дополняет функционал CCK, связанный с экспортом настроек типов нод в пределах одного Drupal-проекта. Функционад импорта-экспорта в модуле Content copy довольно неудобен для конечного пользователя, которому хочется одной волшебной кнопки, вместо копирования кода из окошка в окошко. Для того и сделан этот модуль. Я весьма удивился, что не нашел подобного функционала на www.drupal.org. Плохо искал?

Модуль Content clone при включении добавляет ко всем типам содержимого (кроме заблокированных от удаления и от модификации системного имени) дополнительную вкладку Clone (Клонировать). Перейдя по ней, администратор сайта может указать новое уникальное машинное имя типа контента, новое уникальное человекочитаемое имя и опциональное описание. После подтверждения формы и валидации, новый тип ноды создаётся со всеми настройками, полями и группами полей CCK.

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

Скачать модуль

Хитрости hook_menu()

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

Пусть в вашем модуле требуется отобразить на отдельной странице некий объект хранящийся в базе данных, например, Gorilla. Идентификатор объекта передается в строке запроса. Модуль, соответственно тоже называется gorilla.
А теперь, 10 строк очень универсального кода в студию:

function gorilla_menu() {
  $items = array();
  $items['gorilla/%gorilla'] = array(
    'title' => 'Gorilla item',
    'page callback' => 'theme',
    'access arguments' => array('view gorilla'),
    'page arguments' => array('gorilla_view', 1),
  );
  return $items;
}

Произойдет тут следующее...

Синдикация материалов