Joomla 1.5 Разделение пользователей на группы

Тема в разделе "Программирование", создана пользователем FeaMor, 14.03.2010.

  1. FeaMor
    Offline

    FeaMor Пользователь

    Регистрация:
    01.09.2008
    Сообщения:
    104
    Симпатии:
    2
    Пол:
    Мужской
    Здравствуйте!

    Понадобилось разделить зарегистрированных пользователей на несколько групп, для которых уровень доступа к информации будет различный. Посоветуйте, пожалуйста, какой-нибудь из вариантов, как это реализовать! Нужно что бы пользователь сам выбирал при регистрации из списка, кем он является, после чего там пойдет своя проверка на активацию этого аккаунта...

    Сам думаю вот что:
    1) напрямую в базе добавить дочерние группы к группе зарегистрированные, но боюсь навредить самой системе джумла в будущем, например при обновлении;
    2) добавить свою собственную таблички, где айдишникам зарегистрированных будут соответствовать определенные группы;
    3) В будущем буду использовать Community Builder, никогда с ней не сталкивался, но там есть типа анкеты, как в моем мире, с аватарами и прочей доп. инфой, так вот, может там и использовать как-нибудь дополнительное поле выбора группы?

    заранее спасибо!
     
    Grenuy нравится это.
  2.  
  3. Offline

    botanist специалист

    Регистрация:
    15.02.2009
    Сообщения:
    461
    Симпатии:
    49
    Пол:
    Мужской
    http://forum.joomla.org/viewtopic.php?f=431&t=262604&start=0
     
  4. Offline

    nart Недавно здесь

    Регистрация:
    12.03.2010
    Сообщения:
    5
    Симпатии:
    0
    Пол:
    Мужской
    есть платное решение вопроса http://flexicontent.org/, flexiaccess глянь ...
     
  5. FeaMor
    Offline

    FeaMor Пользователь

    Регистрация:
    01.09.2008
    Сообщения:
    104
    Симпатии:
    2
    Пол:
    Мужской
    Спасибо botanist!
    Думаю именно то, что и нужно. Правда гугл.транслейтер коряво переводит %) а сам плохо знаю англ...
    Только вот вопрос, когда я буду систему обновлять, у меня испортится что-нить?
     
  6. omfgpanda
    Offline

    omfgpanda специалист

    Регистрация:
    22.01.2008
    Сообщения:
    673
    Симпатии:
    53
    Пол:
    Мужской
    я на этом форуме как то публиковал мануал про добавление групп пользователей и работе с ними ... но вот что то не могу ни как найти эту тему (((
     
  7. Offline

    botanist специалист

    Регистрация:
    15.02.2009
    Сообщения:
    461
    Симпатии:
    49
    Пол:
    Мужской
    Я, кстати, тоже не нашел, поэтому ссылку на буржуев дал.
     
  8. FeaMor
    Offline

    FeaMor Пользователь

    Регистрация:
    01.09.2008
    Сообщения:
    104
    Симпатии:
    2
    Пол:
    Мужской
    Походу не все так просто ))
    Вручную добавил в mySQL новые группы "NewGroup1", "NewGroup2"и "NewGroup3" на примере группы "NewGroup1":
    Код (CODE):
    1. SET @parent_name = 'Registered';
    2. SET @new_name = 'NewGroup1';
    3.  
    4. -- Select the parent node to insert after
    5. SELECT @ins_id := id, @ins_lft := lft, @ins_rgt := rgt
    6. FROM #__core_acl_aro_groups
    7. WHERE name COLLATE utf8_general_ci = @parent_name;
    8.  
    9. SELECT @new_id := MAX(id) + 1 FROM #__core_acl_aro_groups;
    10.  
    11. -- Make room for the new node
    12. UPDATE #__core_acl_aro_groups SET rgt=rgt+2 WHERE rgt>=@ins_rgt;
    13. UPDATE #__core_acl_aro_groups SET lft=lft+2 WHERE lft>@ins_rgt;
    14.  
    15. -- Insert the new node
    16. INSERT INTO #__core_acl_aro_groups (id,parent_id,name,lft,rgt,value)
    17. VALUES (@new_id,@ins_id,@new_name,@ins_rgt,@ins_rgt+1,"NewGroup1");

    где "#_" - префикс таблиц

    и теперь надо при регистрации вывести комбобокс с выбором этих групп и записать в базу уже не с Registered, а с NewGroup1-3.

    В файле \components\com_user\views\register\tmpl\default.php
    после строк с вводом E-mail вставляю следующий код:
    Код (html):
    1. <tr>
    2.     <td>
    3.         <label>
    4.             Выберите свою принадлежность:
    5.         </label>
    6.     </td>
    7.     <td>
    8.         <select name="group">
    9.             <option value="Registered">Без группы</option>
    10.             <option value="NewGroup1">Группа 1</option>
    11.             <option value="NewGroup2">Группа 2</option>
    12.             <option value="NewGroup3">Группа 3</option>
    13.         </select>
    14.     </td>
    15. </tr>


    А в файле \components\com_user\controller.php заменить строки в функции function register_save() с
    Код (PHP):
    1. $newUsertype = $usersConfig->get( 'new_usertype' );
    2.         if (!$newUsertype) {
    3.             $newUsertype = 'Registered';
    4.         }

    на
    Код (PHP):
    1. $newUsertype = $usersConfig->get( 'new_usertype' );
    2.         if (!$newUsertype) {
    3.             $newUsertype = JRequest::getVar('group', 'Registered');
    4.             $newUsertype = htmlspecialchars(stripslashes($newUsertype));
    5.         }


    еще я выяснил, где именно менять ID группы в будущем на всякий случай - это таблица #__users с полями gid и usertype и таблица #__core_acl_groups_aro_map с полем group_id.

    Господа администраторы форума, проверьте пожалуйста на ошибки этот мой вариант, а то у меня сомнения на счет его верности...
    Просто в статье про джумлу1.0 http://joomlaportal.ru/content/view/1372/68/ столько всего монго надо делать, может и в 1.5 тоже надо много чего делать?
     
    Последнее редактирование: 15.03.2010
  9. FeaMor
    Offline

    FeaMor Пользователь

    Регистрация:
    01.09.2008
    Сообщения:
    104
    Симпатии:
    2
    Пол:
    Мужской
    А еще у меня вопросы:
    1)как массово поменять группы пользователей с 'Registered' на , например, 'NewGroup1'
    Это как раз надо вручную что ли в вышеупомянутых таблицах #__users и #__core_acl_groups_aro_map всех переопределять?
    2) То, что добавится новые группы от родительской группы 'Registered', на всякие сторонние компоненты, типа форум (kunena), чаты, магазины, личные сообщения (uddeim) и личные странички (community builder) как повлияет? Они будут там использоваться как 'Registered', как 'NewGroup1' или вообще как 'Noname' какой-нить?
     
    Последнее редактирование: 15.03.2010
  10. FeaMor
    Offline

    FeaMor Пользователь

    Регистрация:
    01.09.2008
    Сообщения:
    104
    Симпатии:
    2
    Пол:
    Мужской
    Люди, ау?!

    Помогите советом, если что не так...
     
  11. omfgpanda
    Offline

    omfgpanda специалист

    Регистрация:
    22.01.2008
    Сообщения:
    673
    Симпатии:
    53
    Пол:
    Мужской
    Описанный выше способ конечно хорош, но у вас потом возникнут проблемы с ACL, что не есть гут. Для того что бы все сделать по "феншую" вам необходимо получить экземпляр класса JAuthorization. Он в свою очередь расширяет класс gacl_api - очень мощный инструмент для работы с группами.
    Для того что бы добавить новую группу Вам необходимо сделать следующее:
    Код (PHP):
    1. $myObj = new JAuthorization();
    2. //первый параметр - groupValue
    3. //второй - groupName
    4. //третий - группа родитель
    5. //четвертый, не обязательный - тип группы (ARO | AXO). По умолчанию стоит ARO.
    6. $myObj->add_group('myNewGroup', 'Новая группа', 0);
    7. //эта функция делает тоже самое, что и ваш sql-запрос для пересчета индексов
    8. $myObg->rebuild_tree();

    А по поводу пользователей - функций для получения списка пользователей я не нашел, скорее всего их нет в 1.5 потому что в com_users для получения списка пользователей используется, не малых размеров функция )))
    Рекомендую
    Код (CODE):
    1. UPDATE jos_users SET gid=*id вашей новой группы* WHERE gid = 18

    18 - Registered
     
  12. FeaMor
    Offline

    FeaMor Пользователь

    Регистрация:
    01.09.2008
    Сообщения:
    104
    Симпатии:
    2
    Пол:
    Мужской
    По описанному мной варианту, у меня создаются в базе 3 группы, у которых gid соответственно становятся 31, 32 и 33 и они являются потомками 18 - Registered. Поиск по базе mySQL + замена вручную ведется по двум таблицам (как минимум) jos_users и jos_core_acl_groups_aro_map, а вот на уровне встроенных джумловских функций я не знаю ((

    omfgpanda, влияет ли эта информация на указанный твой код?
     
  13. omfgpanda
    Offline

    omfgpanda специалист

    Регистрация:
    22.01.2008
    Сообщения:
    673
    Симпатии:
    53
    Пол:
    Мужской
    я дословно описал Вам решение проблемы, чего тут не понятного ?
     
  14. FeaMor
    Offline

    FeaMor Пользователь

    Регистрация:
    01.09.2008
    Сообщения:
    104
    Симпатии:
    2
    Пол:
    Мужской
    Ладно, спрошу еще раз:
    Я считаю, что это не все, что нужно сделать, потому что в админке в списке пользователей в последнем столбце значения ID не поменяется, если работать только с jos_users... надо именно еще и в jos_core_acl_groups_aro_map. А вопрос был как раз такой: а может еще где надо что-то менять? Вдруг я просто пока не вижу, а потом будут глюки...


    Как этот код использовать? Его же надо выполнить "однажды"... Могу ли я в свой компонент под новый $task = 'temp' внедрить это или есть более продвинутые варианты выполнения таких процедур?

    А еще меня беспокоит следующее: будут ли эти группы определяться как 'Registered', если у какого-либо компонента не прописан обработчик на дополнительные группы. В смысле, с этими группами только я работаю, и естественно, другие компоненты их не используют, то не будет ли такого, что их при каких-либо условиях просто будут 'игнорировать' и даже не использовать как 'Registered'?
     
  15. omfgpanda
    Offline

    omfgpanda специалист

    Регистрация:
    22.01.2008
    Сообщения:
    673
    Симпатии:
    53
    Пол:
    Мужской
    Используйте его столько раз, сколько вам нужно. При однократном использовании создается одна группа.
    Передайте в метод "add_group" третий параметр = 18 (Registered) и все будет хорошо.
    В админке, в списке пользователей, Вы видите ID пользователей, а не группы. Для того что бы посмотреть к какой группе принадлежит пользователь, необходимо зайти в настройки учетной записи нужного пользователя. В, предложенном мной запросе:
    Код (CODE):
    1. UPDATE jos_users SET gid=*id вашей новой группы* WHERE gid = 18

    Мы обновляем только поле GID - group ID, с ID пользователя мы ничего не делаем.
    jos_core_acl_groups_aro_map ни как не относиться к связке "ПОЛЬЗОВАТЕЛЬ - ГРУППА".
     
  16. FeaMor
    Offline

    FeaMor Пользователь

    Регистрация:
    01.09.2008
    Сообщения:
    104
    Симпатии:
    2
    Пол:
    Мужской
    Ну так в таблице jos_core_acl_groups_aro_map есть поля: "group_id", "section_value", "aro_id", где "group_id" показывает принадлежность к группе, у всех стоят "18", и если я меняю у jos_users поле "gid" на "31"-"33", то у меня наверняка выйдет где-то несостыковка... Там же тоже надо менять значения в поле "group_id". Для чего вообще таблица jos_core_acl_groups_aro_map, если ею можно пренебречь?!

    А точно не будет проблем, если я всех пользователей переведу на свои группы, дочерние "Registered"? Например через Коммунити Билдер создать еще дополнительные группы, объединяющие пользователей по каким-то параметрам?!
     
  17. FeaMor
    Offline

    FeaMor Пользователь

    Регистрация:
    01.09.2008
    Сообщения:
    104
    Симпатии:
    2
    Пол:
    Мужской
    Походу дофига чего надо подключать отдельно, что бы этот код сработал %)
    Я, к сожалению, пишу просто php, как в 1.0 версии и не использую технологию Model-View-Controller ((

    А еще, на сколько я понял, можно группу как-то менять так (подглядел код в компоненте регистрации):
    Код (PHP):
    1. $newUsertype = 'Registered';
    2. $user->set('usertype', $newUsertype);
    3. $user->set('gid', $authorize->get_group_id( '', $newUsertype, 'ARO' ));


    тока вод тоже как правильно это подключить и использовать ?!

    Какие библиотеки надо подключать/отключать?
     
  18. FeaMor
    Offline

    FeaMor Пользователь

    Регистрация:
    01.09.2008
    Сообщения:
    104
    Симпатии:
    2
    Пол:
    Мужской
    Появилось еще несколько вопросов, связанных с новыми группами:

    1) как можно перезагрузить данные о пользователе? (когда пользователь находится на сайте и его группу поменять, то переменная $user->gid остается неизменной до тех пор, пока пользователь не войдет под своей учетной записью снова);

    2) каким образом можно менять принадлежность к группам через PHP? (я меняю принадлежность к группам вручную, через SQL-запросы);

    3) каким образом я могу использовать следующий код (что нужно подключать дополнительно, что бы он был роботоспособствующим)?:
    Код (PHP):
    1. $myObj = new JAuthorization();
    2. $myObj->add_group('myNewGroup', 'Новая группа', 0);
    3. $myObg->rebuild_tree();
     
  19. omfgpanda
    Offline

    omfgpanda специалист

    Регистрация:
    22.01.2008
    Сообщения:
    673
    Симпатии:
    53
    Пол:
    Мужской
    Не важно, авторизован ли в данный момент пользователь или нет.

    Код (PHP):
    1. $user =& JFactory::getUser($user_id); // получаем пользователя по его ИД
    2. $user->gid = 65; // 65 - это случайное число, подставьте сюда ИД нужной Вам группы


    Если пользователь авторизован, то после обновления страницы или перехода по внутренней ссылке, к нему будет применена палитика его новой группы.
     
  20. FeaMor
    Offline

    FeaMor Пользователь

    Регистрация:
    01.09.2008
    Сообщения:
    104
    Симпатии:
    2
    Пол:
    Мужской
    У меня данный код работает только внутри функции, где это я использую
    Когда человек загружает новую страничку, у него вне функций опять проверяется его групповой айдишник, и он продолжает оставаться таким же, каким и был, хотя в самой базе данные уже поменяны.
    Пробовал в той функции прописать
    Код (PHP):
    1. global $user;
    но это также не помогло (((
    Почему-то система сохраняет gid где-то в "памяти" до тех пор, пока пользователь не перезайдет в системы (((
    Может каким-то образом можно заменить это значение в памяти или перезагрузить ее?
     
  21. omfgpanda
    Offline

    omfgpanda специалист

    Регистрация:
    22.01.2008
    Сообщения:
    673
    Симпатии:
    53
    Пол:
    Мужской
    Возможно в таблице с сессиями.
     

Поделиться этой страницей

Загрузка...