Issue #3258321 by darvanen, AaronMcHale, dww, mstrelan, lauriii, Gábor Hojtsy, benjifisher, hmendes, rkoller, shaal, worldlinemine: Cancel account button on user form triggers server-side validation

(cherry picked from commit 2a21bdae93)
merge-requests/2022/head
catch 2022-03-29 10:35:27 +01:00
parent 4fb5cf2558
commit a38e046f99
3 changed files with 26 additions and 44 deletions

View File

@ -17,13 +17,23 @@ class ProfileForm extends AccountForm {
protected function actions(array $form, FormStateInterface $form_state) {
$element = parent::actions($form, $form_state);
// The user account being edited.
$account = $this->entity;
$element['delete']['#type'] = 'submit';
$element['delete']['#value'] = $this->t('Cancel account');
$element['delete']['#submit'] = ['::editCancelSubmit'];
$element['delete']['#access'] = $account->id() > 1 && $account->access('delete');
if (!$this->entity->isNew() && $this->entity->hasLinkTemplate('cancel-form')) {
$route_info = $this->entity->toUrl('cancel-form');
if ($this->getRequest()->query->has('destination')) {
$query = $route_info->getOption('query');
$query['destination'] = $this->getRequest()->query->get('destination');
$route_info->setOption('query', $query);
}
$element['delete'] = [
'#type' => 'link',
'#title' => $this->t('Cancel account'),
'#access' => $this->entity->id() > 1 && $this->entity->access('delete'),
'#attributes' => [
'class' => ['button', 'button--danger'],
],
];
$element['delete']['#url'] = $route_info;
}
return $element;
}
@ -39,22 +49,4 @@ class ProfileForm extends AccountForm {
$this->messenger()->addStatus($this->t('The changes have been saved.'));
}
/**
* Provides a submit handler for the 'Cancel account' button.
*/
public function editCancelSubmit($form, FormStateInterface $form_state) {
$destination = [];
$query = $this->getRequest()->query;
if ($query->has('destination')) {
$destination = ['destination' => $query->get('destination')];
$query->remove('destination');
}
// We redirect from user/%/edit to user/%/cancel to make the tabs disappear.
$form_state->setRedirect(
'entity.user.cancel_form',
['user' => $this->entity->id()],
['query' => $destination]
);
}
}

View File

@ -142,10 +142,7 @@ class UserCancelTest extends BrowserTestBase {
$node = $this->drupalCreateNode(['uid' => $account->id()]);
// Attempt to cancel account.
$this->drupalGet('user/' . $account->id() . '/edit');
$this->submitForm([], 'Cancel account');
// Confirm account cancellation.
$this->drupalGet('user/' . $account->id() . '/cancel');
$timestamp = time();
$this->submitForm([], 'Confirm');
$this->assertSession()->pageTextContains('A confirmation request to cancel your account has been sent to your email address.');
@ -189,8 +186,7 @@ class UserCancelTest extends BrowserTestBase {
$account = $user_storage->load($web_user->id());
// Attempt to cancel account.
$this->drupalGet('user/' . $account->id() . '/edit');
$this->submitForm([], 'Cancel account');
$this->drupalGet('user/' . $account->id() . '/cancel');
$this->assertSession()->pageTextContains('Are you sure you want to cancel your account?');
$this->assertSession()->pageTextContains('Your account will be blocked and you will no longer be able to log in. All of your content will remain attributed to your username.');
$this->assertSession()->pageTextNotContains('Cancellation method');
@ -249,8 +245,7 @@ class UserCancelTest extends BrowserTestBase {
$comment->save();
// Attempt to cancel account.
$this->drupalGet('user/' . $account->id() . '/edit');
$this->submitForm([], 'Cancel account');
$this->drupalGet('user/' . $account->id() . '/cancel');
$this->assertSession()->pageTextContains('Are you sure you want to cancel your account?');
$this->assertSession()->pageTextContains('Your account will be blocked and you will no longer be able to log in. All of your content will be hidden from everyone but administrators.');
@ -371,8 +366,7 @@ class UserCancelTest extends BrowserTestBase {
$revision_node = $this->drupalCreateNode($settings);
// Attempt to cancel account.
$this->drupalGet('user/' . $account->id() . '/edit');
$this->submitForm([], 'Cancel account');
$this->drupalGet('user/' . $account->id() . '/cancel');
$this->assertSession()->pageTextContains('Are you sure you want to cancel your account?');
$this->assertSession()->pageTextContains("Your account will be removed and all account information deleted. All of your content will be assigned to the {$this->config('user.settings')->get('anonymous')} user.");
@ -435,8 +429,7 @@ class UserCancelTest extends BrowserTestBase {
}
// Attempt to cancel account.
$this->drupalGet('user/' . $account->id() . '/edit');
$this->submitForm([], 'Cancel account');
$this->drupalGet('user/' . $account->id() . '/cancel');
$this->assertSession()->pageTextContains('Are you sure you want to cancel your account?');
$this->assertSession()->pageTextContains("Your account will be removed and all account information deleted. All of your content will be assigned to the {$this->config('user.settings')->get('anonymous')} user.");
@ -508,8 +501,7 @@ class UserCancelTest extends BrowserTestBase {
$revision_node = $this->drupalCreateNode($settings);
// Attempt to cancel account.
$this->drupalGet('user/' . $account->id() . '/edit');
$this->submitForm([], 'Cancel account');
$this->drupalGet('user/' . $account->id() . '/cancel');
$this->assertSession()->pageTextContains('Are you sure you want to cancel your account?');
$this->assertSession()->pageTextContains('Your account will be removed and all account information deleted. All of your content will also be deleted.');
@ -555,8 +547,7 @@ class UserCancelTest extends BrowserTestBase {
$this->drupalLogin($admin_user);
// Delete regular user.
$this->drupalGet('user/' . $account->id() . '/edit');
$this->submitForm([], 'Cancel account');
$this->drupalGet('user/' . $account->id() . '/cancel');
$this->assertSession()->pageTextContains("Are you sure you want to cancel the account {$account->getAccountName()}?");
$this->assertSession()->pageTextContains('Cancellation method');
@ -583,8 +574,7 @@ class UserCancelTest extends BrowserTestBase {
$this->drupalLogin($admin_user);
// Delete regular user without email address.
$this->drupalGet('user/' . $account->id() . '/edit');
$this->submitForm([], 'Cancel account');
$this->drupalGet('user/' . $account->id() . '/cancel');
$this->assertSession()->pageTextContains("Are you sure you want to cancel the account {$account->getAccountName()}?");
$this->assertSession()->pageTextContains('Cancellation method');

View File

@ -109,7 +109,7 @@ class UserTranslationUITest extends ContentTranslationUITestBase {
['language' => $this->container->get('language_manager')->getLanguage('en')]
);
$this->drupalGet($url);
$this->submitForm([], 'Cancel account');
$this->clickLink('Cancel account');
$this->assertSession()->statusCodeEquals(200);
}