Drupal 7 Deploy (делаем Deploy нового функционала проще) Anton Ivanov
Почему возникают проблемы Настройки сайта производимые через WEB интерфейс не логгируются. Ни один из существующих модулей/утилит не позволяет переносить все изменения.
Обзор существующих решений
Features Переносит: Content types, Fields, Image styles, Menu, Permissions, Roles, Text formats, Variables, Nodes, Users, Taxonomy, Blocks, Nodequeue. Преимущества: Функциональность, Модули расширяющие функционал. Недостатки: Не универсальное решение, Монструозен, Нагрузка на сайт.
Patterns Переносит: Content Types, Views, Image styles, Menu, Blocks, Content, Users, Profiles, Taxonomy, Pathauto, System settings, Permissions / Roles, Variables. Преимущества: Функциональность, Проста освоения. Недостатки: Не универсальное решение, ALPHA версия, Не генерирует YML.
Deployment Переносит: Views и Контент со всеми зависимостями (references (term, node), taxonomy vocabularies, terms). Преимущества: Функциональность, Проста освоения, Самостоятельность. Недостатки: Не универсальное решение, DEV версия.
Предлагаемый подход Все что можно сделать через WEB интерфейс - можно сделать программно в hook_enable() либо hook_update(). Преимущества: Ускорение и Автоматизация Deploy. Недостатки: +Затраты времени, Не применим при массовом импорте.
Примеры кода
Создание/Изменение/Удаление типа нод Первый способ: Implement hook_node_info() hook_form() hook_insert() hook_update() hook_load() hook_delete() hook_view()
Создание/Изменение/Удаление типа нод Второй способ: $type = node_type_set_defaults(); // node_type_load(Машинное имя). $type->type = Машинное имя типа нод; $type->name = Имя типа нод; $type->description = Описание типа нод; $type->help = Пояснения; $type->title_label = Название поля заголовка; $type->has_title = ($type->title_label != ''); $type->modified = TRUE; $type->custom = 1; $type->locked = 0 или 1; $type->base = 'node_content'; $type->module = ; node_type_save($type); node_types_rebuild(); menu_rebuild(); Удаление типа нод: node_type_delete(Машинное имя).
Создание/Изменение/Удаление нод $node = new stdClass(); // Или node_load(ID ноды) $node->title = Тайтл ноды; $node->type = Машинное имя типа ноды; $node->language = Язык ноды; $node->uid = UID владельца ноды; $node->status = NODE_PUBLISHED или NODE_NOT_PUBLISHED; $node->comment = COMMENT_NODE_OPEN или COMMENT_NODE_CLOSED; $node->field_mashine_name[$node->language][0]['tid|value'] = Значение; … // Эти поля используются для редактирования существующей ноды. $node->nid = ID ноды; $node->vid = ID версии; node_save($node); // Удаление ноды: node_delete(ID ноды).
Создание полей $field = array( 'field_name' => Машинное имя поля, 'cardinality' => 1, 'translatable' => TRUE или FALSE, 'type' => 'text', ); field_create_field($field); $instance = array( 'field_name' => Машинное имя поля, 'entity_type' => 'node', 'label' => Лейбл поля, 'bundle' => В данном случае тип нод, 'required' => TRUE или FALSE, 'widget' => array( 'type' => 'text_textfield', ), 'display' => array( 'default' => array( 'type' => 'text_default', ), ), ); field_create_instance($instance);
Изменение/Удаление полей // Изменение уже существующего поля: $instance = field_read_instance(Тип энтити, Машинное имя поля, Бандл); // Производим модификацию объекта поля. field_update_instance($instance); // Удаление связи поля с энтити: field_delete_instance(Объект поля, Удалять или нет само поле). //Удаление поля: field_delete_field(Машинное имя поля).
Создание/Изменение/Удаление словаря таксономии $v = (object) array( 'name' => Имя словаря, 'machine_name' => Машинное имя словаря, 'description' => Описание словаря, ); taxonomy_vocabulary_save($v); // Обновление словаря: $v = taxonomy_vocabulary_machine_name_load(Машинное имя словаря); // Или: $v = taxonomy_vocabulary_load(ID словаря); // Производим модификацию объекта словаря. taxonomy_vocabulary_save($v); // Удаление словаря: taxonomy_vocabulary_delete(ID словаря).
Создание/Изменение/Удаление термина таксономии $term = (object) array( 'vid' => ID словаря, 'name' => Имя термина, 'parent' => ID родительского термина, // Если родителя нет пишем 0. 'description' => Описание термина, ); taxonomy_term_save($term); // Обновление термина: $term = taxonomy_term_load(ID термина); // Производим модификацию объекта термина. taxonomy_term_save($term); // Удаление термина: taxonomy_term_delete(ID термина)
Создание/Изменение Views С начала создаем вьюшку с помощью интерфейса Views Новый или существующий модуль + hook_views_api() Создаем файл MODULE_NAME.views_default.inc hook_views_default_views() в MODULE_NAME.views_default.inc Экспортируем созданый views в hook_views_default_views() Удаляем созданный views и сбрасываем кеш. Изменяем views, сохраняем и экспортируем в hook_views_default_views() Нажимаем Revert или Вернуть.
Создание/Изменение Image Style hook_image_default_styles() Второй способ: $style = image_style_save( array( 'name' => Название Image Style, ) ); $effect = image_effect_definition_load(Машинное имя эффекта); $effect['isid'] = $style['isid']; $effect['weight'] = 1; $effect['data'] = array( 'width' => 150, 'height' => 250, 'anchor' => 'center-center', ); image_effect_save($effect); Удаление: image_effect_delete(Массив эффекта), image_style_delete(Image Style).
Включение/Выключение/Удаление модуля module_exists() module_enable() module_disable() drupal_uninstall_modules()
Создание/Изменение/Удаление пользователя $user = array( 'name' => Логин, 'pass' => Пароль, 'mail' => , 'status' => 1, ); user_save('', $user, 'account'); // Изменение пользователя: $user = user_load(ID пользователя); $edit = array( 'status' => 1, ); user_save($user, $edit); // Удаление пользователя: user_delete(ID пользователя);
Создание/Изменение/Удаление роли $role = (object) array( name => Название роли, ); user_role_save($role); // Изменение роли: $role = user_role_load(ID роли); // Производим модификацию объекта роли. user_role_save($role); Удаление роли: user_role_delete(Объект роли). // Модификация прав роли: user_role_change_permissions( 2, array( 'administer nodes' => 0, // Revoke 'administer nodes' 'administer blocks' => FALSE, // Revoke 'administer blocks' 'access user profiles' => 1, // Grant 'access user profiles' 'access content' => TRUE, // Grant 'access content' ) );
Создание/Изменение/Удаление меню menu_save(array( 'menu_name' => Машинное имя меню, 'title' => Название меню, 'description' => Описание меню, )); // Изменение меню: $menu = menu_load(Машинное имя меню); // Производим модификацию Меню. menu_save($menu); // Удаление меню: $menu = menu_load(Машинное имя меню); menu_delete($menu);
Создание/Изменение/Удаление пункта меню $link = array( 'link_title' => Текст ссылки, 'link_path' => Путь ссылки, 'description' => Описание, 'enabled' => 1, 'menu_name' => Машинное имя меню, 'plid' => 0 // ID родительской ссылки. 'weight' => 1, ); menu_link_save($link); // Изменение пункта меню: $link = menu_link_load(ID пункта меню); // Производим модификацию Пункта меню. menu_link_save($link); // Удаление пункта меню: menu_link_delete(ID пункта меню);
Создание/Изменение блоков Implement hook_block_info() hook_block_configure() hook_block_save() hook_block_view() Второй способ: block_add_block_form_submit(NULL, $form_state) block_admin_configure_submit(NULL, $form_state) block_custom_block_delete_submit(NULL, $form_state)
Процесс Deploy Создание бэкапа базы Обновление файлов проекта Запуск Update При массовом импорте: Импорт контента с использованием существующих модулей
Спасибо за внимание Skype: antonnavi