Drupal Install Profile

08.03.2011
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(). В цій функції описуються модулі, які після установки повинні бути ввімкнені.

// $Id$

// indicate dictionary taxonomy id
define('MYPROFILE_NEWS_VOCAB_ID', 1);

// indicate topic title
define('MYPROFILE_ACQUIA_THEME', 'acquia_prosper');
define('MYPROFILE_FUSION_CORE', 'fusion_core');


/**
 * Returns array of modules which will be turned on after profile installation
 */
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()

Пояснення профіля, яке буде виведене на екрані установки профіля.

/** @return
 * array with keys "name" and "description", describing the given profile,
 * and additional "language", to redefine language for a profile
 */
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()

Список задач, які будуть виконуватись при установці профіля.

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)

Дана функція відповідає безпосередньо за етап встановлення профіля.

/**
 * .
 */It executes the final tasks of profile installation.
function myprofile_profile_tasks(&$task, $url) {
  // skipping the standard installation stage.
  if ($task == 'profile') {
    $task = 'install-myprofile';  
  }

  // It returns features form
  if ($task == 'configure-myprofile') {
    $output = drupal_get_form('myprofile_features_form', $url);
  }

  // installation batch process
  if ($task == 'install-myprofile') {
    $operations = array();

    // pre-installation operations
    $operations[] = array('myprofile_config_taxonomy', array());
 // creating taxonomy dictionary


    // “features” installation
    $features = variable_get('myprofile_selected_features', array());
    foreach ($features as $feature) {
      $operations[] = array('features_install_modules', array(array($feature)));
    }

    // post-installation operations
    $operations[] = array('myprofile_config_theme', array()); // 
turning on the personal theme
    $operations['finished'] = 'myprofile_configure_batch_finished';

    // building batch process
    $batch = array(
      'operations' => $operations,
      'title' => st('Configuring My profile'),
      'error_message' => st('An error occurred. Please try reinstalling again.'),
      'finished' => 'myprofile_cleanup',
    );

    // building batch process
    variable_set('install_task', 'install-myprofile-batch');
    batch_set($batch);
    batch_process($url, $url);
  }

  // It shows batch execution page
  if ($task == 'install-myprofile-batch') {
    include_once 'includes/batch.inc';
    $output = _batch_page();
  }

  return $output;
}

2.6. _features_form()

Форма вибору створених "фіч", для переносу їх функціоналу на сайт.

function myprofile_features_form($form_state, $url) {
  $form = array();
  drupal_set_title(st('Choose from available features'));

  // Ancillary message
  $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'),
  );

  // Returns to installation without its abort.
  $form['url'] = array(
    '#type' => 'value',
    '#value' => $url,
  );

  $form['submit'] = array(
    '#type' => 'submit',
    '#value' => st('Continue'),
  );

  return $form;
}

2.7. _features_form_submit()

Ця функція формує масив обраних "фіч".

function myprofile_features_form_submit(&$form, &$form_state) {
  // chosen features batch
  $features = array();
  foreach ($form_state['values'] as $key => $value) {
    $features[] = $key;
  }

  // forming temporary variable with chosen features.
  variable_set('myprofile_selected_features', $features);

  // initiating the next step of installation
  variable_set('install_task', 'install-myprofile');

  // returning to the installation page
  drupal_goto($form_state['values']['url']);
}

2.8. _config_taxonomy()

Створюємо словник таксономії.

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()

Включаємо власну тему, тобто вона стане активною після встановлення.

function myprofile_config_theme() {
  // turning off garland theme
  db_query("UPDATE {system} SET status = 0 WHERE type = 'theme' and name = '%s'", 'garland');

  // turning on fusion and acquia_prosper themes
  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);

  // setting acquia_prosper theme by default
  variable_set('theme_default', MYPROFILE_ACQUIA_THEME);

  // rebuilding registry
  list_themes(TRUE);
  drupal_rebuild_theme_registry();
}

2.10. _cleanup()

Прибираємо за собою :)

function myprofile_cleanup() {
  // rebuilding types of content
  node_types_rebuild();

  // filtering cache
  $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);
  }

  // clearing JC and CSS caches
  drupal_clear_css_cache();
  drupal_clear_js_cache();

  // features should be returned
  $revert = array(
    'myprofile_features' => array('content', 'menu_links', 'views_default')
  );
  features_revert($revert);  

  // completing installation
  variable_set('install_task', 'profile-finished');
}

Створений myprofile.profile потрібно розмістити в папці "myprofile". Кінцева структура файлів:

    myprofile
    • modules
    • contrib
    • features
  • themes
  • myprofile.profile

І останнє, що потрібно зробити, це перенести папку з нашим профілем "myprofile" в дистрибутив Drupal за шляхом drupal-6.х -> profiles.

Примітка: Даний приклад зроблений на основі Drupal Commons, він може послужити прикладом реалізації інсталяційного профіля.

Отже, підсумуємо. Для того, щоб створити свій інсталяційний профіль, нам необхідно створити "упаковку" з необхідними модулями, "фічами" та темою, а також створити файл .profile.

Голосів: 1 Рейтинг: 5

Також по темі

1

Профілювання - це процес аналізу роботи додатку для збору інформації про продуктивність (збір набору характеристик - час, використання оперативної пам'яті і ресурсів процесора, кількість викликів...

2

Дуже багато раз мене питали як у випадаючому списку фільтра модуля views перекласти елемент "Any".

Так! Стандартно, перекладом інтерфейсу, це не зробити.

3

Що таке CDN? Кому і нащо потрібно використовувати CDN? Все це описується в нашому блог-пості....

4

Скрипт cron.php використовується в Друпалі для індексації контенту, відправки листів підписникам, збору rss-фідів, видалення старої статистики і т.п. Детальніше про скрипт читайте у нашому блозі...

5

По перше, що таке Apache Solr?

Apache Solr - це розширювана пошукова платформа з відкритим вихідним кодом для проекту Apache Lucene.

Subscribe to our blog updates