Возможность изменения группы пользователем

ЕСТЬ РЕШЕНИЕ ЗАКРЫТО
#16 3 января 2016 в 17:38
Val, сделал отдельную страницу и экшен.

profile_edit_group.tpl.php

  1. <?php
  2.  
  3.  
  4. $this->addToolButton(array(
  5. 'class' => 'save',
  6. 'title' => LANG_SAVE,
  7. 'href' => "javascript:icms.forms.submit()"
  8. ));
  9.  
  10. $this->addToolButton(array(
  11. 'class' => 'cancel',
  12. 'title' => LANG_CANCEL,
  13. 'href' => href_to('users', $id)
  14. ));
  15.  
  16.  
  17.  
  18. ?>
  19.  
  20.  
  21.  
  22. <?php
  23. $this->renderForm($form, $profile, array(
  24. 'action' => '',
  25. 'method' => 'post',
  26. 'toolbar' => false
  27. ), $errors);
  28. ?>
  29.  
  30. <style>
  31.  
  32. .nyroModalCont {padding:30px;}
  33. .accordion-close {display:none;}
  34.  
  35.  
  36.  
  37.  
  38. </style>
  39.  
  40.  
и
profile_edit_group.php
  1. <?php
  2.  
  3. class actionUsersProfileEditGroup extends cmsAction {
  4.  
  5. public function run($profile, $do=false){
  6.  
  7. if (!cmsUser::isLogged()) { cmsCore::error404(); }
  8.  
  9. $user = cmsUser::getInstance();
  10.  
  11. // если нужно, передаем управление другому экшену
  12. if ($do){
  13. $this->runAction('profile_edit_'.$do, array($profile) + array_slice($this->params, 2));
  14. return;
  15. }
  16.  
  17. // проверяем наличие доступа
  18. if ($profile['id'] != $user->id && !$user->is_admin) { cmsCore::error404(); }
  19.  
  20. // Получаем поля
  21. $content_model = cmsCore::getModel('content');
  22. $content_model->setTablePrefix('');
  23. $content_model->orderBy('ordering');
  24. $fields = $content_model->getContentFields('users');
  25.  
  26. // Строим форму
  27. $form = new cmsForm();
  28.  
  29. // Разбиваем поля по группам
  30. $fieldsets = cmsForm::mapFieldsToFieldsets($fields, function($field, $user){
  31.  
  32. // проверяем что группа пользователя имеет доступ к редактированию этого поля
  33. if ($field['groups_edit'] && !$user->isInGroups($field['groups_edit'])) { return false; }
  34.  
  35. return true;
  36.  
  37. });
  38.  
  39.  
  40. // Добавляем поле выбора группы,
  41. // при наличии публичных групп
  42. //
  43. $users_model = cmsCore::getModel('users');
  44. $public_groups = $users_model->getPublicGroups();
  45. if ($public_groups) {
  46.  
  47. $pb_items = array();
  48. foreach($public_groups as $pb) { $pb_items[ $pb['id'] ] = $pb['title']; }
  49.  
  50. $fieldset_id = $form->addFieldset( LANG_USER_GROUP );
  51. $form->addFieldToBeginning($fieldset_id,
  52. new fieldList('groups', array(
  53. 'items' => $pb_items
  54. )
  55. )
  56. );
  57. }
  58.  
  59. // Форма отправлена?
  60. $is_submitted = $this->request->has('submit');
  61.  
  62. if ($is_submitted){
  63.  
  64. // Парсим форму и получаем поля записи
  65. $new = $form->parse($this->request, $is_submitted, $profile);
  66. $old = $profile;
  67. $profile = array_merge($profile, $new);
  68.  
  69. // Проверям правильность заполнения
  70. $errors = $form->validate($this, $profile);
  71.  
  72. if (!$errors){
  73. $is_allowed = cmsEventsManager::hookAll('user_profile_update', $profile, true);
  74. if ($is_allowed !== true && in_array(false, $is_allowed)) { $errors = true; }
  75. }
  76. if (!$errors && !empty($new['groups'])){
  77. $profile['groups'] = array($new['groups']);
  78. }
  79.  
  80.  
  81. if (!$errors){
  82.  
  83. // Обновляем профиль и редиректим на его просмотр
  84. $this->model->updateUser($profile['id'], $profile);
  85.  
  86. // Отдельно обновляем часовой пояс в сессии
  87. cmsUser::sessionSet('user_data:time_zone', $profile['time_zone']);
  88.  
  89. // Постим уведомление о смене аватара в ленту
  90. if (!$this->model->isAvatarsEqual($new['avatar'], $old['avatar'])){
  91. $activity_controller = cmsCore::getController('activity');
  92. $activity_controller->deleteEntry($this->name, "avatar", $profile['id']);
  93. if (!empty($new['avatar'])){
  94. $activity_controller->addEntry($this->name, "avatar", array(
  95. 'user_id' => $profile['id'],
  96. 'subject_title' => $profile['nickname'],
  97. 'subject_id' => $profile['id'],
  98. 'subject_url' => href_to('users', $profile['id']),
  99. 'is_private' => 0,
  100. 'group_id' => null,
  101. 'images' => array(
  102. 'url' => href_to('users', $profile['id']),
  103. 'src' => html_image_src($new['avatar'], 'normal')
  104. )
  105. ),
  106. 'images_count' => 1
  107. ));
  108. }
  109. }
  110.  
  111. $this->redirectTo('users', $profile['id']);
  112.  
  113. }
  114.  
  115. if ($errors){
  116. cmsUser::addSessionMessage(LANG_FORM_ERRORS, 'error');
  117. }
  118.  
  119. }
  120.  
  121. return cmsTemplate::getInstance()->render('profile_edit_group', array(
  122. 'do' => 'edit',
  123. 'id' => $profile['id'],
  124. 'profile' => $profile,
  125. 'form' => $form,
  126. 'errors' => isset($errors) ? $errors : false
  127. ));
  128.  
  129. }
  130.  
  131. }
  132.  
