Drupal 7 Install Profile

02.06.2011
Drupal 7 Install Profile
Автор:

В попередній статті розповідалось про створення інсталяційних профілів для Drupal 6. У даній статті ми поговоримо про створення інсталяційного профіля при створенні сайтів на Drupal 7, про зміни, які відбулися, та наведемо відповідні приклади.

Структура  профіля наступна:

  • my_profile
  • libraries
  • modules
  • my_profile.info
  • my_profile.install
  • my_profile.profile

Як видно із  структури описаної вище, на відміну від Drupal 6, в Drupal 7 інсталяційний профіль нагадує модуль зі своїми .info та .*install файлами.

Важливо: оскільки інсталяційний профіль тепер став більш схожий на модуль, то папка, в якій він буде знаходитись, обов'язково повинна мати таку ж назву як назва профіля. В даному випадку my_profile.

Поетапно розглянемо створення кожного із файлів інсталяційного профіля.

1. Створення .info.

Даний файл ідентичний .info файлу будь-якого модуля.

Приклад my_profile.info

php
; $Id$ 
name = My Profile 
description = Install My profile. 
version = VERSION 
core = 7.x 
dependencies[] = block 
dependencies[] = color 
dependencies[] = comment 
dependencies[] = contextual 
dependencies[] = dashboard 
dependencies[] = dblog 
dependencies[] = field 
dependencies[] = field_sql_storage 
dependencies[] = field_ui 
dependencies[] = filter 
dependencies[] = image 
dependencies[] = list 
dependencies[] = menu 
dependencies[] = node 
dependencies[] = number 
dependencies[] = options 
dependencies[] = overlay 
dependencies[] = path 
dependencies[] = php 
dependencies[] = rdf 
dependencies[] = search 
dependencies[] = shortcut 
dependencies[] = system 
dependencies[] = taxonomy 
dependencies[] = simpletest 
dependencies[] = text 
dependencies[] = user 
dependencies[] = field_group 
dependencies[] = flag 
dependencies[] = flag_actions 
dependencies[] = rules 
dependencies[] = rules_admin 
dependencies[] = wysiwyg 

files[] = my_profile.profile

Перші 4 рядки не відкривають нам нічого нового.

name - назва профіля, яка буде відображатись у списку доступних інсталяційних профілів. 

description - пояснення, яке буде відображатись під назвою профіля.

Це дозволяє простіше вказувати необхідні модулі, оскільки тепер нема потреби хвилюватись про розміщення модулів, як це було у випадку із Drupal 6, коли основні модулі мали бути описані першими, а залежні від них тільки за ними.

dependencies - масив назв модулів, які потрібно включити при інсталяції. 

files - повна назва файла інсталяційног профіля. В даному випадку my_profile.profile.

2. Створення .profile.

В Drupal 7 цей файл вже не виконує основної функції як це було в Drupal 6. В даному випадку він дає назву сайту My Profile. Але наявність даного файла в інсталяційному профілі є обов'язковою.

php
// $Id$ 

/** 
 * Implements hook_form_alter(). 
 * 
 * Allows the profile to alter the site configuration form.
 */ 
function my_profile_form_install_configure_form_alter(&$form, $form_state) {
  // Set a default name for the dev site. 
  $form['site_information']['site_name']['#default_value'] = t('My Profile'); 
}

3. Створення .install.

При розробці сайтів на Drupal 7 даний файл відіграє основну роль, і саме в ньому будуть описані всі дії, котрі будуть виконуватись при інсталяції, наприклад, створення ролей, типів контенту чи словників таксономії. Весь файл складається із основної функції my_profile_install() та, залежно від вимог, також із додаткових функцій, на відміну від Drupal 6, де всі нижче описані дії виконувались в кількох функціях. 

Отже, розглянемо вміст функції my_profile_install() поетапно.

3.1. Створення форматів вводу.

php
$filtered_html_format = array( 
    'format' => 'filtered_html', 
    'name' => 'Filtered HTML', 
    'weight' => 0, 
    'filters' => array( 
      // URL filter. 
      'filter_url' => array( 
        'weight' => 0, 
        'status' => 1, 
      ), 
      // HTML filter. 
      'filter_html' => array( 
        'weight' => 1, 
        'status' => 1, 
      ), 
      // Line break filter. 
      'filter_autop' => array( 
        'weight' => 2, 
        'status' => 1, 
      ), 
      // HTML corrector filter. 
      'filter_htmlcorrector' => array( 
        'weight' => 10, 
        'status' => 1, 
      ), 
    ), 
  ); 
  $filtered_html_format = (object) $filtered_html_format;
  filter_format_save($filtered_html_format);

Аналогічно стврюється і full html format

3.2. Увімкнення блоків.

 php
