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.