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.