You are here

class SiteConfigureForm in Configuration installer 8

Updates the user 1 account.

This is based on the install_configure_form provided by core.

Hierarchy

Expanded class hierarchy of SiteConfigureForm

See also

\Drupal\Core\Installer\Form\SiteConfigureForm

File

src/Form/SiteConfigureForm.php, line 20

Namespace

Drupal\config_installer\Form
View source
class SiteConfigureForm extends FormBase {

  /**
   * The user storage.
   *
   * @var \Drupal\user\UserStorageInterface
   */
  protected $userStorage;

  /**
   * The state service.
   *
   * @var \Drupal\Core\State\StateInterface
   */
  protected $state;

  /**
   * The app root.
   *
   * @var string
   */
  protected $root;

  /**
   * The site path.
   *
   * @var string
   */
  protected $sitePath;

  /**
   * The module handler.
   *
   * @var ModuleHandlerInterface
   */
  protected $moduleHandler;

  /**
   * Constructs a new SiteConfigureForm.
   *
   * @param string $root
   *   The app root.
   * @param string $site_path
   *   The site path.
   * @param \Drupal\user\UserStorageInterface $user_storage
   *   The user storage.
   * @param \Drupal\Core\State\StateInterface $state
   *   The state service.
   * @param \Drupal\Core\Extension\ModuleHandlerInterface $module_handler
   *   The module handler.
   */
  public function __construct($root, $site_path, UserStorageInterface $user_storage, StateInterface $state, ModuleHandlerInterface $module_handler) {
    $this->root = $root;
    $this->sitePath = $site_path;
    $this->userStorage = $user_storage;
    $this->state = $state;
    $this->moduleHandler = $module_handler;
  }

  /**
   * {@inheritdoc}
   */
  public static function create(ContainerInterface $container) {
    return new static($container
      ->get('app.root'), $container
      ->get('site.path'), $container
      ->get('entity.manager')
      ->getStorage('user'), $container
      ->get('state'), $container
      ->get('module_handler'));
  }

  /**
   * {@inheritdoc}
   */
  public function getFormId() {
    return 'config_installer_site_configure_form';
  }

