Доступность всех групп при редактировании записи

+1
1.17K
Сейчас администратор при редактировании чьей-то записи не может указать группу в которой не состоит сам. Соответственно если запись была привязана к чужой группе, то для группы она теряется. Если указание группы для записи обязательно, то и вовсе группа этой записи меняется.
Не ахти сформулировал, но кто сталкивался поймет.

В идеале если пользователь имеет права на редактирование всех записей, то он должен иметь возможность указать любую группу. Наверное...

Короче, для себя я пока прикрутил костыль, который дает такую возможность администраторам и модераторам. Когда столкнусь с этим вопросом снова и буду чуток повыспавшись, постараюсь придумать, что-то более кошерное. Если кто-то не придумает это раньше.

Сам костыль:


В файле /system/controllers/groups/model.php меняем строку 299:
  1. $this->filterEqual('user_id', $user_id);
на:
  1. $user = cmsUser::getInstance();
  2. if(!$user->is_admin && !in_array('5', $user->groups)){
  3. $this->filterEqual('user_id', $user_id);
  4. }
* Указанный выше код оставлен для тех кто возможно успел уже его внести в свой проект, чтобы было проще исправить обратно.
При указанном в спойлере выше решении возникают проблемы в других местах. Нпример, при удалении пользователя администратором во всех группах декрементится (-1) счетчик участников, а не только в группах где пользователь в действительности является участником.
  1. public function run(){
  2.  
  3. if(!$this->cms_user->is_admin){ cmsCore::error404(); }
  4.  
  5. $this->model->selectOnly('id');
  6. $groups = $this->model->get('groups');
  7.  
  8. foreach($groups as $group){
  9. $ids = $this->model_groups->getMembersIds($group['id']);
  10. $this->model->update('groups', $group['id'], ['members_count' => count($ids)]);
  11. }
  12.  
  13. die('ok');
  14.  
  15. }

Следуя совету @SmartControl, полез в экшен content/item_edit и content/item_add. К сожалению через хук внести нужные изменения для всех типов контента не получается, т.к. объект формы передается для изменения только в "content_{$ctype['name']}_form". Так что пока по прежнему только костыль. В тех экшенах где нам это требуется, меняем:
  1. $groups = $groups_model->getUserGroups($this->cms_user->id);
на:
  1. if($this->cms_user->is_admin){
  2. $groups_model->select('g.id', 'id');
  3. $groups_model->select('g.*');
  4. $groups_model->joinInner('groups', 'g', 'g.id = i.group_id');
  5. $groups_model->orderBy('g.title');
  6. $groups = $groups_model->get('groups_members', function($group, $model){
  7.  
  8. $group['slug'] = $group['slug'] ? $group['slug'] : $group['id'];
  9.  
  10. return $group;
  11.  
  12. });
  13. }else{
  14. $groups = $groups_model->getUserGroups($this->cms_user->id);
  15. }
Или если вам достаточно, чтобы просто не сбрасывались привязки к группам, то можно подтягивать только группы автора записи. Для этого в экшене content/item_edit меняем все ту же строку:
  1. $groups = $groups_model->getUserGroups($this->cms_user->id);
на:
  1. if($this->cms_user->is_admin){
  2. $groups = $groups_model->getUserGroups($item['user_id']);
  3. }else{
  4. $groups = $groups_model->getUserGroups($this->cms_user->id);
  5. }
[/code]
+1
SmartControl SmartControl 5 лет назад #
Иван Шкута:
В идеале если пользователь имеет права на редактирование всех записей, то он должен иметь возможность указать любую группу. Наверное...
Но надо понимать, что желая дать возможность редактировать записи групп (в которых модератор не состоит), вы ломаете функцию получения групп пользователя для админа и модераторов. А эта функция используется много где еще.
+1
SmartControl SmartControl 5 лет назад #
Аккуратнее было бы поправить action редактирования записи (item_edit), поменяв там "получение групп текущего пользователя" на "получение всех групп" (для админа и модераторов). Это бы не повлияло на другие процессы.
0
Иван Шкута Иван Шкута 5 лет назад #
Да, вы вы правы. Жаль я раньше не обратил на это внимание. Теперь пришлось писать объект для пересчета количества пользователей в группах.
Эх, не люблю я вносить изменения в ядро и не зря!!!

Еще от автора

Редирект менеджер обновлен
Наконец-то дошли руки до редирект-менеджера, вернее до его обновления. Новое: Поддержка 2.10.0+ Маски для исходного URL Переменные для целевого URL
Поле "Точка на карте"
Это поле позволяет указать точку на карте (Яндекс.Карты) и вывести карту с этой точкой в записи / профиле / группе.
Изображение с возможностью обрезки на стороне клиента
Улучшение для стандартного поля «Изображение» позволяющее редактировать загруженное изображение на стороне клиента.
Используя этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.