ShvetsGroup

 

Создание и использование Features

1 comment

Создание и использование Features

Если вы не понимаете о чем речь, можете почитать первую, вводную часть цикла Features — Функционал Features в Open Atrium.

Рассмотрим использование «фич» на примере. У нас есть задача добавить на сайт возможность размещения Резюме в минимальном функционале. Нам для этого нужно:

  • новый тип материала с необходимыми полями;
  • необходимы дисплеи Views;
  • возможность сортировки результатов (сделаем Exposed фильтром);
  • пункт меню что бы видеть уже созданные резюме;
  • блок с последними добавленными вакансиями.

Решение с помощью Features

Задача есть, теперь нужно ее решить. Описывать прописные истины здесь не будем, коснемся только использования «фичей», остальное будем подразумевать что оно уже готово или создаем как для обычного сайта Друпала.

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

Для обоих вариантов у нас должно быть примерно следующее:

  • Тип материала для добавления резюме
  • Необходимые поля созданные с помощью CCK (они могут отличаться для разных сайтов, поэтому во втором варианте у вас может быть немного другой набор полей)
  • Пункт меню
  • Необходимые представления: страница с резюме, блок с последними резюме. Тут можно заметить небольшую ошибку – вид называется вакансии, а выводит резюме. Это не просто опечатка, а реальные данные. Сайт на котором размещают резюме также может размещать и вакансии, отличие функционала вакансий от резюме в названиях полей CCK, названии меню и еще пару мелочей. Поэтому мы можем создать модуль-фичу сначала резюме. Потом поменять названия и сохранить как новый модуль вакансий, это экономия времени. Пока мы остановимся только на нашем функционале резюме, а эту ошибку исправим позже.

Теперь переходим к созданию нового модуля-фичи (/admin/build/features/create). Имя модуля должно быть англоязычным в нижнем регистре (имена функций будут совпадать с именем модуля.

Здесь выбираем все что входит в функционал нашего будущего модуля:
Слева есть список выбора – Add Components, в котором перечислены модули совместимые с Features. С помощью чекбоксов выбираем все что нам нужно и в тоже время справа появляется таблица с выбранными компонентами.

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

Нажимаем кнопку Download features и сохраняем архив с модулем.
Готово мы получили необходимый модуль для создания резюме на любом сайте. Все что теперь необходимо для разворачивания нового функционала это распаковать архив и включить в админке.

Посмотрим изнутри на новый модуль

Распаковав архив видим 6 файлов (файлы начинаются с имени которое мы задали при создании «фичи», поэтому необходимо англоязычное название)

  • rezume.info
  • rezume.module
  • rezume.features.inc
  • rezume.defaults.inc
  • rezume.features.node.inc
  • rezume.features.views.inc

Файлы rezume.info и rezume.module нам знакомы, это стандартные файлы как и у любого другого модуля.

rezume.info – описание модуля

core = "6.x"
dependencies[] = "date"
dependencies[] = "features"
dependencies[] = "number"
dependencies[] = "taxonomy"
dependencies[] = "text"
dependencies[] = "views"
description = "Add rezume"
features[content][] = "rezume-field_amont"
features[content][] = "rezume-field_birth"
features[content][] = "rezume-field_contact"
features[content][] = "rezume-field_name"
features[content][] = "rezume-field_stydy"
features[node][] = "rezume"
features[user][] = "create rezume content"
features[user][] = "delete any rezume content"
features[user][] = "delete own rezume content"
features[user][] = "edit any rezume content"
features[user][] = "edit own rezume content"
features[views][] = "vacansii"
name = "rezume"
package = "Features"
project = "rezume"

rezume.module – сам модуль. Так как у нас базовый функционал, то функций никаких нет, только подключение файла в котором описание «фичи», это блоки, представления, меню и прочее. Если вам необходим дополнительный функционал то в этом файле можно его дописать.

include_once('rezume.features.inc');

rezume.features.inc – сборка функционала, состоит из нескольких ХУКов
hook_content_default_fields(), hook_node_info(), hook_user_default_permissions(), hook_views_default_views().
Каждый из ХУКов подключает необходимый файл и вызывает функцию для добавления view, блоков, разрешений и прочего.

Файлы rezume.defaults.inc, rezume.features.node.inc, rezume.features.views.inc — это инициализация установок по умолчанию и создание функционала.

В принципе эти файлы нам трогать не нужно, так как тут уже все настроено и имеет завершенный вид, но иногда необходимо подправить или добавить функционала.
Нам на этом этапе необходимо исправить нашу ошибку в названии Views-представления.
открываем файл rezume.info и изменяем строку
features[views][] = "vacansii"
на

features[views][] = "rezume"

в файле rezume.features.views.inc изменяем
// Exported view: vacansii
$view = new view;
$view->name = 'vacansii';
на

// Exported view: rezume
$view = new view;
$view->name = 'rezume';

Теперь все правильно.

Откат на контрольную точку

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

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

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

В случае модуля-фичи даже такая надуманная ситуация на самом деле не столь страшна. Переходим на страницу Features и видим наш модуль, также он отмечается статусом Overridden, что означает что его изменяли.

Нажимаем на ссылку Overridden и на этой странице мы видим что были проведены изменения в Views представлениях.

Для отката к предыдущему состоянию, необходимо установить чекбокс рядом с Views и нажать на кнопку Revert components, далее подтвердить свое желания вернуться к установкам по умолчанию. В результате мы вернемся к тому виду который сохранен нами в файле.

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

Итог

Я думаю после прочтения этой заметки каждый сделает для себя сам вывод для какой цели можно использовать модуль-фичу.

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

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

Comments

esteewhy
July 28th, 2010

Здесь можно продолжить на тему того, что может быть экспортировано в виде feature.

Кроме упомянутых Views, CCK node types, зависимостей от модулей, imagecache - это также Panel nodes и Panel pages, контексты модуля Context, системные переменные (с пом. strongarm.module). В последнем случае, к сожаленью, наименьшей единицей экспорта может быть только переменная целиком, но не отдельные поля сериализованного PHP объекта. Так что, скажем, контролировать отдельные настройки темы (хранящейся в единой переменной) не получится.

А вот что нельзя экспортировать и контролировать - это словари таксономий. Также не всегда удается корректно отследить изменения типов содержимого.

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

Got anything to add?