X-Git-Url: http://www.aleph1.co.uk/gitweb/?p=yaffs-website;a=blobdiff_plain;f=web%2Fmodules%2Fcontrib%2Fpermissions_by_term%2Fsrc%2FService%2FAccessStorage.php;fp=web%2Fmodules%2Fcontrib%2Fpermissions_by_term%2Fsrc%2FService%2FAccessStorage.php;h=66800394e47db3ce8737c6cefab3ef57dccc4637;hp=257ce76a090ff7cbc3018189082fef575b44d56a;hb=059867c3f96750652c80f39e44c442a58c2549ee;hpb=f8fc16ae6b862bef59baaad5d051dd37b7ff11b2 diff --git a/web/modules/contrib/permissions_by_term/src/Service/AccessStorage.php b/web/modules/contrib/permissions_by_term/src/Service/AccessStorage.php index 257ce76a0..66800394e 100644 --- a/web/modules/contrib/permissions_by_term/src/Service/AccessStorage.php +++ b/web/modules/contrib/permissions_by_term/src/Service/AccessStorage.php @@ -5,8 +5,10 @@ namespace Drupal\permissions_by_term\Service; use Drupal\Component\Utility\Tags; use Drupal\Core\Database\Connection; use Drupal\Core\Form\FormState; +use Drupal\Core\Form\FormStateInterface; use Drupal\Core\Session\AccountInterface; use Drupal\user\Entity\User; +use Drupal\user\Entity\Role; /** * Class AccessStorage. @@ -44,7 +46,7 @@ class AccessStorage { protected $aSubmittedRolesGrantedAccess; /** - * @var Term + * @var TermHandler */ protected $term; @@ -62,10 +64,10 @@ class AccessStorage { * AccessStorageService constructor. * * @param Connection $database - * @param Term $term + * @param TermHandler $term * @param AccessCheck $accessCheck */ - public function __construct(Connection $database, Term $term, AccessCheck $accessCheck) { + public function __construct(Connection $database, TermHandler $term, AccessCheck $accessCheck) { $this->database = $database; $this->term = $term; $this->accessCheck = $accessCheck; @@ -77,7 +79,7 @@ class AccessStorage { * @return array * An array with chosen roles. */ - public function getSubmittedRolesGrantedAccess(FormState $form_state) { + public function getSubmittedRolesGrantedAccess(FormStateInterface $form_state) { $aRoles = $form_state->getValue('access')['role']; $aChosenRoles = []; foreach ($aRoles as $sRole) { @@ -111,9 +113,10 @@ class AccessStorage { * * @return array */ - public function getUserTermPermissionsByTid($term_id) { + public function getUserTermPermissionsByTid($term_id, $langcode) { return $this->database->select('permissions_by_term_user', 'pu') ->condition('tid', $term_id) + ->condition('langcode', $langcode) ->fields('pu', ['uid']) ->execute() ->fetchCol(); @@ -146,15 +149,15 @@ class AccessStorage { } /** - * @param array $tids - * + * @param array $tids + * @param string $langcode * @return array */ - public function getUserTermPermissionsByTids($tids) { + public function getUserTermPermissionsByTids($tids, $langcode) { $uids = []; foreach ($tids as $tid) { - if (!empty($tmpUids = $this->getUserTermPermissionsByTid($tid))) { + if (!empty($tmpUids = $this->getUserTermPermissionsByTid($tid, $langcode))) { foreach ($tmpUids as $tmpUid) { $uids[] = $tmpUid; } @@ -166,27 +169,29 @@ class AccessStorage { /** * @param int $term_id + * @param string $langcode * * @return array */ - public function getRoleTermPermissionsByTid($term_id) { + public function getRoleTermPermissionsByTid($term_id, $langcode) { return $this->database->select('permissions_by_term_role', 'pr') ->condition('tid', $term_id) + ->condition('langcode', $langcode) ->fields('pr', ['rid']) ->execute() ->fetchCol(); } /** - * @param array $tids - * + * @param array $tids + * @param string $langcode * @return array */ - public function getRoleTermPermissionsByTids($tids) { + public function getRoleTermPermissionsByTids($tids, $langcode) { $rids = []; foreach ($tids as $tid) { - $tmpRids = $this->getRoleTermPermissionsByTid($tid); + $tmpRids = $this->getRoleTermPermissionsByTid($tid, $langcode); if (!empty($tmpRids)) { foreach ($tmpRids as $tmpRid) { $rids[] = $tmpRid; @@ -229,10 +234,11 @@ class AccessStorage { * * @return array */ - public function getAllowedUserIds($term_id) { + public function getAllowedUserIds($term_id, $langcode) { $query = $this->database->select('permissions_by_term_user', 'p') ->fields('p', ['uid']) - ->condition('p.tid', $term_id); + ->condition('p.tid', $term_id) + ->condition('p.langcode', $langcode); // fetchCol() returns all results, fetchAssoc() only "one" result. return $query->execute() @@ -243,11 +249,12 @@ class AccessStorage { * @param array $aUserIdsAccessRemove * @param int $term_id */ - public function deleteTermPermissionsByUserIds($aUserIdsAccessRemove, $term_id) { + public function deleteTermPermissionsByUserIds($aUserIdsAccessRemove, $term_id, $langcode) { foreach ($aUserIdsAccessRemove as $iUserId) { $this->database->delete('permissions_by_term_user') ->condition('uid', $iUserId, '=') ->condition('tid', $term_id, '=') + ->condition('langcode', $langcode, '=') ->execute(); } } @@ -256,11 +263,12 @@ class AccessStorage { * @param array $aRoleIdsAccessRemove * @param int $term_id */ - public function deleteTermPermissionsByRoleIds($aRoleIdsAccessRemove, $term_id) { + public function deleteTermPermissionsByRoleIds($aRoleIdsAccessRemove, $term_id, $langcode) { foreach ($aRoleIdsAccessRemove as $sRoleId) { $this->database->delete('permissions_by_term_role') ->condition('rid', $sRoleId, '=') ->condition('tid', $term_id, '=') + ->condition('langcode', $langcode, '=') ->execute(); } } @@ -297,11 +305,21 @@ class AccessStorage { * * @throws \Exception */ - public function addTermPermissionsByUserIds($aUserIdsGrantedAccess, $term_id, $langcode = 'en') { + public function addTermPermissionsByUserIds($aUserIdsGrantedAccess, $term_id, $langcode = '') { + $langcode = ($langcode === '') ? \Drupal::languageManager()->getCurrentLanguage()->getId() : $langcode; + foreach ($aUserIdsGrantedAccess as $iUserIdGrantedAccess) { - $this->database->insert('permissions_by_term_user') - ->fields(['tid', 'uid', 'langcode'], [$term_id, $iUserIdGrantedAccess, $langcode]) - ->execute(); + $queryResult = $this->database->query("SELECT uid FROM {permissions_by_term_user} WHERE tid = :tid AND uid = :uid AND langcode = :langcode", + [':tid' => $term_id, ':uid' => $iUserIdGrantedAccess, ':langcode' => $langcode])->fetchField(); + if (empty($queryResult)) { + $this->database->insert('permissions_by_term_user') + ->fields(['tid', 'uid', 'langcode'], [ + $term_id, + $iUserIdGrantedAccess, + $langcode + ]) + ->execute(); + } } } @@ -312,11 +330,26 @@ class AccessStorage { * * @throws \Exception */ - public function addTermPermissionsByRoleIds($aRoleIdsGrantedAccess, $term_id, $langcode = 'en') { + public function addTermPermissionsByRoleIds($aRoleIdsGrantedAccess, $term_id, $langcode = '') { + $langcode = ($langcode === '') ? \Drupal::languageManager()->getCurrentLanguage()->getId() : $langcode; + + $roles = Role::loadMultiple(); + foreach ($roles as $role => $roleObj) { + if ($roleObj->hasPermission('bypass node access')) { + $aRoleIdsGrantedAccess[] = $roleObj->id(); + } + } + + $aRoleIdsGrantedAccess = array_unique($aRoleIdsGrantedAccess); + foreach ($aRoleIdsGrantedAccess as $sRoleIdGrantedAccess) { - $this->database->insert('permissions_by_term_role') - ->fields(['tid', 'rid', 'langcode'], [$term_id, $sRoleIdGrantedAccess, $langcode]) - ->execute(); + $queryResult = $this->database->query("SELECT rid FROM {permissions_by_term_role} WHERE tid = :tid AND rid = :rid AND langcode = :langcode", + [':tid' => $term_id, ':rid' => $sRoleIdGrantedAccess, ':langcode' => $langcode])->fetchField(); + if (empty($queryResult)) { + $this->database->insert('permissions_by_term_role') + ->fields(['tid', 'rid', 'langcode'], [$term_id, $sRoleIdGrantedAccess, $langcode]) + ->execute(); + } } } @@ -328,7 +361,7 @@ class AccessStorage { * @return array * The user ids which have been submitted. */ - public function getSubmittedUserIds() { + public function getSubmittedUserIds($formState) { /* There's a $this->oFormState->getValues() method, but * it is loosing multiple form values. Don't know why. * So there're some custom lines on the $_REQUEST array. */ @@ -352,39 +385,36 @@ class AccessStorage { return $aUserIds; } - /** - * Saves term permissions by users. - * - * Opposite to save term permission by roles. - * - * @param FormState $form_state - * @param int $term_id - * - * @return array - * Data for database queries. - */ - public function saveTermPermissions(FormState $form_state, $term_id) { - $aExistingUserPermissions = $this->getUserTermPermissionsByTid($term_id); - $aSubmittedUserIdsGrantedAccess = $this->getSubmittedUserIds(); + /** + * @param FormState $formState + * @param int $term_id + * + * @return array + * @throws \Exception + */ + public function saveTermPermissions(FormStateInterface $formState, $term_id) { + $langcode = \Drupal::languageManager()->getCurrentLanguage()->getId(); + if (!empty($formState->getValue('langcode'))) { + $langcode = $formState->getValue('langcode')['0']['value']; + } + + $aExistingUserPermissions = $this->getUserTermPermissionsByTid($term_id, $langcode); + $aSubmittedUserIdsGrantedAccess = $this->getSubmittedUserIds($formState); - $aExistingRoleIdsGrantedAccess = $this->getRoleTermPermissionsByTid($term_id); - $aSubmittedRolesGrantedAccess = $this->getSubmittedRolesGrantedAccess($form_state); + $aExistingRoleIdsGrantedAccess = $this->getRoleTermPermissionsByTid($term_id, $langcode); + $aSubmittedRolesGrantedAccess = $this->getSubmittedRolesGrantedAccess($formState); $aRet = $this->getPreparedDataForDatabaseQueries($aExistingUserPermissions, $aSubmittedUserIdsGrantedAccess, $aExistingRoleIdsGrantedAccess, $aSubmittedRolesGrantedAccess); - $langcode = 'en'; - if (!empty($form_state->getValue('langcode', 'en'))) { - $langcode = $form_state->getValue('langcode', 'en')['0']['value']; - } - - // Run the database queries. - $this->deleteTermPermissionsByUserIds($aRet['UserIdPermissionsToRemove'], $term_id); + $this->deleteTermPermissionsByUserIds($aRet['UserIdPermissionsToRemove'], $term_id, $langcode); $this->addTermPermissionsByUserIds($aRet['UserIdPermissionsToAdd'], $term_id, $langcode); - $this->deleteTermPermissionsByRoleIds($aRet['UserRolePermissionsToRemove'], $term_id); - $this->addTermPermissionsByRoleIds($aRet['aRoleIdPermissionsToAdd'], $term_id, $langcode); + $this->deleteTermPermissionsByRoleIds($aRet['UserRolePermissionsToRemove'], $term_id, $langcode); + if (!empty($aRet['aRoleIdPermissionsToAdd'])) { + $this->addTermPermissionsByRoleIds($aRet['aRoleIdPermissionsToAdd'], $term_id, $langcode); + } return $aRet; }