Как мы знаем, на данный момент устанавливать группу для пользователей возможно только в админ-панели.
Как быть, если для нашего проекта понадобилось, чтобы пользователи могли сами менять свою группу в настройках своего профиля?
В этом уроке я расскажу вам, как это реализовать.
Нам понадобится создать всего 7 файлов, и немного отредактировать 1 файл шаблона.
Итак, приступим:
1) (1-й файл) Создаем экшн.
В папке system/controllers/users/actions/ Создаем файл profile_edit_groups.php
с таким содержанием:
<?php class actionUsersProfileEditGroups extends cmsAction { public $lock_explicit_call = true; public function run($profile){ if (!$this->is_own_profile && !$this->cms_user->is_admin) { cmsCore::error404(); } $form = new cmsForm(); if ($this->cms_user->is_admin) { $fieldset_groups = $form->addFieldset('Группа'); $form->addField($fieldset_groups, 'show_all' => false, ) )) ); $fieldset_id = $form->addFieldset('Запретить пользователям самостоятельный переход в группы:'); $form->addField($fieldset_id, 'show_all' => false, ) )) ); } else { $fieldset_groups = $form->addFieldset('Группа'); $form->addField($fieldset_groups, 'show_all' => false, ) )) ); } $is_submitted = $this->request->has('submit'); if ($is_submitted){ $data = $form->parse($this->request, $is_submitted); $errors = $form->validate($this, $data); $usersgrpoups_model = cmsCore::getModel('usersgroups'); if (!$this->cms_user->is_admin) { $usersgrpoups = $usersgrpoups_model->getGroups(); if($usersgrpoups){ $usersgrpoups = cmsModel::yamlToArray($usersgrpoups[1]['groups']); if($intersect) { $errors = true; } } } } if (!$errors){ if ($this->cms_user->is_admin) { $usersgrpoups_model->updateUserGroupsSet($data); } $result = $this->model->updateUser($profile['id'], $profile); if ($result['success']){ cmsUser::addSessionMessage('Группа изменена', 'success'); $this->redirectTo('users', $profile['id']); } else { $errors = $result['errors']; } } if ($errors){ cmsUser::addSessionMessage(LANG_FORM_ERRORS, 'error'); } } 'id' => $profile['id'], 'profile' => $profile, 'data' => $data, 'form' => $form, )); } }
В папке templates/default/controllers/users/ Создаем файл profile_edit_groups.tpl.php
с таким содержанием:
<?php $this->setPageTitle(LANG_USER_GROUP); if($this->controller->listIsAllowed()){ $this->addBreadcrumb(LANG_USERS, href_to('users')); } $this->addBreadcrumb($profile['nickname'], href_to('users', $id)); $this->addBreadcrumb(LANG_USERS_EDIT_PROFILE, href_to('users', $id, 'edit')); $this->addBreadcrumb(LANG_USER_GROUP); 'class' => 'save', 'title' => LANG_SAVE, 'href' => "javascript:icms.forms.submit()" )); 'class' => 'cancel', 'title' => LANG_CANCEL, 'href' => href_to('users', $id) )); ?> <?php 'action' => '', 'method' => 'post', 'toolbar' => false ), $errors);
В папке system/fields/ Создаем файл listgroupsprofile.php
с таким содержанием:
<?php class fieldListGroupsprofile extends cmsFormField { public $title = 'Группы профиля'; public $is_public = false; public $sql = 'text NULL DEFAULT NULL'; public $allow_index = false; public $var_type = 'array'; public function getOptions(){ 'title' => LANG_PARSER_LIST_MULTIPLE_SHOW_ALL, 'default' => 1 )), 'title' => LANG_PARSER_LIST_GROUPS_SHOW_GUESTS, 'default' => 0 )), ); } public function getListItems(){ $usersgrpoups_model = cmsCore::getModel('usersgroups'); $usersgrpoups = $usersgrpoups_model->getGroups(); $users_model = cmsCore::getModel('users'); $groups = $users_model->getGroups((bool)$this->getProperty('show_guests')); if($usersgrpoups){ $usersgrpoups = cmsModel::yamlToArray($usersgrpoups[1]['groups']); foreach($usersgrpoups as $usersgroup){ } } foreach($groups as $group){ $items[$group['id']] = $group['title']; } return $items; } public function getInput($value){ $this->data['groups'] = $this->getListItems(); $value = cmsModel::yamlToArray($value); } } }
В папке system/fields/ Создаем файл listgroupsset.php
с таким содержанием:
<?php class fieldListGroupsset extends cmsFormField { public $title = 'Группы-ограничения'; public $is_public = false; public $sql = 'text NULL DEFAULT NULL'; public $allow_index = false; public $var_type = 'array'; public function getOptions(){ 'title' => LANG_PARSER_LIST_MULTIPLE_SHOW_ALL, 'default' => 1 )), 'title' => LANG_PARSER_LIST_GROUPS_SHOW_GUESTS, 'default' => 0 )), ); } public function getListItems(){ $users_model = cmsCore::getModel('users'); $groups = $users_model->getGroups((bool)$this->getProperty('show_guests')); foreach($groups as $group){ $items[$group['id']] = $group['title']; } return $items; } public function getInput($value){ $this->data['groups'] = $this->getListItems(); $usersgrpoups_model = cmsCore::getModel('usersgroups'); $usersgrpoups = $usersgrpoups_model->getGroups(); if($usersgrpoups){ $value = cmsModel::yamlToArray($usersgrpoups[1]['groups']); } } }
В папке templates/default/assets/fields/ Создаем файл listgroupsprofile.tpl.php
с таким содержанием:
<?php if ($field->title) { ?><label for="<?php echo $field->id; ?>"><?php echo $field->title; ?></label><?php } ?> <?php echo html_select_multiple($field->element_name, $field->data['groups'], $value, array('id'=>$field->id)); ?> <script type="text/javascript"> $(function() { $('#<?php echo $field->id; ?> input').on('click', function (){ v = $(this).val(); p = $(this).parents('.input_checkbox_list'); if(v==0){ $('input', p).not('input[value="0"]').prop('checked', false); } else { $('input[value="0"]', p).prop('checked', false); } }); }); </script>
В папке templates/default/assets/fields/ Создаем файл listgroupsset.tpl.php
с таким содержанием:
<?php if ($field->title) { ?><label for="<?php echo $field->id; ?>"><?php echo $field->title; ?></label><?php } ?> <?php echo html_select_multiple($field->element_name, $field->data['groups'], $value, array('id'=>$field->id)); ?> <script type="text/javascript"> $(function() { $('#<?php echo $field->id; ?> input').on('click', function (){ v = $(this).val(); p = $(this).parents('.input_checkbox_list'); if(v==0){ $('input', p).not('input[value="0"]').prop('checked', false); } else { $('input[value="0"]', p).prop('checked', false); } }); }); </script>
В папке system/controllers/ Создаем ПАПКУ usersgroups
В папке system/controllers/usersgroups/ Создаем файл model.php
с таким содержанием:
<?php class modelUsersgroups extends cmsModel { public function getGroups(){ return $this->get('cms_users_groups_set'); } public function updateUserGroupsSet($data){ return $this->update('cms_users_groups_set', 1, $data); } }
В нем мы добавим один пункт меню, чтобы в настройках можно было перейти на страницу редактирования группы пользователя.
8) В папке templates/default/controllers/users/ В файле profile_edit_header.tpl.php
заменяем все содержимое на этот код:
<?php $edit_menu = $this->controller->getProfileEditMenu($profile); 'title' => 'Группа', 'controller' => 'users', 'action' => $profile['id'], ); $this->addMenuItems('profile_tabs', $edit_menu); ?> <h1><?php echo LANG_USERS_EDIT_PROFILE; ?></h1> <div id="user_profile_tabs"> <div class="tabs-menu"> <?php $this->menu('profile_tabs', true, 'tabbed', 7); ?> </div> </div>
CREATE TABLE `БАЗА_ДАННЫХ`.`cms_users_groups_set` ( `id` INT(1) UNSIGNED NULL DEFAULT NULL AUTO_INCREMENT , `groups` TEXT CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL , PRIMARY KEY (`id`)) ENGINE = InnoDB; INSERT INTO `cms_users_groups_set` (`id`, `groups`) VALUES ('1', '---\r\n- 6\r\n');
Другим пользователям отображаются только те группы, в которые можно перейти.
Готово! Теперь у пользователей вашего сайта появилась возможность изменять группу в настройках своего профиля.
Понравился урок? Ставь большой палец вверх! Это мотивирует автора создавать новые уроки!
В следующей статье мы рассмотрим: "Как вывести фотографии пользователя на странице его профиля."
Реклама #
Алексей Т 5 лет назад #
ХурумБурум 5 лет назад #
Donto 5 лет назад #
Андрей 5 лет назад #
SpideR 5 лет назад #
Александр 5 лет назад #
RSN 5 лет назад #
Например если надо отнести себя к какой то группе (пример в Sape "Вебмастера" и "Рекламодатели" и т.п.) с определенными возможностями для группы.
Однако правильно отмечено:
Red-Ray.Ru 5 лет назад #
Полностью с вами согласен, что нужно добавить ограничение для выбора группы.
Добавлю эту возможность.
Red-Ray.Ru 5 лет назад #
Теперь пользователи могут перейти только в те группы, в которые разрешил администратор.
Honko 5 лет назад #
SpideR 5 лет назад #
Red-Ray.Ru 5 лет назад #
RSN 5 лет назад #
Да, и кстати отличны способ монетизировать разработку, кто хочет может изменять файлы по этой инструкции, а кто не хочет, может купить готовое решение.
Впрочем это конечно Вам решать.
И да, в случае компонента было бы неплохо добавить виджет (который можно разместить где удобно) с кнопками перехода в группу.
Зарегистрировался на сайте, попал в группу например "Новые", а дальше уже видишь кнопки виджета и выбираешь в какую группу надо...
(Такой упрощенный вариант, что бы не решать вопрос как регистрировать Гостя...).
Александр 5 лет назад #
У smartcontrol был платный компонент который в том числе мог делать переход/вступление/выход по ссылке, но выше 2.10 он неработает
Donto 5 лет назад #
lesterkey 5 лет назад #
Как я вижу?: Автор предложил решение , за что ему огромный респект и жирный плюс!
Но по моему данное бесплатное решение может подойти в одном варианте: если есть скажем закрытый корпоративный сайт, где сотрудники сами наполняют его с учетом наделенных прав. и после регистрации они с легкостью могут выбрать свою группу и продолжить работать!
А уж если говорить о (Вебмастерах, разработчиках или рекламодателях) ,тут конечно надо смотреть что мы хотим получит от сайта на "выхлопе". если уж люди хотят зарабатывать или продавать на вашем проэкте то почему бы не взять с низ "мзду"...?
Так что есть отличный компонент Биллинг пользователей который решает все задачи сразу... + дает массу других возможностей.. (создал тарифный план Рекламодатель дал описание. назначил цену перехода в эту группу и время (например на год.) Человек зарегистрировался... захотел дать рекламку, купил тариф... получил право на рекламу и дело в шляпе.. прошел год человек опять пользователь...
Так что ОГРОМНОЕ спасибо за дополнение и развитие InstantCMS... ставим автору лайки и стимулируем его на дальнейшие идеи...
Простите меня если кого то зацепил!
RSN 5 лет назад #
Если об моем предложении, может я не правильно выразился... я имел ввиду монетизацию для автора (а не нас вебмастеров)..., что Red Ray может сделать платный компонент))
... кто хочет делает себе бесплатно по инструкции, или покупает компонент (если не хочет возится с кодом)...
Относительно использования я привел лишь пример на вопрос:
Естественно использовать можно на сколько хватит ума и фантазии мастера))
Эндрю Ua 5 лет назад #