Drupal Install Profile

Версія Друпала:
6.x

Напевно всі стикались з готовими збірками сайтів на 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_IDst('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('*'$tableTRUE);
  }
  
  
// Очищаємо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. 

Теги:
drupal, features, install profile