has('maximum_domains')) { $form_state->set('maximum_domains', 1); } $form['redirects'] = [ '#type' => 'table', '#tree' => TRUE, '#header' => [ $this->t('From domain'), $this->t('Sub path'), $this->t('Destination') ], '#prefix' => '
', '#suffix' => '
', ]; $rows = []; // Obtain domain redirects from configuration. if ($domain_redirects = $this->config('redirect_domain.domains')->get('domain_redirects')) { foreach ($domain_redirects as $key => $value) { foreach ($value as $item) { $form['redirects'][] = [ 'from' => [ '#type' => 'textfield', '#value' => str_replace(':','.',$key), ], 'sub_path' => [ '#type' => 'textfield', '#value' => $item['sub_path'], ], 'destination' => [ '#type' => 'textfield', '#value' => $item['destination'], ], ]; } } } // Fields for the new domain redirects. for ($i = 0; $i < $form_state->get('maximum_domains'); $i++) { $form['redirects'][] = [ 'from' => [ '#type' => 'textfield', ], 'sub_path' => [ '#type' => 'textfield', '#value' => '/', ], 'destination' => [ '#type' => 'textfield', ], ]; } $form['add'] = [ '#type' => 'submit', '#value' => $this->t('Add another'), '#submit' => ['::addAnotherSubmit'], '#ajax' => [ 'callback' => '::ajaxAddAnother', 'wrapper' => 'redirect-domain-wrapper', ], ]; $form['submit'] = [ '#type' => 'submit', '#button_type' => 'primary', '#value' => $this->t('Save'), ]; return $form; } /** * Ajax callback for adding another domain redirect. * * @param array $form * The form structure. * @param \Drupal\Core\Form\FormStateInterface $form_state * The form state. * * @return array * The new domain redirect form part. */ public function ajaxAddAnother(array $form, FormStateInterface $form_state) { return $form['redirects']; } /** * Submit callback for adding a new domain field. */ public function addAnotherSubmit(array $form, FormStateInterface $form_state) { $form_state->set('maximum_domains', $form_state->get('maximum_domains') + 1); $form_state->setRebuild(TRUE); } /** * {@inheritdoc} */ public function validateForm(array &$form, FormStateInterface $form_state) { parent::validateForm($form, $form_state); if ($redirects = $form_state->getValue('redirects')) { foreach ($redirects as $redirect) { if (strpos($redirect['from'], '://') !== FALSE) { $form_state->setErrorByName('redirects', t('No protocol should be included in the redirect domain.')); } } } } /** * {@inheritdoc} */ public function submitForm(array &$form, FormStateInterface $form_state) { $domain_redirects = []; $domain_config = $this->config('redirect_domain.domains'); if ($redirects = $form_state->getValue('redirects')) { foreach ($redirects as $redirect) { if (!empty($redirect['from']) && !empty($redirect['destination'])) { // Replace '.' with ':' for an eligible key. $redirect['from'] = str_replace('.', ':', $redirect['from']); $domain_redirects[$redirect['from']][] = [ 'sub_path' => '/' . ltrim($redirect['sub_path'], '/'), 'destination' => $redirect['destination'] ]; } } } $domain_config->set('domain_redirects', $domain_redirects); $domain_config->save(); drupal_set_message(t('The domain redirects have been saved.')); } }