$default_theme = variable_get('theme_default', 'bartik');
$admin_theme = 'seven'; 
$values = array( 
  array( 
    'module' => 'system', //модуль, який генерує даний блок 
    'delta' => 'main', 
    'theme' => $default_theme, //тема, в якій буде відображатись блок 
    'status' => 1, //1 - блок включений, 0 - виключений 
    'weight' => 0, 
    'region' => 'content', //регіон, в якому буде відображатись блок 
    'pages' => '', //сторінки, на яких блок не повинен відображатись 
    'cache' => -1, //-1 - не кешувати 
  ), 
); 
$query = db_insert('block')->fields(array('module', 'delta', 'theme', 'status', 'weight', 'region', 'pages', 'cache'));
  foreach ($values as $record) { 
    $query->values($record); 
  } 
  $query->execute();

В даному фрагменті коду описано ввімкнення лише одного блоку. Для ввімкнення інших блоків треба до масиву $values просто дописати потрібні масиви з опціями.

3.3. Створення типів контенту.

 php
$types = array( 
  array( 
    'type' => 'page', 
    'name' => st('Basic page'), 
    'base' => 'node_content', 
    'description' => st("Use <em>basic pages</em> for your static content, such as an 'About us' page."),
    'custom' => 1, 
    'modified' => 1, 
    'locked' => 0, 
  ), 
); 
foreach ($types as $type) { 
  $type = node_type_set_defaults($type); 
  node_type_save($type); 
  node_add_body_field($type); 
}

Також, при потребі, можна вимкнути деякі опції типу контенту, наприклад, відображення на головній чи можливісь коментування

php
variable_set('node_options_page', array('status')); //нода після створення буде тільки опублікована('status') 
variable_set('comment_page', COMMENT_NODE_HIDDEN);//вимкнення можливості коментування 
variable_set('node_submitted_page', FALSE);//вимкнення інформації про автора при перегляді ноди

3.4. Створення словника таксономії

php
$description = st('Tags vocabulary'); 
$vocabulary = (object) array( 
  'name' => 'Tags', 
  'description' => $description, 
  'machine_name' => 'tags', 
  'help' => '', 
); 
taxonomy_vocabulary_save($vocabulary);

При потребі можна створити терміни для попередньо створеного словника.

php
//визначаємо id словника 
$vocabulary_id = db_select('taxonomy_vocabulary', 't') 
  ->condition('t.machine_name','catalog', '=') 
  ->fields('t', array('vid')) 
  ->execute() 
  ->fetchField(); 

$term = new stdClass; 
$term->vid = $vocabulary_id; 
$term->name = 'Tag1'; 
taxonomy_term_save($term);

3.5. Створення полів.

В новому Field API для цього використовуються 2 функції:

field_create_field() - для створення безпосередньо поля,

field_create_instance() - для "приєднання" поля до entity

php
$field = array( 
  'translatable' => 1, //можливість перекладу 
  'settings' => array( 
    'max_length' => 60, //максимальна довжина тексту 
    ), 
  'storage' => array( 
    'type' => 'field_sql_storage', 
    'settings' => array(), 
  ), 
  'field_name' => 'field_weigth', //машинна назва поля 
  'type' => 'text', //тип поля 
  'module' => 'text', //модуль, який визначає обраний тип поля 
  'active' => 1, 
  'locked' => 0, 
  'cardinality' => 1, 
); 
field_create_field($field); //зебереження поля, після чого з'явиться відповідний запис в таблиці field_config

$instance = array( 
  'label' => 'Example', //назва поля, яка буде відображатись користувачу 
  'widget' => array( 
    'weight' => 1, //вага поля 
    'type' => 'text_textfield', //тип виджета 
    'module' => 'text', //модуль, який визначає обраний тип виджета 
    'active' => 1, 
    'settings' => array( 
      'size' => 30 //максимальна довжина тексту 
    ) 
  ), 
  'settings' => array( 
    'text_processing' => 0 
  ), 
  //настройки відображення поля 
  'display' => array( 
    'default' => array( 
      'label' => 'above', 
      'type' => 'text_default', 
      'settings' => array(), 
      'module' => 'text', 
      'weight' => 2, 
    ), 
    'node_teaser' => array( 
      'type' => 'hidden', 
      'label' => 'above', 
      'settings' => array(), 
      'weight' => 0, 
    ), 
    'line_item' => array( 
      'type' => 'hidden', 
      'label' => 'above', 
      'settings' => array(), 
      'weight' => 0, 
    ), 
  ), 
  'required' => 0, //чи заповнення поля є обов'язковим 
  'field_name' => 'field_weigth', //машинна назва поля 
  'entity_type' => 'node', //машинна назва entity, до якого кріпиться поле 
  'bundle' => 'page' //машинна назва bulble, іншими словами де поле буде відображатись, в даному випадку це машинна назва типу контенту
); 
field_create_instance($instance); //збереження instance, після чого в таблиці field_config_instance з'явиться відповідний запис
?>

В даному фрагменті коду описано створення текстового поля

3.6. Збереження налаштувань текстового редактора

