Skip to content

Commit b394496

Browse files
authored
Merge pull request #60 from OS2Forms/f/permissions_by_term_custom_field
Adding custom permissions_by_term field
2 parents f9a13ce + 008e958 commit b394496

File tree

5 files changed

+153
-0
lines changed

5 files changed

+153
-0
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ before starting to add changes. Use example [placed in the end of the page](#exa
1212
## [Unreleased]
1313

1414
- [OS-58] New company address fields
15+
- Custom permissions by term field
1516

1617
## [3.10.0] 2023-08-23
1718

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
os2web_permissions_by_term.settings:
2+
title: OS2Forms permissions by term
3+
description: Settings for OS2Forms permissions by term.
4+
route_name: os2web_permissions_by_term.settings_form
5+
parent: system.admin_config_system

modules/os2forms_permissions_by_term/os2forms_permissions_by_term.module

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ use Drupal\Core\Config\Entity\ConfigEntityInterface;
99
use Drupal\Core\Form\FormStateInterface;
1010
use Drupal\Core\Session\AccountInterface;
1111
use Drupal\node\NodeInterface;
12+
use Drupal\os2forms_permissions_by_term\Form\SettingsForm;
1213
use Drupal\views\Plugin\views\query\QueryPluginBase;
1314
use Drupal\views\ViewExecutable;
1415
use Drupal\webform\WebformInterface;
@@ -138,3 +139,37 @@ function os2forms_permissions_by_term_options_list_alter(array &$options, array
138139
function os2forms_permissions_by_term_views_query_alter(ViewExecutable $view, QueryPluginBase $query) {
139140
\Drupal::service('os2forms_permissions_by_term.maestro_template_helper')->viewsQueryAlter($view, $query);
140141
}
142+
143+
/**
144+
* Implements hook_user_update().
145+
*/
146+
function os2forms_permissions_by_term_user_update($account) {
147+
$config = \Drupal::config(SettingsForm::$configName);
148+
149+
if ($customField = $config->get('os2web_permissions_by_term_custom_field')) {
150+
if ($account->get($customField)) {
151+
$accessTerms = $account->get($customField)->referencedEntities();
152+
153+
/** @var \Drupal\permissions_by_term\Service\AccessStorage $access_storage */
154+
$access_storage = \Drupal::service('permissions_by_term.access_storage');
155+
156+
// First, we delete existing values from the db.
157+
$access_storage->deleteAllTermPermissionsByUserId($account->id());
158+
159+
if (!empty($accessTerms)) {
160+
// For term permissions use user preferred language.
161+
$langcode = $account->getPreferredLangcode();
162+
163+
// Second, we insert updated values.
164+
foreach ($accessTerms as $accessTerm) {
165+
$access_storage->addTermPermissionsByUserIds([$account->id()], $accessTerm->id(), $langcode);
166+
}
167+
}
168+
169+
// Rebuild permissions for nodes if needed.
170+
if (!\Drupal::config('permissions_by_term.settings')->get('disable_node_access_records')) {
171+
node_access_rebuild(TRUE);
172+
}
173+
}
174+
}
175+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
os2web_permissions_by_term.settings_form:
2+
path: '/admin/config/system/os2forms_permissions_by_term'
3+
defaults:
4+
_title: 'OS2Forms Permissions by terms'
5+
_form: 'Drupal\os2forms_permissions_by_term\Form\SettingsForm'
6+
requirements:
7+
_permission: 'administer site configuration'
Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
1+
<?php
2+
3+
namespace Drupal\os2forms_permissions_by_term\Form;
4+
5+
use Drupal\Core\Entity\EntityFieldManagerInterface;
6+
use Drupal\Core\Form\ConfigFormBase;
7+
use Drupal\Core\Form\FormStateInterface;
8+
use Symfony\Component\DependencyInjection\ContainerInterface;
9+
10+
/**
11+
* Configure os2forms_permissions_by_term settings for this site.
12+
*/
13+
class SettingsForm extends ConfigFormBase {
14+
15+
/**
16+
* Name of the config.
17+
*
18+
* @var string
19+
*/
20+
public static $configName = 'os2web_permissions_by_term.settings';
21+
22+
/**
23+
* Entity field manager.
24+
*
25+
* @var \Drupal\Core\Entity\EntityFieldManagerInterface
26+
*/
27+
private $entityFieldTypeManager;
28+
29+
/**
30+
* Constructs an SettingsForm object.
31+
*
32+
* @param \Drupal\Core\Entity\EntityFieldManagerInterface $entity_field_manager
33+
* Entity field manager.
34+
*/
35+
public function __construct(EntityFieldManagerInterface $entity_field_manager) {
36+
$this->entityFieldTypeManager = $entity_field_manager;
37+
}
38+
39+
/**
40+
* {@inheritdoc}
41+
*/
42+
public static function create(ContainerInterface $container) {
43+
return new static(
44+
$container->get('entity_field.manager'),
45+
);
46+
}
47+
48+
/**
49+
* {@inheritdoc}
50+
*/
51+
public function getFormId() {
52+
return 'os2web_permissions_by_term_settings';
53+
}
54+
55+
/**
56+
* {@inheritdoc}
57+
*/
58+
protected function getEditableConfigNames() {
59+
return [SettingsForm::$configName];
60+
}
61+
62+
/**
63+
* {@inheritdoc}
64+
*/
65+
public function buildForm(array $form, FormStateInterface $form_state) {
66+
$options = [0 => $this->t('None')];
67+
68+
$userFields = $this->entityFieldTypeManager->getFieldDefinitions('user', 'user');
69+
70+
/** @var \Drupal\field\Entity\FieldConfig $field */
71+
foreach ($userFields as $field_key => $field) {
72+
// If fieldType is entity_reference, we only support taxonomy terms.
73+
if ($field->getType() == 'entity_reference' && $field->getSetting('target_type') == 'taxonomy_term') {
74+
$options[$field_key] = $field_key;
75+
}
76+
}
77+
78+
$form['os2web_permissions_by_term_custom_field'] = [
79+
'#type' => 'select',
80+
'#options' => $options,
81+
'#title' => $this->t('Permissions by term custom field'),
82+
'#description' => $this->t('The value of this custom field is mapped to Permission by term real field on hook_user_update().'),
83+
'#default_value' => $this->config(SettingsForm::$configName)
84+
->get('os2web_permissions_by_term_custom_field'),
85+
];
86+
87+
return parent::buildForm($form, $form_state);
88+
}
89+
90+
/**
91+
* {@inheritdoc}
92+
*/
93+
public function submitForm(array &$form, FormStateInterface $form_state) {
94+
$values = $form_state->getValues();
95+
96+
$config = $this->config(SettingsForm::$configName);
97+
foreach ($values as $key => $value) {
98+
$config->set($key, $value);
99+
}
100+
$config->save();
101+
102+
parent::submitForm($form, $form_state);
103+
}
104+
105+
}

0 commit comments

Comments
 (0)