Создал виджет в котором организуется ссылка вида сайт.ru/users/id/edit/group, установил его на главной.
При переходе
#17 17 января 2016 в 23:47
Azami, в скайпе вы пропали, выкладываю здесь:

  1. class actionUsersProfileEditGroup extends cmsAction {
  2.  
  3. public function run($profile, $do=false){
  4.  
  5. if (!cmsUser::isLogged()) { cmsCore::error404(); }
  6.  
  7. $user = cmsUser::getInstance();
  8.  
  9. // проверяем наличие доступа
  10. if ($profile['id'] != $user->id && !$user->is_admin) { cmsCore::error404(); }
  11.  
  12. // Строим форму
  13. $form = new cmsForm();
  14.  
  15. // Добавляем поле выбора группы,
  16. // при наличии публичных групп
  17. $users_model = cmsCore::getModel('users');
  18. $public_groups = $users_model->getPublicGroups();
  19. if ($public_groups) {
  20.  
  21. $pb_items = array();
  22. foreach($public_groups as $pb) {
  23. $pb_items[ $pb['id'] ] = $pb['title'];
  24. }
  25.  
  26. $fieldset_id = $form->addFieldset( LANG_USER_GROUP );
  27. $form->addFieldToBeginning($fieldset_id,
  28. new fieldList('groups', array(
  29. 'items' => $pb_items
  30. )
  31. )
  32. );
  33. }
  34.  
  35. // Форма отправлена?
  36. $is_submitted = $this->request->has('submit');
  37.  
  38. if ($is_submitted){
  39.  
  40. // Парсим форму и получаем поля записи
  41. $new = $form->parse($this->request, $is_submitted, $profile);
  42. $old = $profile;
  43. $profile = array_merge($profile, $new);
  44.  
  45. // Проверям правильность заполнения
  46. $errors = $form->validate($this, $profile);
  47.  
  48. if (!$errors){
  49. $is_allowed = cmsEventsManager::hookAll('user_profile_update', $profile, true);
  50. if ($is_allowed !== true && in_array(false, $is_allowed)) { $errors = true; }
  51. }
  52. if (!$errors && !empty($new['groups'])){
  53. $profile['groups'] = array($new['groups']);
  54. }
  55.  
  56. if (!$errors){
  57.  
  58. // Обновляем профиль и редиректим на его просмотр
  59. $this->model->updateUser($profile['id'], $profile);
  60.  
  61. $this->redirectTo('users', $profile['id']);
  62.  
  63. }
  64.  
  65. if ($errors){
  66. cmsUser::addSessionMessage(LANG_FORM_ERRORS, 'error');
  67. }
  68.  
  69. }
  70.  
  71. return cmsTemplate::getInstance()->render('profile_edit_group', array(
  72. 'id' => $profile['id'],
  73. 'profile' => $profile,
  74. 'form' => $form,
  75. 'errors' => isset($errors) ? $errors : false
  76. ));
  77.  
  78. }
  79.  
  80. }
