Code Coverage |
||||||||||
Lines |
Functions and Methods |
Classes and Traits |
||||||||
Total | |
60.22% |
56 / 93 |
|
66.67% |
4 / 6 |
CRAP | |
0.00% |
0 / 1 |
UserHooks | |
60.22% |
56 / 93 |
|
66.67% |
4 / 6 |
45.19 | |
0.00% |
0 / 1 |
__construct | |
100.00% |
1 / 1 |
|
100.00% |
1 / 1 |
1 | |||
userInsert | |
88.24% |
15 / 17 |
|
0.00% |
0 / 1 |
4.03 | |||
userContactFormatNameAlter | |
100.00% |
27 / 27 |
|
100.00% |
1 / 1 |
6 | |||
userFormAlter | |
0.00% |
0 / 35 |
|
0.00% |
0 / 1 |
30 | |||
userFormAlterSubmit | |
100.00% |
7 / 7 |
|
100.00% |
1 / 1 |
2 | |||
userDelete | |
100.00% |
6 / 6 |
|
100.00% |
1 / 1 |
2 |
1 | <?php |
2 | |
3 | namespace Drupal\crm\Hook; |
4 | |
5 | use Drupal\Core\Config\ConfigFactoryInterface; |
6 | use Drupal\Core\Entity\EntityTypeManagerInterface; |
7 | use Drupal\Core\Hook\Attribute\Hook; |
8 | use Drupal\Core\Session\AccountInterface; |
9 | use Drupal\crm\Event\CrmUserContactEvent; |
10 | use Drupal\user\UserDataInterface; |
11 | use Drupal\user\UserInterface; |
12 | use Symfony\Contracts\EventDispatcher\EventDispatcherInterface; |
13 | use Drupal\Core\Session\AccountProxyInterface; |
14 | use Drupal\Core\Form\FormStateInterface; |
15 | use Drupal\Core\StringTranslation\StringTranslationTrait; |
16 | use Drupal\name\NameFormatterInterface; |
17 | |
18 | /** |
19 | * Hooks relating to users. |
20 | */ |
21 | class UserHooks { |
22 | use StringTranslationTrait; |
23 | |
24 | public function __construct( |
25 | protected ConfigFactoryInterface $configFactory, |
26 | protected EntityTypeManagerInterface $entityTypeManager, |
27 | protected EventDispatcherInterface $eventDispatcher, |
28 | protected UserDataInterface $userData, |
29 | protected AccountProxyInterface $currentUser, |
30 | protected NameFormatterInterface $nameFormatter, |
31 | ) {} |
32 | |
33 | /** |
34 | * Implements hook_ENTITY_TYPE_insert(). |
35 | */ |
36 | #[Hook('user_insert')] |
37 | public function userInsert(UserInterface $user) { |
38 | |
39 | $auto_create_crm_user_contact = $this->configFactory |
40 | ->get('crm.user_contact.settings') |
41 | ->get('auto_create_crm_user_contact'); |
42 | if (!$auto_create_crm_user_contact) { |
43 | return; |
44 | } |
45 | |
46 | $crm_user_contact = $this->entityTypeManager |
47 | ->getStorage('crm_user_contact') |
48 | ->create(['user' => $user->id()]); |
49 | $event = new CrmUserContactEvent($crm_user_contact); |
50 | $this->eventDispatcher->dispatch($event, CrmUserContactEvent::EVENT_NAME); |
51 | $crm_user_contact = $event->getCrmUserContact(); |
52 | $contact = $crm_user_contact->getContact(); |
53 | |
54 | if ($contact == NULL) { |
55 | return NULL; |
56 | } |
57 | if ($contact->get('bundle')->target_id != 'person') { |
58 | return NULL; |
59 | } |
60 | |
61 | $crm_user_contact->save(); |
62 | } |
63 | |
64 | /** |
65 | * Implements hook_user_format_name_alter(). |
66 | */ |
67 | #[Hook('user_format_name_alter')] |
68 | public function userContactFormatNameAlter(&$name, AccountInterface $account) { |
69 | $override = $this->configFactory->get('crm.user_contact.settings')->get('display_name'); |
70 | if (!$override) { |
71 | return; |
72 | } |
73 | $crm_users_contact = $this->entityTypeManager |
74 | ->getStorage('crm_user_contact') |
75 | ->loadByProperties(['user' => $account->id()]); |
76 | if ($crm_users_contact == NULL) { |
77 | return; |
78 | } |
79 | /** @var \Drupal\crm\Entity\UserContact */ |
80 | $crm_user_contact = reset($crm_users_contact); |
81 | $contact = $crm_user_contact->getContact(); |
82 | $name = $contact->label(); |
83 | |
84 | $user_name_format = $this->userData->get('crm', $account->id(), 'name_format'); |
85 | if (!$user_name_format) { |
86 | return; |
87 | } |
88 | if (!$account->hasPermission('crm user alter display name')) { |
89 | return; |
90 | } |
91 | |
92 | $name_array = $contact->get('full_name')->getValue(); |
93 | if (empty($name_array)) { |
94 | return; |
95 | } |
96 | $name_array = $name_array[0]; |
97 | $name_array['preferred'] = $contact->get('preferred_name')->value; |
98 | $name_array['alternative'] = array_map(function ($alias) { |
99 | return $alias['value']; |
100 | }, $contact->get('aliases')->getValue()); |
101 | $name_array['alternative'] = implode(', ', $name_array['alternative']); |
102 | |
103 | $formatted_name = $this->nameFormatter->format($name_array, $user_name_format); |
104 | |
105 | $name = html_entity_decode($formatted_name, ENT_QUOTES | ENT_HTML5, 'UTF-8'); |
106 | |
107 | } |
108 | |
109 | /** |
110 | * Implements hook_form_FORM_ID_alter(). |
111 | */ |
112 | #[Hook('form_user_form_alter')] |
113 | public function userFormAlter(&$form, FormStateInterface $form_state) { |
114 | $user_contact_settings = $this->configFactory->get('crm.user_contact.settings'); |
115 | |
116 | if (!$user_contact_settings->get('display_name')) { |
117 | return; |
118 | } |
119 | |
120 | $form_user = $form_state->getFormObject()->getEntity(); |
121 | |
122 | $user_contact = $this->entityTypeManager |
123 | ->getStorage('crm_user_contact') |
124 | ->loadByProperties(['user' => $form_user->id()]); |
125 | if ($user_contact == NULL) { |
126 | return; |
127 | } |
128 | |
129 | $user_contact = reset($user_contact); |
130 | |
131 | $same_user = $this->currentUser->id() == $form_user->id(); |
132 | if (!$same_user) { |
133 | return; |
134 | } |
135 | |
136 | if (!$this->currentUser->hasPermission('crm user alter display name')) { |
137 | return; |
138 | } |
139 | |
140 | $format_options = $this->entityTypeManager->getStorage('name_format')->loadMultiple(); |
141 | $format_options = array_map(function ($format) { |
142 | return $format->label(); |
143 | }, $format_options); |
144 | |
145 | $person_contact_type = $user_contact->getContact()->get('bundle')->entity; |
146 | $system_format = $person_contact_type->getThirdPartySetting('crm', 'name_format', 'default'); |
147 | $format_options = ['_none' => $this->t('System (@system)', ['@system' => $system_format])] + $format_options; |
148 | |
149 | $user_name_format = $this->userData->get('crm', $form_user->id(), 'name_format'); |
150 | |
151 | $form['crm'] = [ |
152 | '#type' => 'details', |
153 | '#title' => $this->t('CRM'), |
154 | '#open' => TRUE, |
155 | ]; |
156 | |
157 | $form['crm']['name_format'] = [ |
158 | '#type' => 'select', |
159 | '#title' => $this->t('Name Format'), |
160 | '#options' => $format_options, |
161 | '#default_value' => $user_name_format, |
162 | ]; |
163 | |
164 | $form['actions']['submit']['#submit'][] = [static::class, 'userFormAlterSubmit']; |
165 | } |
166 | |
167 | /** |
168 | * Static submit handler for user form alter. |
169 | */ |
170 | public static function userFormAlterSubmit(array &$form, FormStateInterface $form_state) { |
171 | |
172 | $form_user = $form_state->getFormObject()->getEntity(); |
173 | $user_name_format = $form_state->getValue('name_format'); |
174 | |
175 | /** @var \Drupal\user\UserDataInterface $user_data */ |
176 | $user_data = \Drupal::service('user.data'); |
177 | |
178 | if ($user_name_format == '_none') { |
179 | $user_data->delete('crm', $form_user->id(), 'name_format'); |
180 | return; |
181 | } |
182 | $user_data->set('crm', $form_user->id(), 'name_format', $user_name_format); |
183 | } |
184 | |
185 | /** |
186 | * Implements hook_ENTITY_TYPE_delete(). |
187 | */ |
188 | #[Hook('user_delete')] |
189 | public function userDelete(UserInterface $user) { |
190 | $crm_users_contact = $this->entityTypeManager |
191 | ->getStorage('crm_user_contact') |
192 | ->loadByProperties(['user' => $user->id()]); |
193 | if ($crm_users_contact != NULL) { |
194 | $crm_user_contact = reset($crm_users_contact); |
195 | $crm_user_contact->delete(); |
196 | } |
197 | } |
198 | |
199 | } |