Chris@0
|
1 <?php
|
Chris@0
|
2
|
Chris@0
|
3 namespace Drupal\user\Plugin\Condition;
|
Chris@0
|
4
|
Chris@0
|
5 use Drupal\Core\Condition\ConditionPluginBase;
|
Chris@0
|
6 use Drupal\Core\Form\FormStateInterface;
|
Chris@0
|
7
|
Chris@0
|
8 /**
|
Chris@0
|
9 * Provides a 'User Role' condition.
|
Chris@0
|
10 *
|
Chris@0
|
11 * @Condition(
|
Chris@0
|
12 * id = "user_role",
|
Chris@0
|
13 * label = @Translation("User Role"),
|
Chris@18
|
14 * context_definitions = {
|
Chris@0
|
15 * "user" = @ContextDefinition("entity:user", label = @Translation("User"))
|
Chris@0
|
16 * }
|
Chris@0
|
17 * )
|
Chris@0
|
18 */
|
Chris@0
|
19 class UserRole extends ConditionPluginBase {
|
Chris@0
|
20
|
Chris@0
|
21 /**
|
Chris@0
|
22 * {@inheritdoc}
|
Chris@0
|
23 */
|
Chris@0
|
24 public function buildConfigurationForm(array $form, FormStateInterface $form_state) {
|
Chris@0
|
25 $form['roles'] = [
|
Chris@0
|
26 '#type' => 'checkboxes',
|
Chris@0
|
27 '#title' => $this->t('When the user has the following roles'),
|
Chris@0
|
28 '#default_value' => $this->configuration['roles'],
|
Chris@0
|
29 '#options' => array_map('\Drupal\Component\Utility\Html::escape', user_role_names()),
|
Chris@0
|
30 '#description' => $this->t('If you select no roles, the condition will evaluate to TRUE for all users.'),
|
Chris@0
|
31 ];
|
Chris@0
|
32 return parent::buildConfigurationForm($form, $form_state);
|
Chris@0
|
33 }
|
Chris@0
|
34
|
Chris@0
|
35 /**
|
Chris@0
|
36 * {@inheritdoc}
|
Chris@0
|
37 */
|
Chris@0
|
38 public function defaultConfiguration() {
|
Chris@0
|
39 return [
|
Chris@0
|
40 'roles' => [],
|
Chris@0
|
41 ] + parent::defaultConfiguration();
|
Chris@0
|
42 }
|
Chris@0
|
43
|
Chris@0
|
44 /**
|
Chris@0
|
45 * {@inheritdoc}
|
Chris@0
|
46 */
|
Chris@0
|
47 public function submitConfigurationForm(array &$form, FormStateInterface $form_state) {
|
Chris@0
|
48 $this->configuration['roles'] = array_filter($form_state->getValue('roles'));
|
Chris@0
|
49 parent::submitConfigurationForm($form, $form_state);
|
Chris@0
|
50 }
|
Chris@0
|
51
|
Chris@0
|
52 /**
|
Chris@0
|
53 * {@inheritdoc}
|
Chris@0
|
54 */
|
Chris@0
|
55 public function summary() {
|
Chris@0
|
56 // Use the role labels. They will be sanitized below.
|
Chris@0
|
57 $roles = array_intersect_key(user_role_names(), $this->configuration['roles']);
|
Chris@0
|
58 if (count($roles) > 1) {
|
Chris@0
|
59 $roles = implode(', ', $roles);
|
Chris@0
|
60 }
|
Chris@0
|
61 else {
|
Chris@0
|
62 $roles = reset($roles);
|
Chris@0
|
63 }
|
Chris@0
|
64 if (!empty($this->configuration['negate'])) {
|
Chris@0
|
65 return $this->t('The user is not a member of @roles', ['@roles' => $roles]);
|
Chris@0
|
66 }
|
Chris@0
|
67 else {
|
Chris@0
|
68 return $this->t('The user is a member of @roles', ['@roles' => $roles]);
|
Chris@0
|
69 }
|
Chris@0
|
70 }
|
Chris@0
|
71
|
Chris@0
|
72 /**
|
Chris@0
|
73 * {@inheritdoc}
|
Chris@0
|
74 */
|
Chris@0
|
75 public function evaluate() {
|
Chris@0
|
76 if (empty($this->configuration['roles']) && !$this->isNegated()) {
|
Chris@0
|
77 return TRUE;
|
Chris@0
|
78 }
|
Chris@0
|
79 $user = $this->getContextValue('user');
|
Chris@0
|
80 return (bool) array_intersect($this->configuration['roles'], $user->getRoles());
|
Chris@0
|
81 }
|
Chris@0
|
82
|
Chris@0
|
83 /**
|
Chris@0
|
84 * {@inheritdoc}
|
Chris@0
|
85 */
|
Chris@0
|
86 public function getCacheContexts() {
|
Chris@0
|
87 // Optimize cache context, if a user cache context is provided, only use
|
Chris@0
|
88 // user.roles, since that's the only part this condition cares about.
|
Chris@0
|
89 $contexts = [];
|
Chris@0
|
90 foreach (parent::getCacheContexts() as $context) {
|
Chris@0
|
91 $contexts[] = $context == 'user' ? 'user.roles' : $context;
|
Chris@0
|
92 }
|
Chris@0
|
93 return $contexts;
|
Chris@0
|
94 }
|
Chris@0
|
95
|
Chris@0
|
96 }
|