Drupal 7 Install Profile

02.06.2011
Share on FacebookShare on TwitterShare on GooglePlusShare on Linkedin
Автор:

В предыдущей статье рассказывалось о создании инсталляционных профилей для 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 basic pages 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 vote, Rating: 5
Share on FacebookShare on TwitterShare on GooglePlusShare on Linkedin

Также по теме

1

В Drupal 7 API есть целый раздел, который посвящен темизации сайта. Все без исключения элементы сайта должны пройти...

2

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

3

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

4

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

В этой же статье я хочу рассказать об...

5

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

Need a quote? Let's discuss the project

Are you looking for someone to help you with your Drupal Web Development needs? Let’s get in touch and discuss the requirements of your project. We would love to hear from you.

Join the people who have already subscribed!

Want to be aware of important and interesting things happening? We will inform you about new blog posts on Drupal development, design, QA testing and more, as well news about Drupal events.

No charge. Unsubscribe anytime