и
  1. <?php
  2.  
  3. $this->addToolButton(array(
  4. 'class' => 'save',
  5. 'title' => LANG_SAVE,
  6. 'href' => "javascript:icms.forms.submit()"
  7. ));
  8.  
  9. $this->addToolButton(array(
  10. 'class' => 'cancel',
  11. 'title' => LANG_CANCEL,
  12. 'href' => href_to('users', $id)
  13. ));
  14.  
  15. ?>
  16.  
  17. <?php
  18. $this->renderForm($form, $profile, array(
  19. 'action' => $this->href_to($profile['id'], array('edit','group')),
  20. 'method' => 'post',
  21. 'toolbar' => false
  22. ), $errors);
  23. ?>
  24.  
  25. <style>
  26. .nyroModalCont {padding:30px;}
  27. .accordion-close {display:none;}
  28. </style>
Теперь вставляем ajax-modal и радуемся)))
#18 18 января 2016 в 10:34


Azami, в скайпе вы пропали, выкладываю здесь:

  1. class actionUsersProfileEditGroup extends cmsAction {
  2.  
  3. public function run($profile, $do=false){
  4.  
  5. if (!cmsUser::isLogged()) { cmsCore::error404(); }
  6.  
  7. $user = cmsUser::getInstance();
  8.  
  9. // проверяем наличие доступа
  10. if ($profile['id'] != $user->id && !$user->is_admin) { cmsCore::error404(); }
  11.  
  12. // Строим форму
  13. $form = new cmsForm();
  14.  
  15. // Добавляем поле выбора группы,
  16. // при наличии публичных групп
  17. $users_model = cmsCore::getModel('users');
  18. $public_groups = $users_model->getPublicGroups();
  19. if ($public_groups) {
  20.  
  21. $pb_items = array();
  22. foreach($public_groups as $pb) {
  23. $pb_items[ $pb['id'] ] = $pb['title'];
  24. }
  25.  
  26. $fieldset_id = $form->addFieldset( LANG_USER_GROUP );
  27. $form->addFieldToBeginning($fieldset_id,
  28. new fieldList('groups', array(
  29. 'items' => $pb_items
  30. )
  31. )
  32. );
  33. }
  34.  
  35. // Форма отправлена?
  36. $is_submitted = $this->request->has('submit');
  37.  
  38. if ($is_submitted){
  39.  
  40. // Парсим форму и получаем поля записи
  41. $new = $form->parse($this->request, $is_submitted, $profile);
  42. $old = $profile;
  43. $profile = array_merge($profile, $new);
  44.  
  45. // Проверям правильность заполнения
  46. $errors = $form->validate($this, $profile);
  47.  
  48. if (!$errors){
  49. $is_allowed = cmsEventsManager::hookAll('user_profile_update', $profile, true);
  50. if ($is_allowed !== true && in_array(false, $is_allowed)) { $errors = true; }
  51. }
  52. if (!$errors && !empty($new['groups'])){
  53. $profile['groups'] = array($new['groups']);
  54. }
  55.  
  56. if (!$errors){
  57.  
  58. // Обновляем профиль и редиректим на его просмотр
  59. $this->model->updateUser($profile['id'], $profile);
  60.  
  61. $this->redirectTo('users', $profile['id']);
  62.  
  63. }
  64.  
  65. if ($errors){
  66. cmsUser::addSessionMessage(LANG_FORM_ERRORS, 'error');
  67. }
  68.  
  69. }
  70.  
  71. return cmsTemplate::getInstance()->render('profile_edit_group', array(
  72. 'id' => $profile['id'],
  73. 'profile' => $profile,
  74. 'form' => $form,
  75. 'errors' => isset($errors) ? $errors : false
  76. ));
  77.  
  78. }
  79.  
  80. }
и
  1.  
  2.  
  3.  
  4.  
  5.  
  6. .nyroModalCont {padding:30px;}
  7. .accordion-close {display:none;}
  8.  
Теперь вставляем ajax-modal и радуемся)))

Val

Аааще кайф. Спасибо! Выручили в самый нужный момент!
Используя этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.