-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathejikznayka_registration.module
92 lines (84 loc) · 3.1 KB
/
ejikznayka_registration.module
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
<?php
/**
* @file
* Contains ejikznayka_registration.module.
*/
use Drupal\Core\Routing\RouteMatchInterface;
use Drupal\Core\Form\FormStateInterface;
use Drupal\user\Entity\User;
use Drupal\Component\Utility\Random;
/**
* Implements hook_help().
*/
function ejikznayka_registration_help($route_name, RouteMatchInterface $route_match) {
switch ($route_name) {
// Main module help for the ejikznayka_registration module.
case 'help.page.ejikznayka_registration':
$output = '';
$output .= '<h3>' . t('About') . '</h3>';
$output .= '<p>' . t('Provides registration with referrals.') . '</p>';
return $output;
default:
}
}
/**
* Implements hook_form_FORM_ID_alter().
*/
function ejikznayka_registration_form_user_register_form_alter(array &$form, FormStateInterface $form_state, $form_id) {
$form['ejikznayka_registration_hash'] = array(
'#type' => 'textfield',
'#title' => t('Referral code'),
'#size' => 32,
'#maxlength' => 32,
'#weight' => 3,
'#description' => t('Put here the code you received from the person who invited you to sign up.'),
);
$form['#validate'][] = 'ejikznayka_registration_form_validate';
$form['actions']['submit']['#submit'][] = 'ejikznayka_registration_form_submit';
}
/**
* Custom form validation callback to check user reference.
* @see ejikznayka_registration_form_user_register_form_alter().
*/
function ejikznayka_registration_form_validate(&$form, FormStateInterface $form_state) {
$ejikznayka_registration_hash = trim($form_state->getValue('ejikznayka_registration_hash'));
if (!empty($ejikznayka_registration_hash)) {
if (strlen($ejikznayka_registration_hash) != 32) {
$form_state->setErrorByName('ejikznayka_registration_hash', t('Incorrect format of registration code.'));
}
else {
$query = \Drupal::entityQuery('user');
$result = $query->condition('field_ejikznayka_referral_code', $ejikznayka_registration_hash)->execute();
if (empty($result)) {
$form_state->setErrorByName('ejikznayka_registration_hash', t('Such registration code does not exist.'));
}
else {
if (count($result) > 1) {
// Bad practice. We should have created our dedicated exception class and provide catch block.
throw new \Exception('Several users with the same referral code.');
}
else {
$form_state->set('ejikznayka_registration_referral_user_id', $result[array_keys($result)[0]]);
}
}
}
}
}
/**
* Custom form submit callback to set user reference.
*
* @see ejikznayka_registration_form_user_register_form_alter()
*/
function ejikznayka_registration_form_submit(&$form, FormStateInterface $form_state) {
/** @var User $user */
$user = $form_state->getFormObject()->getEntity();
$referral_id = $form_state->get('ejikznayka_registration_referral_user_id');
$user->set('field_ejikznayka_referral_user', $referral_id ?: 1)->save();
}
/**
* Implements hook_ENTITY_TYPE_create().
*/
function ejikznayka_registration_user_create(User $user) {
$random = new Random();
$user->set('field_ejikznayka_referral_code', $random->name(32));
}