From 0db3421184d20799a0838671ae7ff5e1a64f41d9 Mon Sep 17 00:00:00 2001 From: Jochem Date: Mon, 9 Jan 2017 15:28:45 +0100 Subject: [PATCH 1/3] #2842079 by jochemvn: Move visibility settings to opensocial settings --- .../entity_access_by_field.links.menu.yml | 2 +- .../entity_access_by_field/entity_access_by_field.routing.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/custom/entity_access_by_field/entity_access_by_field.links.menu.yml b/modules/custom/entity_access_by_field/entity_access_by_field.links.menu.yml index c13baa93b59..5e70a089c12 100644 --- a/modules/custom/entity_access_by_field/entity_access_by_field.links.menu.yml +++ b/modules/custom/entity_access_by_field/entity_access_by_field.links.menu.yml @@ -1,6 +1,6 @@ entity_access_by_field.settings: title: 'Visibility settings' - parent: system.admin_structure + parent: social_core.admin.config.social description: 'Set who can post public items on this platform.' route_name: entity_access_by_field.settings weight: 10 diff --git a/modules/custom/entity_access_by_field/entity_access_by_field.routing.yml b/modules/custom/entity_access_by_field/entity_access_by_field.routing.yml index 4c0a03b85a9..ffa64cb2a1b 100644 --- a/modules/custom/entity_access_by_field/entity_access_by_field.routing.yml +++ b/modules/custom/entity_access_by_field/entity_access_by_field.routing.yml @@ -1,5 +1,5 @@ entity_access_by_field.settings: - path: '/admin/structure/visibility' + path: '/admin/config/opensocial/visibility' defaults: _form: '\Drupal\entity_access_by_field\Form\EntityVisibilityForm' _title: 'Visibility settings' From 661245460095d51959b1120eca8558ac64c7586e Mon Sep 17 00:00:00 2001 From: Jochem Date: Tue, 10 Jan 2017 08:49:28 +0100 Subject: [PATCH 2/3] #2842079 by jochemvn: Create permission to override disabled public visibility --- .../entity_access_by_field.install | 72 +++++++++++++++++++ .../entity_access_by_field.permissions.yml | 2 + 2 files changed, 74 insertions(+) create mode 100644 modules/custom/entity_access_by_field/entity_access_by_field.install diff --git a/modules/custom/entity_access_by_field/entity_access_by_field.install b/modules/custom/entity_access_by_field/entity_access_by_field.install new file mode 100644 index 00000000000..0e04450b52e --- /dev/null +++ b/modules/custom/entity_access_by_field/entity_access_by_field.install @@ -0,0 +1,72 @@ +id() === 'administrator') { + continue; + } + + $permissions = _entity_access_by_field_get_permissions($role->id()); + user_role_grant_permissions($role->id(), $permissions); + } +} + +/** + * @param $role + * @return array + */ +function _entity_access_by_field_get_permissions($role) { + // Anonymous. + $permissions['anonymous'] = array( + + ); + + // Authenticated. + $permissions['authenticated'] = array_merge($permissions['anonymous'], array( + + )); + + + // Content manager. + $permissions['contentmanager'] = array_merge($permissions['authenticated'], array( + 'override disabled public visibility', + )); + + // Site manager. + $permissions['sitemanager'] = array_merge($permissions['contentmanager'], array( + + )); + + return $permissions[$role]; +} diff --git a/modules/custom/entity_access_by_field/entity_access_by_field.permissions.yml b/modules/custom/entity_access_by_field/entity_access_by_field.permissions.yml index 932ec79dbef..4c9ed6a2507 100644 --- a/modules/custom/entity_access_by_field/entity_access_by_field.permissions.yml +++ b/modules/custom/entity_access_by_field/entity_access_by_field.permissions.yml @@ -2,3 +2,5 @@ permission_callbacks: - \Drupal\entity_access_by_field\EntityAccessByFieldPermissions::permissions administer visibility settings: title: 'Administer visiblility settings' +override disabled public visibility: + title: 'Override disabled public visiblility settings' From e6f56b145abc157e726aec0624bfde2285a86d7c Mon Sep 17 00:00:00 2001 From: Jochem Date: Tue, 10 Jan 2017 08:49:52 +0100 Subject: [PATCH 3/3] Make sure people with the permission can always set public visibility --- .../entity_access_by_field.module | 69 ++++++++----------- 1 file changed, 29 insertions(+), 40 deletions(-) diff --git a/modules/custom/entity_access_by_field/entity_access_by_field.module b/modules/custom/entity_access_by_field/entity_access_by_field.module index 21f0c3f3337..9df7941787e 100644 --- a/modules/custom/entity_access_by_field/entity_access_by_field.module +++ b/modules/custom/entity_access_by_field/entity_access_by_field.module @@ -160,54 +160,43 @@ function entity_access_by_field_form_alter(&$form, \Drupal\Core\Form\FormStateIn if (isset($form['field_content_visibility']) || isset($form['field_visibility'])) { - // Load the current user. - $account = \Drupal::currentUser(); - $roles = $account->getRoles(); // Fetch the data. $config = \Drupal::config('entity_access_by_field.settings'); $data = $config->getRawData(); - // Check if it's an existing node. - $nid = \Drupal::routeMatch()->getRawParameter('node'); - - // Edit node, so look at the node owner. - /** @var \Drupal\node\Entity\Node $node */ - if (!empty($nid) && $node = Node::load($nid)) { - // Overwrite user. - $account = $node->getOwner(); - $roles = $account->getRoles(); - } + // Load the current user. + $account = \Drupal::currentUser(); - // Check if this user is auth user only. - if (count($roles) == 1 && $roles[0] === \Drupal\user\RoleInterface::AUTHENTICATED_ID) { - - // Check if we need to do someting here. - if (isset($data['disable_public_visibility']) && $data['disable_public_visibility'] === 1) { - // This is for nodes. - if (isset($form['field_content_visibility'])) { - $widget = &$form['field_content_visibility']['widget']; - $options = &$form['field_content_visibility']['widget']['#options']; - - // Remove the public option. - unset($options['public']); - // Check if the public options is currently selected. - if ($widget['#default_value'] === 'public') { - $widget['#default_value'] = 'community'; - } + // Check if the option is enabled and the current user has no permission + // to override disabled public visibility. + if (isset($data['disable_public_visibility']) && $data['disable_public_visibility'] === 1 && !$account->hasPermission('override disabled public visibility')) { + + // This is for nodes. + if (isset($form['field_content_visibility'])) { + // Some vars for easier reading. + $field = &$form['field_content_visibility']; + $widget = &$form['field_content_visibility']['widget']; + $options = &$form['field_content_visibility']['widget']['#options']; + + // Remove the public option. + unset($options['public']); + // Check if the public options is currently selected. + if ($widget['#default_value'] === 'public') { + // Set the default value to community. + $widget['#default_value'] = 'community'; } - // This is for posts. - else { - $widget = &$form['field_visibility']['widget'][0]; - $options = &$form['field_visibility']['widget'][0]['#options']; + } + // This is for posts. + else { + $widget = &$form['field_visibility']['widget'][0]; + $options = &$form['field_visibility']['widget'][0]['#options']; - // Remove the public option. - unset($options[1]); + // Remove the public option. + unset($options[1]); - // Check if the public options is currently selected. - if ($widget['#default_value'] === '1') { - $widget['#default_value'] = '2'; - } + // Check if the public options is currently selected. + if ($widget['#default_value'] === '1') { + $widget['#default_value'] = '2'; } - } } }