  /**
   * {@inheritdoc}
   */
  public function buildForm(array $form, FormStateInterface $form_state) {
    $form['#title'] = $this
      ->t('Configure site');

    // Warn about settings.php permissions risk.
    $settings_file = $this->sitePath . '/settings.php';

    // Check that $_POST is empty so we only show this message when the form is
    // first displayed, not on the next page after it is submitted. We do not
    // want to repeat it multiple times because it is a general warning that is
    // not related to the rest of the installation process; it would also be
    // especially out of place on the last page of the installer, where it would
    // distract from the message that the Drupal installation has completed
    // successfully.
    $post_params = $this
      ->getRequest()->request
      ->all();
    if (empty($post_params)) {
      $original_profile_name = _config_installer_get_original_install_profile();
      $need_to_write_settings = $original_profile_name !== Settings::get('install_profile');

      // In Drupal 8.3.x it is not necessary to have an install profile written
      // to settings.php.
      if (version_compare(\Drupal::VERSION, '8.3', '>=') && !is_writable(\Drupal::service('site.path') . '/settings.php')) {
        \Drupal::service('kernel')
          ->invalidateContainer();
        $need_to_write_settings = FALSE;
      }
      if ($need_to_write_settings) {
        $settings['settings']['install_profile'] = (object) [
          'value' => $original_profile_name,
          'required' => TRUE,
        ];
        drupal_rewrite_settings($settings);
      }
      if (!drupal_verify_install_file($this->root . '/' . $settings_file, FILE_EXIST | FILE_READABLE | FILE_NOT_WRITABLE) || !drupal_verify_install_file($this->root . '/' . $this->sitePath, FILE_NOT_WRITABLE, 'dir')) {
        drupal_set_message(t('All necessary changes to %dir and %file have been made, so you should remove write permissions to them now in order to avoid security risks. If you are unsure how to do so, consult the <a href="@handbook_url">online handbook</a>.', [
          '%dir' => $this->sitePath,
          '%file' => $settings_file,
          '@handbook_url' => 'http://drupal.org/server-permissions',
        ]), 'warning');
      }
    }
    $form['#attached']['library'][] = 'system/drupal.system';
    $form['admin_account'] = [
      '#type' => 'fieldgroup',
      '#title' => $this
        ->t('Site maintenance account'),
    ];
    $form['admin_account']['account']['name'] = [
      '#type' => 'textfield',
      '#title' => $this
        ->t('Username'),
      '#maxlength' => USERNAME_MAX_LENGTH,
      '#description' => $this
        ->t('Spaces are allowed; punctuation is not allowed except for periods, hyphens, and underscores.'),
      '#required' => TRUE,
      '#attributes' => [
        'class' => [
          'username',
        ],
      ],
    ];
    $form['admin_account']['account']['pass'] = [
      '#type' => 'password_confirm',
      '#required' => TRUE,
      '#size' => 25,
    ];
    $form['admin_account']['account']['#tree'] = TRUE;
    $form['admin_account']['account']['mail'] = [
      '#type' => 'email',
      '#title' => $this
        ->t('Email address'),
      '#required' => TRUE,
    ];

    // Check drush context and use default drush options if available.
    if (function_exists('drush_get_option')) {
      $form['admin_account']['account']['name']['#default_value'] = drush_get_option('account-name', 'admin');
      $form['admin_account']['account']['pass']['#type'] = 'textfield';

      // Targets Drush 9 or higher.
      if (class_exists('\\Drush\\Utils\\StringUtils')) {
        $default_password = drush_get_option('account-pass', \Drush\Utils\StringUtils::generatePassword());
      }
      elseif (function_exists('drush_generate_password')) {
        $default_password = drush_get_option('account-pass', drush_generate_password());
      }
      $form['admin_account']['account']['pass']['#default_value'] = $default_password;
      $form['admin_account']['account']['mail']['#default_value'] = drush_get_option('account-mail', 'admin@example.com');
    }
    $form['actions'] = [
      '#type' => 'actions',
    ];
    $form['actions']['submit'] = [
      '#type' => 'submit',
      '#value' => $this
        ->t('Save and continue'),
      '#weight' => 15,
      '#button_type' => 'primary',
    ];
    return $form;
  }

  /**
   * {@inheritdoc}
   */
  public function validateForm(array &$form, FormStateInterface $form_state) {
    if ($error = user_validate_name($form_state
      ->getValue([
      'account',
      'name',
    ]))) {
      $form_state
        ->setErrorByName('account][name', $error);
    }
  }

  /**
   * {@inheritdoc}
   */
  public function submitForm(array &$form, FormStateInterface $form_state) {
    $account_values = $form_state
      ->getValue('account');

    // We precreated user 1 with placeholder values. Let's save the real values.
    $account = $this->userStorage
      ->load(1);
    $account->init = $account->mail = $account_values['mail'];
    $account->roles = $account
      ->getRoles();
    $account
      ->activate();
    $account->timezone = $form_state
      ->getValue('date_default_timezone');
    $account->pass = $account_values['pass'];
    $account->name = $account_values['name'];
    $account
      ->save();

    // Record when this install ran.
    $this->state
      ->set('install_time', $_SERVER['REQUEST_TIME']);
    if (version_compare(\Drupal::VERSION, '8.3', '>=')) {

      // We need to invalidate the container to ensure that the correct profile
      // is used on after installation.
      \Drupal::service('kernel')
        ->invalidateContainer();
    }
  }

}

Members

