Конфігурація в Drupal 8

27.10.2015
Конфігурація в Drupal 8
Автор:

<iframe src="https://prezi.com/yr4j3sullvq_/drupal-8/" width="100%"></iframe> <p>Source: <a href="//internetdevels.ua/blog/configuration-in-drupal-8">InternetDevels.com</a></p>

У Drupal 8 зміни не оминули систему для зберігання даних конфігурації. Нова система полегшує імпорт та експорт конфігурації. Конфігурація за замовчуванням постачається з модулями, темами і зберігається у YAML файлах (наприклад: image.settings.yml) , а коли модуль чи тема увімкнені, імпортується у сховище активної конфігурації. За замовчуванням активна конфігурація зберігається у базі даних. У ядро Drupal 8 включено модуль Configuration Manager.

Configuration Manager надає користувальницький інтерфейс для імпорту та експорту змін конфігурації. Configuration Manager дозволяє розгортати конфігурацію з одного середовища в іншому — за умови, що це один сайт. Сайт ідентифікується за допомогою універсального унікального ідентифікатора (UUID). Завдяки цьому модулю відпадає необхідність у таких додаткових модулях, як Features та Strongarm.

У Drupal 7 для перенесення типу контенту та ін. потрібно було завантажувати Features, робити налаштування, а зараз потрібно лише вставити скопійовану конфігурацію — і у вас з’явиться необхідний тип контенту.

Configuration Manager дозволяє:

  • синхронізувати конфігурацію;
  • виконувати одиничний імпорт/експорт;
  • виконувати повний імпорт/експорт.

Внесення змін до конфігурації одразу на живому сайті є не найкращою ідеєю. Мета системи конфігурації в Drupal 8 — дати можливість робити різного роду налаштування на тестовому сайті, а на живий переносити вже готові налаштування.

Сторінка Менеджера конфігурації знаходиться за таким шляхом Manage > Configuration > Development > Configuration management або admin/config/development/configuration.

Для одиничного експорту з тестового на живий сайт необхідно виконати такі дії:

  • обираємо вкладку “Експорт” (1);
  • обираємо тип конфігурації (2);
  • обираємо потрібну конфігурацію (3);
  • копіюємо текст конфігурації (4)

Configuration in Drupal 8

Для одиничного імпорту попередньо експортованої конфігурації необхідно виконати такі дії:

  • обираємо вкладку “Імпорт” (1);
  • обираємо тип конфігурації (2);
  • вставляємо текст конфігурації (3);
  • натискаємо кнопку Import (4).

Configuration in Drupal 8

Для повного експорту конфігурації необхідно обрати вкладку “Full Import/Export”(1), далі вкладку “Export”(2). Потім необхідно лише натиснути на кнопку Export(3). Після цих дій у браузері розпочнеться завантаження архіву з конфігурацією.

Configuration in Drupal 8

Щоб імпортувати щойно завантажену конфігурацію, необхідно виконати такі дії:

  • обираємо вкладку “Full Import/Export”(1)
  • обираємо вкладку “Export”(2)
  • обираємо файл архіву(3) і натискаємо на кнопку Upload(4)

Configuration in Drupal 8

За замовчуванням Drupal 8 зберігає файли конфігурації у папках:

  • 'sites/default/files/config/active'
  • 'sites/default/files/config/staging'

Змінити місце збергання конфігурації можна у файлі settings.php. Для цього необхідно у

$config_directories['active'] = ‘your_path’ та $config_directories['active'] = ‘your_path’ вказати необхідний шлях.

Drupal 8 надає нам потужний API для роботи з конфігурацією через код.

На наступному кроці покажу, як програмно створювати, змінювати та видаляти налаштування.

Зараз розглянемо роботу з конфігурацією на прикладі власного модуля.

В Drupal 7 одним з найпоширеніших способів для збереження налаштувань було використання variable_get() і variable_set(). В Drupal 8 вони були замінені новою системою конфігурації. З Drupal 8 видалено функції variable_get()/variable_set(). Працювати з налаштуваннями потрібно таким чином:

$config = \Drupal::configFactory()->getEditable($key) - отримуємо потрібну конфігурацію.

$configuration->set($key , $value ) - встановлюємо необхідне значення.

$configuration->save() - зберігаємо зміни.

Налаштування модуля за замовчуванням можуть зберігатись у файлі your_module_name.settings.yml, який необхідно розмістити у такій папці:

config/install.

Для встановлення за замовчуванням динамічного значення, яке неможливо записати у файлі your_module_name.settings.yml, потрібно використовувати hook_install(). Наприклад:

<?php
/**
* Implements hook_install().
*/
function idevels_config_example_install() {
// Set default values for config which require dynamic values.
\Drupal::configFactory()->getEditable('idevels_config_example.settings') ->set('some_data2', \Drupal::configFactory()->getEditable('system.site')->get('name'))
->save();
}
?>

Даний код встановлює у якості значення поля some_data2 назву сайту. Давайте розглянемо даний приклад детальніше. З допомогою рядка (7) отримуємо об’єкт із необхідними налаштуваннями, у рядку (8) встановлюємо в поле some_data2 назву сайту і врешті-решт потрібно зберегти наші налаштування.

