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

Главные вкладки

Аватар пользователя neochief neochief 6 мая 2010 в 17:07


Первая часть цикла о Features — Функционал Features в Open Atrium.

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

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

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

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

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

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

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

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

Здесь выбираем все что входит в функционал нашего будущего модуля:
Слева есть список выбора – 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 – описание модуля

<?phpcore = "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 – сам модуль. Так как у нас базовый функционал, то функций никаких нет, только подключение файла в котором описание «фичи», это блоки, представления, меню и прочее. Если вам необходим дополнительный функционал то в этом файле можно его дописать.

<?phpinclude_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 и изменяем строку

<?phpfeatures[views][] = "vacansii"?>

на

<?phpfeatures[views][] = "rezume"?>

в файле rezume.features.views.inc изменяем

<?php  // Exported view: vacansii
  
$view = new view;
  
$view->name 'vacansii';?>

на

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

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

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

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

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

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

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

features_1_0.png

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

features_2_0.png

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

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

Итог

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

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

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

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

via ShvetsGroup
Автор: Олег Сидоренко

Комментарии

Аватар пользователя Dan Dan 6 мая 2010 в 20:20

Да, features+spaces+strongarm - на русском информации нет вообще. Многие откроют для себя новую сторону друпала, в придачу к CCK, views и panels.

Аватар пользователя orb orb 6 мая 2010 в 20:55

"Dan" wrote:
features+...+strongarm
интересно что этим можно сделать?
да и вообще не представляю что можно сохранить в модуль от strongarm

Аватар пользователя Siegfrid@drupal.org Siegfrid@drupal.org 7 мая 2010 в 9:58

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

Аватар пользователя Ромка Ромка 7 мая 2010 в 11:38

Попробовал модуль — очень удобная штука! Раньше фотогалереи и другой подобный функционал собирал руками под каждый сайт, теперь можно будет сэкономить время. А может этот модуль шаблоны к фичам цеплять? У меня, например, почти все вьюхи имеют свой *.tpl.php, а в созданной фиче эти представления используют дефолтные шаблоны.

Аватар пользователя F10 F10 8 мая 2010 в 15:59

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

Аватар пользователя andyceo andyceo 16 мая 2010 в 15:19

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

Одно осталось непонятным, поэтому спрошу. Ты говорил об интеграции с SVN. Я так понимаю, что сам Features с SVN не интегрируется, и надо самому добавлять модуль, коммитить обновления в SVN? или есть все-таки такая возможность?

Аватар пользователя andyceo andyceo 18 мая 2010 в 16:05

Повозился с фичами. Первое впечатление - все довольно медленно... Мне пришлось увеличить max_execution_time с 30 сек до 2 минут. Модулей у меня на тестовом сайте около 300.

Второе. Довольно-таки удобно для сохранения функционала, но только вместе с использованием модуля strongarm (т.к. настройки типа матералов, например, создание ревизии по умолчанию, настройки комментов для типа материала и т.п., хранятся в переменных). (Краткая инструкция: просто скачайте и включите модуль strongarm и при создании фичи вы будете иметь возможность сохранить еще и переменные.)

Третье. Не понял, обязательно ли включать модуль фичи в админке модулей admin/build/modules? Т.к. вроде и без этого работает, если зайти на страницу admin/build/features и включить ее, то фича установится.

Четвертое. Можно ли делать зависимости? Т.е. я хочу сделать, скажем, фичу-станину, шасси, на которую будет нанизываться остальной функционал. Например, станина - это включение модуля dblog, настройка сколько записей журнала ему хранить в таблице, включение imagapi с настройками качества jpeg 90% и использование ImageMagic вместо GD. Я делаю фичу-станину, где указываю все эти модули-настройки. Затем, я хочу сделать фичу-резюме, где укажу, что она зависит от станины, и тогда Imagecache в резюме будет генерить превьюшки резюме автоматом через ImageMagic. Если я указываю в .info-файле модуля резюме зависимость от модуля фичи stanina, то при установке он мне включает модуль stanina. Этого не нужно, нужно, чтобы модуль он не включал, а установил фичу stanina.

Пятое. Как установить сервер фич? Что-то я не нашел ссылки на модуль-сервер на drupal.org.

Аватар пользователя orb orb 26 февраля 2014 в 21:48

Между версиями (друпала) не работает, дае между версией отдельных модулей могут быть проблемы, например, Views 2.x и Views 3.x это разные АПИ модулей.

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