View source
<?php
namespace Drupal\Core\Installer\Form;
use Drupal\Core\Config\FileStorage;
use Drupal\Core\Form\FormBase;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Site\Settings;
class SelectProfileForm extends FormBase {
const CONFIG_INSTALL_PROFILE_KEY = '::existing_config::';
public function getFormId() {
return 'install_select_profile_form';
}
public function buildForm(array $form, FormStateInterface $form_state, $install_state = NULL) {
$form['#title'] = $this
->t('Select an installation profile');
$profiles = [];
$names = [];
foreach ($install_state['profiles'] as $profile) {
$details = install_profile_info($profile
->getName());
if ($details['hidden'] === TRUE && !drupal_valid_test_ua()) {
continue;
}
$profiles[$profile
->getName()] = $details;
$name = isset($details['name']) ? $details['name'] : $profile
->getName();
$names[$profile
->getName()] = $name;
}
natcasesort($names);
if (isset($names['minimal'])) {
$names = [
'minimal' => $names['minimal'],
] + $names;
}
if (isset($names['standard'])) {
$names = [
'standard' => $names['standard'],
] + $names;
}
$form['profile'] = [
'#type' => 'radios',
'#title' => $this
->t('Select an installation profile'),
'#title_display' => 'invisible',
'#options' => array_map([
$this,
't',
], $names),
'#default_value' => 'standard',
];
foreach (array_keys($names) as $profile_name) {
$form['profile'][$profile_name]['#description'] = isset($profiles[$profile_name]['description']) ? $this
->t($profiles[$profile_name]['description']) : '';
if ($profile_name === 'demo_umami') {
$this
->addUmamiWarning($form);
}
}
$config_sync_directory = Settings::get('config_sync_directory');
if (!empty($config_sync_directory)) {
$sync = new FileStorage($config_sync_directory);
$extensions = $sync
->read('core.extension');
$site = $sync
->read('system.site');
if (isset($site['name']) && isset($extensions['profile']) && in_array($extensions['profile'], array_keys($names), TRUE)) {
module_load_install($extensions['profile']);
if (!function_exists($extensions['profile'] . '_install')) {
$form['profile']['#options'][static::CONFIG_INSTALL_PROFILE_KEY] = $this
->t('Use existing configuration');
$form['profile'][static::CONFIG_INSTALL_PROFILE_KEY]['#description'] = [
'description' => [
'#markup' => $this
->t('Install %name using existing configuration.', [
'%name' => $site['name'],
]),
],
'info' => [
'#type' => 'item',
'#markup' => $this
->t('The configuration from the directory %sync_directory will be used.', [
'%sync_directory' => $config_sync_directory,
]),
'#wrapper_attributes' => [
'class' => [
'messages',
'messages--status',
],
],
'#states' => [
'visible' => [
':input[name="profile"]' => [
'value' => static::CONFIG_INSTALL_PROFILE_KEY,
],
],
],
],
];
}
}
}
$form['actions'] = [
'#type' => 'actions',
];
$form['actions']['submit'] = [
'#type' => 'submit',
'#value' => $this
->t('Save and continue'),
'#button_type' => 'primary',
];
return $form;
}
public function submitForm(array &$form, FormStateInterface $form_state) {
global $install_state;
$profile = $form_state
->getValue('profile');
if ($profile === static::CONFIG_INSTALL_PROFILE_KEY) {
$sync = new FileStorage(Settings::get('config_sync_directory'));
$profile = $sync
->read('core.extension')['profile'];
$install_state['parameters']['existing_config'] = TRUE;
}
$install_state['parameters']['profile'] = $profile;
}
protected function addUmamiWarning(array &$form) {
$description = $form['profile']['demo_umami']['#description'];
$form['profile']['demo_umami']['#description'] = [
'warning' => [
'#type' => 'item',
'#markup' => $this
->t('This profile is intended for demonstration purposes only.'),
'#wrapper_attributes' => [
'class' => [
'messages',
'messages--warning',
],
],
'#states' => [
'visible' => [
':input[name="profile"]' => [
'value' => 'demo_umami',
],
],
],
],
'description' => [
'#markup' => $description,
],
];
}
}