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 - описание, которое будет отображаться под названием профиля.

dependencies - массив названий модулей, которые необходимо включить при инсталяции.

Это позволяет проще указывать необходимые модули, потому что теперь не надо беспокоиться о размещении модулей, как это было  в Drupal 6, когда основные модули должны были быть описаны первыми, а зависимые от них только за ними.

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 =
?>

В данном фрагменте кода описано включение только одного блока. Для включения других блоков, надо в массив $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->ridarray_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. Об этом пойдёт речь в следующей статье.

Тэги:
Drupal 7, install profile