View source
<?php
namespace Drupal\config_split\Form;
use Drupal\config_split\Config\StatusOverride;
use Drupal\config_split\ConfigSplitManager;
use Drupal\Core\Access\AccessResult;
use Drupal\Core\Config\StorageComparer;
use Drupal\Core\Config\StorageInterface;
use Drupal\Core\Form\FormBase;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Session\AccountInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
class ConfigSplitActivateForm extends FormBase {
use ConfigImportFormTrait;
protected $activeStorage;
protected $manager;
protected $statusOverride;
public function __construct(StorageInterface $activeStorage, ConfigSplitManager $configSplitManager, StatusOverride $statusOverride) {
$this->activeStorage = $activeStorage;
$this->manager = $configSplitManager;
$this->statusOverride = $statusOverride;
}
public static function create(ContainerInterface $container) {
return new static($container
->get('config.storage'), $container
->get('config_split.manager'), $container
->get('config_split.status_override'));
}
public function getFormId() {
return 'config_split_import_form';
}
public function buildForm(array $form, FormStateInterface $form_state) {
$split = $this
->getSplit();
$comparer = new StorageComparer($this->manager
->singleActivate($split, !$split
->get('status')), $this->activeStorage);
$options = [
'route' => [
'config_split' => $split
->getName(),
'operation' => 'activate',
],
'operation label' => $this
->t('Import all'),
];
$form = $this
->buildFormWithStorageComparer($form, $form_state, $comparer, $options);
if (!$split
->get('status')) {
$locallyDeactivated = $this->statusOverride
->getSplitOverride($split
->getName()) === FALSE;
$form['activate_local_only'] = [
'#type' => 'checkbox',
'#title' => $this
->t('Activate locally only'),
'#description' => $this
->t('If this is set, the split config will not be made active by default but instead it will be locally overwritten to be active.'),
'#default_value' => !$locallyDeactivated,
];
if ($locallyDeactivated) {
$form['deactivation_notice'] = [
'#type' => 'markup',
'#markup' => $this
->t('The local inactivation state override will be removed'),
];
}
}
return $form;
}
public function submitForm(array &$form, FormStateInterface $form_state) {
$split = $this
->getSplit();
$activate = !$split
->get('status');
if ($activate) {
if ($form_state
->getValue('activate_local_only')) {
$this->statusOverride
->setSplitOverride($split
->getName(), TRUE);
$activate = FALSE;
}
else {
$this->statusOverride
->setSplitOverride($split
->getName(), NULL);
}
}
$comparer = new StorageComparer($this->manager
->singleActivate($split, $activate), $this->activeStorage);
$this
->launchImport($comparer);
}
public function access(AccountInterface $account) {
$split = $this
->getSplit();
return AccessResult::allowedIfHasPermission($account, 'administer configuration split')
->andIf(AccessResult::allowedIf(!$split
->get('status')))
->addCacheableDependency($split);
}
}