diff --git a/core/modules/user/lib/Drupal/user/Access/RoleDeleteAccessCheck.php b/core/modules/user/lib/Drupal/user/Access/RoleDeleteAccessCheck.php new file mode 100644 index 0000000..1efc872 --- /dev/null +++ b/core/modules/user/lib/Drupal/user/Access/RoleDeleteAccessCheck.php @@ -0,0 +1,35 @@ +getRequirements()); + } + + /** + * Implements AccessCheckInterface::access(). + */ + public function access(Route $route, Request $request) { + if ($user_role = $request->attributes->get('user_role')) { + return $user_role->access('delete'); + } + return FALSE; + } +} diff --git a/core/modules/user/lib/Drupal/user/Form/UserRoleDelete.php b/core/modules/user/lib/Drupal/user/Form/UserRoleDelete.php new file mode 100644 index 0000000..969d89f --- /dev/null +++ b/core/modules/user/lib/Drupal/user/Form/UserRoleDelete.php @@ -0,0 +1,71 @@ + $this->user_role->label())); + } + + /** + * Implements \Drupal\Core\Form\ConfirmFormBase::getCancelPath(). + */ + protected function getCancelPath() { + return 'admin/people/roles'; + } + + /** + * Implements \Drupal\Core\Form\ConfirmFormBase::getConfirmText(). + */ + protected function getConfirmText() { + return t('Delete'); + } + + /** + * Implements \Drupal\Core\Form\FormInterface::buildForm(). + */ + public function buildForm(array $form, array &$form_state, Role $user_role = NULL) { + $this->user_role = $user_role; + return parent::buildForm($form, $form_state); + } + + /** + * Implements \Drupal\Core\Form\FormInterface::submitForm(). + */ + public function submitForm(array &$form, array &$form_state) { + $this->user_role->delete(); + watchdog('user', 'The role %name has been deleted.', array('%name' => $this->user_role->label())); + drupal_set_message(t('The role %name has been deleted.', array('%name' => $this->user_role->label()))); + $form_state['redirect'] = 'admin/people/roles'; + } + +} diff --git a/core/modules/user/lib/Drupal/user/Plugin/Core/Entity/Role.php b/core/modules/user/lib/Drupal/user/Plugin/Core/Entity/Role.php index f64955c..20c41df 100644 --- a/core/modules/user/lib/Drupal/user/Plugin/Core/Entity/Role.php +++ b/core/modules/user/lib/Drupal/user/Plugin/Core/Entity/Role.php @@ -19,6 +19,7 @@ * label = @Translation("Role"), * module = "user", * controller_class = "Drupal\user\RoleStorageController", + * access_controller_class = "Drupal\user\RoleAccessController", * config_prefix = "user.role", * entity_keys = { * "id" = "id", diff --git a/core/modules/user/lib/Drupal/user/RoleAccessController.php b/core/modules/user/lib/Drupal/user/RoleAccessController.php new file mode 100644 index 0000000..b09fe6c --- /dev/null +++ b/core/modules/user/lib/Drupal/user/RoleAccessController.php @@ -0,0 +1,32 @@ +id() == DRUPAL_ANONYMOUS_RID || $entity->id() == DRUPAL_AUTHENTICATED_RID) { + return FALSE; + } + + return user_access('administer permissions'); + } + +} diff --git a/core/modules/user/lib/Drupal/user/UserBundle.php b/core/modules/user/lib/Drupal/user/UserBundle.php index f7c4a88..c390771 100644 --- a/core/modules/user/lib/Drupal/user/UserBundle.php +++ b/core/modules/user/lib/Drupal/user/UserBundle.php @@ -24,6 +24,9 @@ public function build(ContainerBuilder $container) { ->addTag('access_check'); $container->register('access_check.user.register', 'Drupal\user\Access\RegisterAccessCheck') ->addTag('access_check'); + $container->register('access_check.role.delete', 'Drupal\user\Access\RoleDeleteAccessCheck') + ->addTag('access_check'); + $container ->register('user.data', 'Drupal\user\UserData') ->addArgument(new Reference('database')); diff --git a/core/modules/user/user.admin.inc b/core/modules/user/user.admin.inc index c3931d8..a4da046 100644 --- a/core/modules/user/user.admin.inc +++ b/core/modules/user/user.admin.inc @@ -1046,23 +1046,3 @@ function user_admin_role_submit($form, &$form_state) { function user_admin_role_delete_submit($form, &$form_state) { $form_state['redirect'] = 'admin/people/roles/delete/' . $form_state['values']['role']['id']; } - -/** - * Form to confirm role delete operation. - */ -function user_admin_role_delete_confirm($form, &$form_state, $role) { - $form['id'] = array( - '#type' => 'value', - '#value' => $role->id(), - ); - return confirm_form($form, t('Are you sure you want to delete the role %name ?', array('%name' => $role->label())), 'admin/people/roles', t('This action cannot be undone.'), t('Delete')); -} - -/** - * Form submit handler for user_admin_role_delete_confirm(). - */ -function user_admin_role_delete_confirm_submit($form, &$form_state) { - entity_delete_multiple('user_role', array($form_state['values']['id'])); - drupal_set_message(t('The role has been deleted.')); - $form_state['redirect'] = 'admin/people/roles'; -} diff --git a/core/modules/user/user.module b/core/modules/user/user.module index bdf5862..21891ec 100644 --- a/core/modules/user/user.module +++ b/core/modules/user/user.module @@ -974,11 +974,12 @@ function user_menu() { ); $items['admin/people/roles/delete/%user_role'] = array( 'title' => 'Delete role', - 'page callback' => 'drupal_get_form', - 'page arguments' => array('user_admin_role_delete_confirm', 4), - 'access callback' => 'user_role_delete_access', - 'access arguments' => array(4), - 'file' => 'user.admin.inc', +// 'page callback' => 'drupal_get_form', +// 'page arguments' => array('user_admin_role_delete_confirm', 4), +// 'access callback' => 'user_role_delete_access', +// 'access arguments' => array(4), +// 'file' => 'user.admin.inc', + 'route_name' => 'user_role_delete', ); $items['admin/people/create'] = array( @@ -1856,18 +1857,6 @@ function user_role_load($rid) { } /** - * Menu access callback for user role deletion. - */ -function user_role_delete_access($role) { - // Prevent the system-defined roles from being removed. - if ($role->id() == DRUPAL_ANONYMOUS_RID || $role->id() == DRUPAL_AUTHENTICATED_RID) { - return FALSE; - } - - return user_access('administer permissions'); -} - -/** * Determine the modules that permissions belong to. * * @return diff --git a/core/modules/user/user.routing.yml b/core/modules/user/user.routing.yml index 34b6059..e4a087b 100644 --- a/core/modules/user/user.routing.yml +++ b/core/modules/user/user.routing.yml @@ -18,3 +18,11 @@ user_autocomplete_anonymous: _controller: '\Drupal\user\UserAutocompleteController::autocompleteUserAnonymous' requirements: _permission: 'access user profiles' + +user_role_delete: + pattern: '/admin/people/roles/delete/{user_role}' + defaults: + _form: '\Drupal\user\Form\UserRoleDelete' + requirements: + _access_role_delete: 'TRUE' + _permission: 'administer permissions'