У Drupal 7 для створення форми налаштувань модуля використовувалась функція system_settings_form(). У Drupal 8 форми з налаштуваннями створюються наступним чином:

 <?php

/**
* @file
* Contains \Drupal\demo\Form\DemoForm.
*/

namespace Drupal\idevels_config_example\Form;

use Drupal\Core\Form\ConfigFormBase;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Config\ConfigFactory;

class TestConfForm extends ConfigFormBase {
public function getFormId() {
return 'example_set_form';
}

/**
* @param array $form
* @param FormStateInterface $form_state
* @return array
*/
public function buildForm(array $form, FormStateInterface $form_state) {
$config = $this->config('idevels_config_example.settings');
$form['custom_field'] = [
'#type' => 'textfield',
'#title' => $this->t('Some text data'),
'#default_value' => $config->get('some_data2'),
];
$form['custom_field2'] = [
'#type' => 'textfield',
'#title' => $this->t('Some text data'),
'#default_value' => $config->get('some_data'),
];

return parent::buildForm($form, $form_state);
}

public function submitForm(array &$form, FormStateInterface $form_state) {
$config = \Drupal::configFactory()->getEditable('idevels_config_example.settings')
->set('some_data2', $form_state->getValue('custom_field'))
->set('some_data', $form_state->getValue('custom_field2'))
->save();

parent::submitForm($form, $form_state);
}

/**
* Gets the configuration names that will be editable.
*
* @return array
* An array of configuration object names that are editable if called in
* conjunction with the trait's config() method.
*/
protected function getEditableConfigNames()
{
return ['idevels_config_example.settings'];
}
}

Варто звернути увагу, що наслідування класу вашої форми потрібно здійснювати від класу ConfigFormBase, а не FormBase, як у звичайних формах.

Ось так виглядає створена форма:

Configuration in Drupal 8

Варто зауважити, що на даний момент у другому полі значенням за замовчуванням є дані із файлу конфігурації idevels_config_example.settings.yml, а у першому — назва сайту, яку отримуємо у hook_install().

Ось так виглядає вміст файлу idevels_config_example.settings.yml:

some_data: 'default data'

Для створення свого типу контенту в модулі потрібно у папці your_module/config/install/ створити необхідні YAML файли. Наприклад, для створення типу контенту “my_content_type”, який буде мати одне поле body, необхідно створити такі файли:

 core.entity_form_display.node.my_content_type.default.yml:
uuid: 0e54b601-1c72-4989-8900-b34fc31c7721
langcode: en
status: true
dependencies:
config:
- field.field.node.my_content_type.body
- node.type.my_content_type
module:
- entity_reference
- path
- text
id: node.my_content_type.default
targetEntityType: node
bundle: my_content_type
mode: default
content:
title:
type: string_textfield
weight: 0
settings:
size: 60
placeholder: ''
third_party_settings: { }
uid:
type: entity_reference_autocomplete
weight: 1
settings:
match_operator: CONTAINS
size: 60
placeholder: ''
third_party_settings: { }
created:
type: datetime_timestamp
weight: 2
settings: { }
third_party_settings: { }
promote:
type: boolean_checkbox
weight: 3
settings:
display_label: true
third_party_settings: { }
sticky:
type: boolean_checkbox
weight: 4
settings:
display_label: true
third_party_settings: { }
path:
type: path
weight: 5
settings: { }
third_party_settings: { }
body:
type: text_textarea_with_summary
weight: 6
settings:
rows: 9
summary_rows: 3
placeholder: ''
third_party_settings: { }
hidden: { }
third_party_settings: { }

 field.field.node.my_content_type.body.yml:
uuid: d0bf6e80-a1e7-4139-b446-70338272f3c9
langcode: en
status: true
dependencies:
config:
- field.storage.node.body
- node.type.my_content_type
module:
- text
id: node.my_content_type.body
field_name: body
entity_type: node
bundle: my_content_type
label: FieldBody
description: ''
required: false
translatable: true
default_value: { }
default_value_callback: ''
settings:
display_summary: true
third_party_settings: { }
field_type: text_with_summary

 node.type.my_content_type.yml:
uuid: f07bfea6-da48-49c9-bb32-500f4ecc1c37
langcode: en
status: true
dependencies: { }
name: 'My Content Type'
type: my_content_type
description: 'custom content type.'
help: ''
new_revision: false
preview_mode: 1
display_submitted: true
third_party_settings: { }

Тепер при встановленні модуля буде створено новий тип контенту, налаштування якого описані у вище поданих файлах. Зміни конфігурації щойно створеного типу контенту можна переносити між сайтами за допомогою модуля Configuration management, робота з яким описана вище.

На мою думку, у Drupal 8 реалізовано дуже зручну систему конфігурації, завдяки якій немає необхідності використовувати сторонні модулі.

3 votes, Рейтинг: 5

Також по темі

1

Ще зовсім недовго лишилося чекати до виходу Drupal 8, але вже зараз є можливість використовувати його бета версію. Отож, давайте разом вивчати Drupal 8.

2

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

3

Бета-версія Drupal 8 вже побачила світ. Зараз команда InternetDevels розробляє перший проект на «вісімці». Працюючи з Drupal 8, ми дізналися багато цікавого і підготували огляд його інновацій.

Subscribe to our blog updates