Выбор группы. Хак.

#1 22 июня 2014 в 20:08
Встречал на форуме вопросы на данную тему и решил попробовать сделать. Получилось, возможно не очень красиво, но всё работает. Проверял на чистой 1.10.4. В редактирование профиля добавляется поле со списком групп ( задаются в админке ) из которых юзер может выбрать для себя нужную.
1.Добавляем в базу поле
  1. ALTER TABLE `cms_user_profiles` ADD `groop` VARCHAR( 30 ) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL AFTER `city` ;
2.файл /components/users/frontend.php
2.1 в начало ( например после $model = new cms_model_users();) пишем
  1. $cfg = $inCore->loadComponentConfig('users');
2.2 в if ($do == 'view'){...
в // Возможные входные переменные
добавляем
  1. $groop = cmsCore::request('groop', 'str');
2.3 /**Редактирование профиля **/
if ($do=='editprofile'){...
if ($opt == 'edit'){...
перед
  1. cmsPage::initTemplate('components', 'com_users_edit_profile')->
пишем
  1. $groop = cmsCore::request('groop','str');
  2. if($cfg['group_access']){
  3. $group_access = $cfg['group_access'] = implode(",", $cfg['group_access']);
  4. $groops = $inDB->get_table('cms_user_groups','id IN('.$group_access.')','*');
  5. }
  6. else
  7. {
  8. $groops = cmsUser::getGroups();
  9. }
в
  1. cmsPage::initTemplate('components', 'com_users_edit_profile')->
дописываем
  1. assign('groops', $groops)->
2.4 // Если сохраняем профиль
в if ($opt == 'save'){...
  1. $profiles['groop'] = cmsCore::request('groop', 'str');
перед
  1. $inDB->update('cms_user_profiles', cmsCore::callEvent('UPDATE_USER_PROFILES', array_merge(array('id'=>$usr['pid'], 'user_id'=>$usr['id']), $profiles)), $usr['pid']);
  1. $usr['grp'] = $profiles['groop'];
  2. $groops_id = $inUser-> getGroupId($usr['grp']);
  3. $usr['group_id'] = $groops_id;
  4. $users['group_id'] = $usr['group_id'];
3. файл /templates/components/com_users_edit_profile.tpl
вставляем в первую форму
  1. <tr>
  2. <td valign="top"> <strong>Выберете группу:</strong>
  3. </td>
  4. <td valign="top">
  5. <select name="groop" >
  6. {foreach key=id item=grup from=$groops}
  7. <option value="{$grup.title}"{if $grup.title==$usr.groop} selected {/if}> {$grup.title}</option>
  8. {/foreach}
  9. </select>
  10. </td>
  11. </tr>
4. файл /admin/components/users/backend.php
4.1 после
$model = new cms_model_users();
пишем
$cfg = $model->config;
4.1 в if ($opt=='saveconfig'){...
  1. $is_access = cmsCore::request('is_access', 'int', '');
  2. if (!$is_access){
  3. $cfg['group_access'] = cmsCore::request('allow_group', 'array_int', '');
  4. } else { $cfg['group_access'] = ''; }
4.2 в <div id="basic">
  1. <tr>
  2. <td valign="top">
  3. <strong>Выберите доступные группы:</strong>
  4.  
  5. <span class="hinttext">Из каких групп может<br> выбирать пользователь</span>
  6. </td>
  7. <td valign="top">
  8. <table width="100%" cellpadding="0" cellspacing="0" border="0" class="checklist" style="margin-top:5px">
  9. <tr>
  10. <td width="20">
  11. <?php
  12. $groups = cmsUser::getGroups();
  13.  
  14. $style = 'disabled="disabled"';
  15. $public = 'checked="checked"';
  16.  
  17. if ($cfg['group_access']){
  18. $public = '';
  19. $style = '';
  20. }
  21.  
  22. ?>
  23. <input name="is_access" type="checkbox" id="is_access" onclick="checkGroupList()" value="1" <?php echo $public?> />
  24. </td>
  25. <td><label for="is_access"><strong>Все групы</strong></label></td>
  26. </tr>
  27. </table>
  28. <div style="margin-top:10px;padding:5px;padding-right:0px;" id="grp">
  29. <div>
  30. <strong><?php echo $_LANG['AD_ALL_GROUPS_ONLY']; ?></strong><br />
  31. <span class="hinttext">
  32. <?php echo $_LANG['AD_SELECT_MULTIPLE_CTRL']; ?>
  33. </span>
  34. </div>
  35. <div>
  36. <?php
  37. echo '<select style="width: 245px" name="allow_group[]" id="showin" size="6" multiple="multiple" '.$style.'>';
  38.  
  39. if ($groups){
  40. foreach($groups as $group){
  41. if($group['alias'] != 'guest' && !$group['is_admin']){
  42. echo '<option value="'.$group['id'].'"';
  43. if ($cfg['group_access']){
  44. if (inArray($cfg['group_access'], $group['id'])){
  45. echo 'selected';
  46. }
  47. }
  48.  
  49. echo '>';
  50. echo $group['title'].'</option>';
  51. }
  52. }
  53.  
  54. }
  55.  
  56. echo '</select>';
  57. ?>
  58. </div>
  59. </div>
  60. <script type="text/javascript">
  61. function checkGroupList(){
  62. if($('input#is_access').prop('checked')){
  63. $('select#showin').prop('disabled', true);
  64. } else {
  65. $('select#showin').prop('disabled', false);
  66. }
  67.  
  68. }
  69. </script>
  70. </td>
  71. </tr>
5.в /core/classes/user.class.php
добавляем
  1. public static function getGroupId($user_id){
  2.  
  3. return cmsDatabase::getInstance()->get_field('cms_user_groups', "title='{$user_id}'", 'id');
  4.  
  5. }
6. файл /components/users/model.php
6.1 в $cfg = array(
пишем
'group_access' => '',
6.2 в public function getUser($login){
добавляем

p.groop as groop,

Всё.
Кому лень писать здесь архив с файлами на замену.
#2 22 июня 2014 в 21:03
Lora, отлично работает) Только логин и пасс рекомендовал бы спрятать в хайд😉Хотя, дело Ваше)
#3 23 июня 2014 в 11:35
Мега круто! Скорее всего и для 1.10.3 подойдет, но стоит проверить, а лучше обновиться, но… боюсь(
#5 23 июня 2014 в 13:14
trOid, здесь настройка из админки и после регистрации, немного другое решение)
#6 25 июня 2014 в 21:53

уже был хак, и он работал на 1.10.3

trOid
Хороший хак, грамотный, но вроде с моим нет ничего общего, а если и кто то видет, тоже хорошо, есть вариант выбрать.Не стал делать выбор при регистрации, так как не вижу смысла, если есть выбор в профиле.

Скорее всего и для 1.10.3 подойдет

PolarOne
Скорее всего, да.

а лучше обновиться, но… боюсь

PolarOne
А насчёт обновиться, я патчем обновился, проблем не было.
#7 25 июня 2014 в 22:27
Lora, вот жеж спасибо! Я что-то про патч забыл и думал как бы узнать все измененные файлы.
Вы не можете отвечать в этой теме.
Войдите или зарегистрируйтесь, чтобы писать на форуме.
Используя этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.