Drupal 7 Deploy (делаем Deploy нового функционала проще) Anton Ivanov
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.
Преимущества: Функциональность, Проста освоения.
Недостатки: Не универсальное решение, BETA версия, Генерирует не все 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' => “Email”, '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: antonnaviEmail: [email protected]