Chris@0: tempStoreFactory = $temp_store_factory; Chris@0: $this->userStorage = $user_storage; Chris@0: $this->entityManager = $entity_manager; Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public static function create(ContainerInterface $container) { Chris@0: return new static( Chris@14: $container->get('tempstore.private'), Chris@0: $container->get('entity.manager')->getStorage('user'), Chris@0: $container->get('entity.manager') Chris@0: ); Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function getFormId() { Chris@0: return 'user_multiple_cancel_confirm'; Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function getQuestion() { Chris@0: return $this->t('Are you sure you want to cancel these user accounts?'); Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function getCancelUrl() { Chris@0: return new Url('entity.user.collection'); Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function getConfirmText() { Chris@0: return $this->t('Cancel accounts'); Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function buildForm(array $form, FormStateInterface $form_state) { Chris@0: // Retrieve the accounts to be canceled from the temp store. Chris@0: /* @var \Drupal\user\Entity\User[] $accounts */ Chris@0: $accounts = $this->tempStoreFactory Chris@0: ->get('user_user_operations_cancel') Chris@0: ->get($this->currentUser()->id()); Chris@0: if (!$accounts) { Chris@0: return $this->redirect('entity.user.collection'); Chris@0: } Chris@0: Chris@0: $root = NULL; Chris@0: $names = []; Chris@0: $form['accounts'] = ['#tree' => TRUE]; Chris@0: foreach ($accounts as $account) { Chris@0: $uid = $account->id(); Chris@0: $names[$uid] = $account->label(); Chris@0: // Prevent user 1 from being canceled. Chris@0: if ($uid <= 1) { Chris@0: $root = intval($uid) === 1 ? $account : $root; Chris@0: continue; Chris@0: } Chris@0: $form['accounts'][$uid] = [ Chris@0: '#type' => 'hidden', Chris@0: '#value' => $uid, Chris@0: ]; Chris@0: } Chris@0: Chris@0: $form['account']['names'] = [ Chris@0: '#theme' => 'item_list', Chris@0: '#items' => $names, Chris@0: ]; Chris@0: Chris@0: // Output a notice that user 1 cannot be canceled. Chris@0: if (isset($root)) { Chris@0: $redirect = (count($accounts) == 1); Chris@0: $message = $this->t('The user account %name cannot be canceled.', ['%name' => $root->label()]); Chris@17: $this->messenger()->addMessage($message, $redirect ? MessengerInterface::TYPE_ERROR : MessengerInterface::TYPE_WARNING); Chris@0: // If only user 1 was selected, redirect to the overview. Chris@0: if ($redirect) { Chris@0: return $this->redirect('entity.user.collection'); Chris@0: } Chris@0: } Chris@0: Chris@0: $form['operation'] = ['#type' => 'hidden', '#value' => 'cancel']; Chris@0: Chris@18: // Display account cancellation method selection, if allowed. Chris@18: $user = $this->currentUser(); Chris@18: $selectCancel = $user->hasPermission('administer users') || $user->hasPermission('select account cancellation method'); Chris@18: Chris@0: $form['user_cancel_method'] = [ Chris@0: '#type' => 'radios', Chris@0: '#title' => $this->t('When cancelling these accounts'), Chris@18: '#access' => $selectCancel, Chris@0: ]; Chris@0: Chris@0: $form['user_cancel_method'] += user_cancel_methods(); Chris@0: Chris@18: if (!$selectCancel) { Chris@18: // Display an item to inform the user of the setting. Chris@18: $default_method = $form['user_cancel_method']['#default_value']; Chris@18: $form['user_cancel_method_show'] = [ Chris@18: '#type' => 'item', Chris@18: '#title' => $this->t('When cancelling these accounts'), Chris@18: '#plain_text' => $form['user_cancel_method']['#options'][$default_method], Chris@18: ]; Chris@18: } Chris@18: Chris@0: // Allow to send the account cancellation confirmation mail. Chris@0: $form['user_cancel_confirm'] = [ Chris@0: '#type' => 'checkbox', Chris@0: '#title' => $this->t('Require email confirmation to cancel account'), Chris@0: '#default_value' => FALSE, Chris@0: '#description' => $this->t('When enabled, the user must confirm the account cancellation via email.'), Chris@0: ]; Chris@0: // Also allow to send account canceled notification mail, if enabled. Chris@0: $form['user_cancel_notify'] = [ Chris@0: '#type' => 'checkbox', Chris@0: '#title' => $this->t('Notify user when account is canceled'), Chris@0: '#default_value' => FALSE, Chris@0: '#access' => $this->config('user.settings')->get('notify.status_canceled'), Chris@0: '#description' => $this->t('When enabled, the user will receive an email notification after the account has been canceled.'), Chris@0: ]; Chris@0: Chris@0: $form = parent::buildForm($form, $form_state); Chris@0: Chris@0: return $form; Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function submitForm(array &$form, FormStateInterface $form_state) { Chris@0: $current_user_id = $this->currentUser()->id(); Chris@0: Chris@0: // Clear out the accounts from the temp store. Chris@0: $this->tempStoreFactory->get('user_user_operations_cancel')->delete($current_user_id); Chris@0: if ($form_state->getValue('confirm')) { Chris@0: foreach ($form_state->getValue('accounts') as $uid => $value) { Chris@0: // Prevent programmatic form submissions from cancelling user 1. Chris@0: if ($uid <= 1) { Chris@0: continue; Chris@0: } Chris@0: // Prevent user administrators from deleting themselves without confirmation. Chris@0: if ($uid == $current_user_id) { Chris@0: $admin_form_mock = []; Chris@0: $admin_form_state = $form_state; Chris@0: $admin_form_state->unsetValue('user_cancel_confirm'); Chris@0: // The $user global is not a complete user entity, so load the full Chris@0: // entity. Chris@0: $account = $this->userStorage->load($uid); Chris@0: $admin_form = $this->entityManager->getFormObject('user', 'cancel'); Chris@0: $admin_form->setEntity($account); Chris@0: // Calling this directly required to init form object with $account. Chris@0: $admin_form->buildForm($admin_form_mock, $admin_form_state); Chris@0: $admin_form->submitForm($admin_form_mock, $admin_form_state); Chris@0: } Chris@0: else { Chris@0: user_cancel($form_state->getValues(), $uid, $form_state->getValue('user_cancel_method')); Chris@0: } Chris@0: } Chris@0: } Chris@0: $form_state->setRedirect('entity.user.collection'); Chris@0: } Chris@0: Chris@0: }