php
$format = 'full_html'; 
$editor = 'tinymce'; 
$settings = array( 
  'default' => 1, 
  'user_choose' => 0, 
  'show_toggle' => 1, 
  'theme' => 'advanced', 
  'language' => 'en', 
  'buttons' => array( 
    'default' => array( 
      'bold' => 1, 
      'italic' => 1, 
      'underline' => 1, 
      'justifyleft' => 1, 
      'justifycenter' => 1, 
      'justifyright' => 1, 
      'justifyfull' => 1, 
      'bullist' => 1, 
      'numlist' => 1, 
      'outdent' => 1, 
      'indent' => 1, 
      'link' => 1, 
      'unlink' => 1, 
      'anchor' => 1, 
      'image' => 1, 
      'cleanup' => 1, 
      'forecolor' => 1, 
      'backcolor' => 1, 
      'blockquote' => 1, 
      'cut' => 1, 
      'copy' => 1, 
      'paste' => 1, 
      'removeformat' => 1, 
    ), 
    'directionality' => array( 
      'ltr' => 1, 
      'rtl' => 1, 
    ), 
    'font' => array( 
      'fontselect' => 1, 
      'fontsizeselect' => 1, 
      'styleselect' => 1, 
    ), 
    'insertdatetime' => array( 
      'insertdate' => 1, 
      'inserttime' => 1, 
    ), 
    'paste' => array( 
      'pastetext' => 1, 
      'pasteword' => 1, 
    ), 
    'searchreplace' => array( 
      'search' => 1, 
    ), 
    'table' => array( 
      'tablecontrols' => 1, 
    ), 
    'drupal' => array( 
      'break' => 1, 
    ), 
  ), 
  'toolbar_loc' => 'top', 
  'toolbar_align' => 'left', 
  'path_loc' => 'bottom', 
  'resizing' => 1, 
  'verify_html' => 1, 
  'preformatted' => 0, 
  'convert_fonts_to_spans' => 1, 
  'remove_linebreaks' => 1, 
  'apply_source_formatting' => 0, 
  'paste_auto_cleanup_on_paste' => 0, 
  'block_formats' => 'p,address,pre,h2,h3,h4,h5,h6,div',
  'css_setting' => 'theme', 
  'css_path' => '', 
  'css_classes' => '', 
); 
db_insert('wysiwyg') 
  ->fields( 
    array( 
      'format' => $format, 
      'editor' => $editor, 
      'settings' => serialize($settings), 
    ) 
  ) 
  ->execute();

Аналогічно зберігаються налаштування для будь-якого із форматів вводу.

3.7. Налаштування прав доступу.

php
$filtered_html_permission = filter_permission_name($filtered_html_format);
user_role_grant_permissions(DRUPAL_ANONYMOUS_RID, array('access content', 'access comments', $filtered_html_permission));
user_role_grant_permissions(DRUPAL_AUTHENTICATED_RID, array('access content', 'access comments', 'post comments', 'skip comment approval', $filtered_html_permission));

3.8. Створення ролей.

В даному фрагменті коду реалізовано створення ролі адміністратора.

php
//створення ролі 
$admin_role = new stdClass(); 
$admin_role->name = 'administrator'; 
$admin_role->weight = 2; 
user_role_save($admin_role); //збереження 
user_role_grant_permissions($admin_role->rid, array_keys(module_invoke_all('permission'))); //"приєднання" всіх прав доступу адміністратору
variable_set('user_admin_role', $admin_role->rid); //вказуємо, що права адміністратора будуть у ролі administrator

db_insert('users_roles') 
  ->fields(array('uid' => 1, 'rid' => $admin_role->rid))
  ->execute();

3.9. Налаштування теми.

php
db_update('system') 
  ->fields(array('status' => 1)) 
  ->condition('type', 'theme') 
  ->condition('name', 'seven') 
  ->execute(); 
variable_set('admin_theme', 'seven'); //встановлюємо темою адміністратора seven 
variable_set('node_admin_theme', '1'); // включення теми

4. Підготовка файлів.

Всі вказані в .info файлі модулі повинні бути присутні в папці профіля в папці modules. Також, для модуля текстового редактора, в папці libraries, протрібно розмістити папку з редактором.

Крім того, може виникнути необхідність у створенні rules, field group або flags. 

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

Також по темі

1

В Drupal 7 API є цілий розділ, присвячений темізації сайту. Всі елементи сайту без виключення повинні пройти процес темізації. 

2

При розробці часом виникає необхідність виконати такі дії/команди, для яких недостатньо прав чи відсутній доступ до певних директорій у користувача з під якого запущений на сервері та виконується...

3

Однією з вагомих переваг Drupal 7 щодо його попередників є його гнучкість до налаштувань і систем. Розробники не обійшли стороною і запити до БД. В цьому релізі вони стали об'єктивно-орієнтованими...

4

В кінці квітня цього року в своєму офіціальному блозі представники Google Analytics оголосили про запуск бета-тестування нового інтерфейсу. А в цій статті я хочу розповісти про використання...

5

Стаття для тих, в кого виникає необхідність відобразити прикріплений PDF документ на сторінці перегляду вмісту. Реалізується це доволі просто...

Subscribe to our blog updates