Namesort descending Modifiers Type Description Overrides
DependencySerializationTrait::$_entityStorages protected property An array of entity type IDs keyed by the property name of their storages.
DependencySerializationTrait::$_serviceIds protected property An array of service IDs keyed by property name used for serialization.
DependencySerializationTrait::__sleep public function 1
DependencySerializationTrait::__wakeup public function 2
FormBase::$configFactory protected property The config factory. 1
FormBase::$requestStack protected property The request stack. 1
FormBase::$routeMatch protected property The route match.
FormBase::config protected function Retrieves a configuration object.
FormBase::configFactory protected function Gets the config factory for this form. 1
FormBase::container private function Returns the service container.
FormBase::currentUser protected function Gets the current user.
FormBase::getRequest protected function Gets the request object.
FormBase::getRouteMatch protected function Gets the route match.
FormBase::logger protected function Gets the logger for a specific channel.
FormBase::redirect protected function Returns a redirect response object for the specified route. Overrides UrlGeneratorTrait::redirect
FormBase::resetConfigFactory public function Resets the configuration factory.
FormBase::setConfigFactory public function Sets the config factory for this form.
FormBase::setRequestStack public function Sets the request stack object to use.
LinkGeneratorTrait::$linkGenerator protected property The link generator. 1
LinkGeneratorTrait::getLinkGenerator Deprecated protected function Returns the link generator.
LinkGeneratorTrait::l Deprecated protected function Renders a link to a route given a route name and its parameters.
LinkGeneratorTrait::setLinkGenerator Deprecated public function Sets the link generator service.
LoggerChannelTrait::$loggerFactory protected property The logger channel factory service.
LoggerChannelTrait::getLogger protected function Gets the logger for a specific channel.
LoggerChannelTrait::setLoggerFactory public function Injects the logger channel factory.
MessengerTrait::$messenger protected property The messenger. 29
MessengerTrait::messenger public function Gets the messenger. 29
MessengerTrait::setMessenger public function Sets the messenger.
RedirectDestinationTrait::$redirectDestination protected property The redirect destination service. 1
RedirectDestinationTrait::getDestinationArray protected function Prepares a 'destination' URL query parameter for use with \Drupal\Core\Url.
RedirectDestinationTrait::getRedirectDestination protected function Returns the redirect destination service.
RedirectDestinationTrait::setRedirectDestination public function Sets the redirect destination service.
SiteConfigureForm::$moduleHandler protected property The module handler.
SiteConfigureForm::$root protected property The app root.
SiteConfigureForm::$sitePath protected property The site path.
SiteConfigureForm::$state protected property The state service.
SiteConfigureForm::$userStorage protected property The user storage.
SiteConfigureForm::buildForm public function Form constructor. Overrides FormInterface::buildForm
SiteConfigureForm::create public static function Instantiates a new instance of this class. Overrides FormBase::create
SiteConfigureForm::getFormId public function Returns a unique string identifying the form. Overrides FormInterface::getFormId
SiteConfigureForm::submitForm public function Form submission handler. Overrides FormInterface::submitForm
SiteConfigureForm::validateForm public function Form validation handler. Overrides FormBase::validateForm
SiteConfigureForm::__construct public function Constructs a new SiteConfigureForm.
StringTranslationTrait::$stringTranslation protected property The string translation service. 1
StringTranslationTrait::formatPlural protected function Formats a string containing a count of items.
StringTranslationTrait::getNumberOfPlurals protected function Returns the number of plurals supported by a given language.
StringTranslationTrait::getStringTranslation protected function Gets the string translation service.
StringTranslationTrait::setStringTranslation public function Sets the string translation service to use. 2
StringTranslationTrait::t protected function Translates a string to the current language or to a given language.
UrlGeneratorTrait::$urlGenerator protected property The url generator.
UrlGeneratorTrait::getUrlGenerator Deprecated protected function Returns the URL generator service.
UrlGeneratorTrait::setUrlGenerator Deprecated public function Sets the URL generator service.
UrlGeneratorTrait::url Deprecated protected function Generates a URL or path for a specific route based on the given parameters.