Drupal Install Profile
Напевно всі стикались з готовими збірками сайтів на Drupal, коли після встановлення отримуєш готовий сайт з набором необхідних модулів, своєю темою і т.д. Існує велика кількість таких збірок, серед них Open Atrium, Drupal Commons і тому подібне. Думаю виникало питання "А як це реалізовано?" або "Як це зробити?". Відповідь на це питання є Drupal Install Profile.
І так, як створити свій інсталяційний профіль. В основному інсталяційні профілі створюються на основі інсуючого сайту.
Крок 1. Підготовка файлів.
Створюємо папку "modules", а в ній папку "contrib", в яку копіюємо всі необхідні для роботи сайту модулі.
Створюємо папку "themes", в якій розміщаємо папку з нашою темою, наприклад acquia_prosper, і набором .tpl.php i .js та .css файлів, створених в процесі розробки сайту.
Для включення деяких особливих елементів сайту в збірку, таких як views, типи контенту, меню, ролі, права доступу і т.д., використовується модуль Features. Створені "фічі" складемо в папці "features" і розмістимо в папці "modules".
Примітка: На даний момент модуль Features не переносить словники таксономії і терміни в них, можливо це буде реалізовано в наступних версіях модуля, тому це доводиться виконувати вручну. Про це буде написано нижче.
Отримуємо структуру:
- myprofile
-
- modules
- contrib
- features
- themes
Крок 2. Створення файлу .profile.
Цей файл є "мозком" нашого профіля, він керує процесом установки сайту.
Примітка: На даному етапі роботи сайту фукнція t() не працює, тому використовується її еквівалент - st().
2.1. Створюємо файл myprofile.profile.
2.2. _profile_modules()
В файлі формуємо функцію myprofile_profile_modules(). В цій функції описуються модулі, які після установки повинні бути ввімкнені.
<?php
// $Id$
// Вказуємо id словника таксономії
define('MYPROFILE_NEWS_VOCAB_ID', 1);
// Вказуємо назву теми
define('MYPROFILE_ACQUIA_THEME', 'acquia_prosper');
define('MYPROFILE_FUSION_CORE', 'fusion_core');
/**
* Повертає масив модулів, які будуть ввімкнені після установки профіля
*/
function myprofile_profile_modules() {
$modules = array(
// Default Drupal modules.
'color', 'comment', 'dblog', 'help', 'menu', 'path', 'taxonomy',
//ADMINISTRATION
'admin', 'admin_menu',
//CCK
'content', 'text', 'ctools', 'content_permissions', 'fieldgroup', 'filefield',
'optionwidgets', 'nodereference', 'userreference',
//FILEFIELD PATHS
'filefield_paths',
//IMAGECACHE
'imageapi', 'imageapi_gd', 'imagecache', 'imagecache_ui', 'imagecache_customactions',
//TOKEN
'token',
//VIEWS
'views', 'views_bulk_operations', 'viewscarousel', 'views_export', 'views_or', 'views_slideshow',
'views_ui',
//META TAGS
'nodewords', 'nodewords_basic', 'nodewords_extra', 'nodewords_verification_tags',
//USER INTERFACE
'imce', 'wysiwyg', 'jquery_ui', 'jquery_update', 'dialog','vertical_tabs', 'imce_wysiwyg',
//SKINR
'skinr', 'skinr_ui',
//OTHER
'better_formats', 'globalredirect', 'no_anon', 'pathauto',
'url_alter', 'subpath_alias', 'token_actions', 'transliteration', 'vertical_tabs',
//UBERCART
'ca', 'uc_order', 'uc_store', 'uc_product', 'uc_cart',
'uc_payment', 'uc_reports', 'uc_shipping', 'uc_product_power_tools', 'uc_stock',
//XML SITEMAP
'xmlsitemap', 'xmlsitemap_engines', 'xmlsitemap_menu', 'xmlsitemap_node'
);
return $modules;
}
?>Примітка: Модулі, які є залежними від інших (depends on), повинні бути вказазані після модулів, від яких вони залежать. Також виникають проблеми при включені модуля url_alter. Рішення можна знайти тут.
2.3. _profile_details()
Пояснення профіля, яке буде виведене на екрані установки профіля.
<?php
/** @return
* масив з ключами "name" та "description", що описує цей профіль,
* і додатковий "language", щоб перевизначити вибір мови для профіля
*/
function myprofile_profile_details() {
$description = st('Select this profile to install the My custom profile.');
return array(
'name' => 'My profile',
'description' => $description,
);
}
?>В даному прикладі я пропустив вибір мови для профіля, тому мова буде вибрана по замовчуванню англійська.
2.4. _profile_task_list()
Список задач, які будуть виконуватись при установці профіля.
<?php
function myprofile_profile_task_list() {
$tasks = array();
$tasks['configure-myprofile'] = st('Configure My profile');
$tasks['install-myprofile'] = st('Install My profile');
return $tasks;
}
?>2.5. _profile_tasks(&$task, $url)
Дана функція відповідає безпосередньо за етап встановлення профіля.
<?php
/**
* Виконує остаточні задачі установки профіля.
*/
function myprofile_profile_tasks(&$task, $url) {
// пропустимо стандартний етап установки
if ($task == 'profile') {
$task = 'install-myprofile';
}
// Викликає форму вибору "фіч"
if ($task == 'configure-myprofile') {
$output = drupal_get_form('myprofile_features_form', $url);
}
// Інсталяційний batch процес
if ($task == 'install-myprofile') {
$operations = array();
// Доінсталяційні операції
$operations[] = array('myprofile_config_taxonomy', array()); // створення словника таксономії
// Встановлення "фіч"
$features = variable_get('myprofile_selected_features', array());
foreach ($features as $feature) {
$operations[] = array('features_install_modules', array(array($feature)));
}
// Післяінсталяційні операції
$operations[] = array('myprofile_config_theme', array()); // ввімкнення власної теми
$operations['finished'] = 'myprofile_configure_batch_finished';
// Будуємо batch процес
$batch = array(
'operations' => $operations,
'title' => st('Configuring My profile'),
'error_message' => st('An error occurred. Please try reinstalling again.'),
'finished' => 'myprofile_cleanup',
);
// Старт batch
variable_set('install_task', 'install-myprofile-batch');
batch_set($batch);
batch_process($url, $url);
}
// Показує сторінку виконання batch
if ($task == 'install-myprofile-batch') {
include_once 'includes/batch.inc';
$output = _batch_page();
}
return $output;
}
?>2.6. _features_form()
Форма вибору створених "фіч", для переносу їх функціоналу на сайт.
<?php
function myprofile_features_form($form_state, $url) {
$form = array();
drupal_set_title(st('Choose from available features'));
// Допоміжне повідомлення
$form['message'] = array(
'#type' => 'item',
'#value' => st('The selected features will be enabled after the installation has completed. At any time, you can turn the available features on or off.'),
);
$form['content'] = array(
'#type' => 'checkbox',
'#title' => st('Content types'),
'#default_value' => 1,
'#description' => st('Some test content types'),
);
$form['menu_links'] = array(
'#type' => 'checkbox',
'#title' => st('Menu'),
'#default_value' => 1,
'#description' => st('Some test menu'),
);
$form['views_default'] = array(
'#type' => 'checkbox',
'#title' => st('View'),
'#default_value' => 1,
'#description' => st('Some test view'),
);
// Вертає до установки без її переривання
$form['url'] = array(
'#type' => 'value',
'#value' => $url,
);
$form['submit'] = array(
'#type' => 'submit',
'#value' => st('Continue'),
);
return $form;
}
?>2.7. _features_form_submit()
Ця функція формує масив обраних "фіч".
<?php
function myprofile_features_form_submit(&$form, &$form_state) {
// Масив обраних "фіч"
$features = array();
foreach ($form_state['values'] as $key => $value) {
$features[] = $key;
}
// Сформуємо тимчасову змінну з обраними "фічами"
variable_set('myprofile_selected_features', $features);
// Ініціюємо наступний крок установки
variable_set('install_task', 'install-myprofile');
// Повертаємось до сторінки установки
drupal_goto($form_state['values']['url']);
}
?>2.8. _config_taxonomy()
Створюємо словник таксономії.
<?php
function myprofile_config_taxonomy() {
$vocab = array(
'name' => st('Test'),
'description' => st('Test vocabulary'),
'multiple' => '1',
'required' => '1',
'hierarchy' => '1',
'relations' => '1',
'tags' => '0',
'module' => 'taxonomy',
);
taxonomy_save_vocabulary($vocab);
db_query("UPDATE {vocabulary} SET vid = %d WHERE name = '%s", MYPROFILE_NEWS_VOCAB_ID, st('Test'));
}
?>2.9. _config_theme()
Включаємо власну тему, тобто вона стане активною після встановлення.
<?php
function myprofile_config_theme() {
// Вимикаємо тему garland
db_query("UPDATE {system} SET status = 0 WHERE type = 'theme' and name = '%s'", 'garland');
// Вмикаємо теми fusion і acquia_prosper
db_query("UPDATE {system} SET status = 1 WHERE type = 'theme' and name = '%s
", MYPROFILE_ACQUIA_THEME);
db_query("UPDATE {system} SET status = 1 WHERE type = 'theme' and name = '%s
", MYPROFILE_FUSION_CORE);
// Ставимо тему acquia_prosper по замовчуванню
variable_set('theme_default', MYPROFILE_ACQUIA_THEME);
// Оновимо реєстр
list_themes(TRUE);
drupal_rebuild_theme_registry();
}
?>2.10. _cleanup()
Прибираємо за собою :)
<?php
function myprofile_cleanup() {
// Перебудовуємо типи контенту
node_types_rebuild();
// Очищаємо кеш
$core = array('cache', 'cache_block', 'cache_filter', 'cache_page');
$cache_tables = array_merge(module_invoke_all('flush_caches'), $core);
foreach ($cache_tables as $table) {
cache_clear_all('*', $table, TRUE);
}
// Очищаємоt JS і CSS кеші
drupal_clear_css_cache();
drupal_clear_js_cache();
// "Фічі" повинні бути повернуті
$revert = array(
'myprofile_features' => array('content', 'menu_links', 'views_default')
);
features_revert($revert);
// Завершуємо інсталяцію
variable_set('install_task', 'profile-finished');
}
?>Створений myprofile.profile потрібно розмістити в папці "myprofile". Кінцева структура файлів:
- myprofile
-
- modules
- contrib
- features
- themes
- myprofile.profile
І останнє, що потрібно зробити, це перенести папку з нашим профілем "myprofile" в дистрибутив Drupal за шляхом drupal-6.х -> profiles.
Примітка: Даний приклад зроблений на основі Drupal Commons, він може послужити прикладом реалізації інсталяційного профіля.
Отже, підсумуємо. Для того, щоб створити свій інсталяційний профіль, нам необхідно створити "упаковку" з необхідними модулями, "фічами" та темою, а також створити файл .profile.


