250 likes | 536 Views
Drupal 7 Deploy (делаем Deploy нового функционала проще). Anton Ivanov. Почему возникают проблемы. Настройки сайта производимые через WEB интерфейс не логгируются. Ни один из существующих модулей/утилит не позволяет переносить все изменения. Обзор существующих решений. Features.
E N D
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' => “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: antonnavi • Email: anton.ivanov@wdg.com.ua