Предисловие
После прочтения этого топика http://forum.jbzoo.c.../11293-prodazha ко мне пришла мысль для создания небольшого элемента, который бы менял группу пользователя.
Советую прочитать
Чтобы лучше понимать, зачем нужны хуки рекомендую вам начать с документации - http://jbzoo.ru/docs/cart-hook
Здесь описаны основы для создания любого типа элемента - http://forum.jbzoo.c...c/11447-element
Задача
Обычный зарегистрированный пользователь или гость не видят материалов или специальных полей, потому что им не хватает прав доступа. Увидеть это можно только если у пользователя есть подходящая группа. Как вы знаете, уровень доступа настраивается по группам пользователей. Все уже есть в ACL Joomla / Zoo, без каких либо специальных расширений.
Сложность заключается в том, что доступ мы хотим продавать, а по умолчанию наша корзина этого не умеет.
В этом небольшом рецепте я расскажу как сделать простой элемент-хук, который будет менять группу пользователя (соответственно и доступа), который оплатил свой заказ. Никаких хаков!
Создаем хук
Наш элемент будет называться "Change user group", алиас "changegroup".
Т.к это хук, то положим его в соответствующую папку
/ media / zoo / applications / jbuniversal / cart-elements / hook / changegroup
Первым делом покажу весь код, а ниже принцип работы. Создаем в этой папке несколько файлов.
changegroup.xml
- <?xml version="1.0" encoding="utf-8"?>
- <element type="element" group="Core" hidden="false">
- <name>Change user group</name>
- <author>SmetDenis</author>
- <creationDate>2015</creationDate>
- <copyright>Copyright (C) JBZoo.com</copyright>
- <authorEmail>admin@jbzoo.com</authorEmail>
- <authorUrl>http://jbzoo.com</authorUrl>
- <version>1.0</version>
- <description></description>
- <params>
- <!-- опция, заменять права на новые, или просто добавить -->
- <param name="merge" type="jbbool" default="1" label="Replace groups"/>
- <!-- специальное поле - список прав пользователя -->
- <param name="add_group" type="jbusergroups" default="" label="Add new group"/>
- </params>
- </element>
changegroup.php
- <?php
- // no direct access
- defined('_JEXEC') or die('Restricted access');
- /**
- * Class JBCartElementHookChangegroup
- */
- class JBCartElementHookChangegroup extends JBCartElementHook
- {
- /**
- * Метод будет вызван когда корзина выполнит одно из событий
- * @param $params
- */
- public function notify($params = array())
- {
- // берем пользователя из заказа
- $user = $this->getOrder()->getAuthor();
- if ($user && $user->id) { // убеждаемся, что это не аноним
- $values = (array)$this->config->get('add_group', array()); // берем настройки
- $newGroups = array_combine($values, $values); // собираем массив групп в формате, который требует API Joomla
- // Проверяем опцию, объединять или заменять группы пользователя
- if ($this->config->get('merge', 1)) {
- $newGroups = $newGroups + (array)$user->groups;
- }
- // Указываем новые группы пользователю из заказа
- JUserHelper::setUserGroups($user->id, $newGroups);
- }
- }
- /**
- * Для того чтобы элемент смог найти уникальные типы полей для настроек
- * @return AppParameterForm
- */
- public function getConfigForm()
- {
- return parent::getConfigForm()->addElementPath(dirname(__FILE__));
- }
- }
jbusergroups.php
Это файл нужен для вывода списка групп в настройках элемента
Код взят из Joomla 3.4 libraries\cms\form\field\usergrouplist.php
- <?php
- // no direct access
- defined('_JEXEC') or die('Restricted access');
- // выбираем список существующих пользователя из базы данных
- $db = JFactory::getDbo();
- $query = $db->getQuery(true)
- ->select('a.id AS value')
- ->select('a.title AS text')
- ->select('COUNT(DISTINCT b.id) AS level')
- ->from('#__usergroups as a')
- ->join('LEFT', '#__usergroups AS b ON a.lft > b.lft AND a.rgt < b.rgt')
- ->group('a.id, a.title, a.lft, a.rgt')
- ->order('a.lft ASC');
- $db->setQuery($query);
- $data = array();
- if ($options = $db->loadObjectList()) {
- foreach ($options as &$option) {
- $data[$option->value] = str_repeat('- ', $option->level) . $option->text;
- }
- }
- // выводим HTML селекта
- echo $this->app->jbhtml->select($data, $control_name . '[' . $name . ']', array('multiple' => 'multiple', 'size' => 10), $value);
Как это работает?
Как видите, кода совсем немного и вся логика работы хука сконцентрирована в функции notify().
Я постарался расписать в комментариях все очень подробно, но если не понятно то повторю.
В файле XML, по мимо мета информации, мы указываем два параметра. Обратим внимание на атрибуты "name" и "type". С первым все понятно - по этому имени мы будем обращаться к нему в коде. Второй хитрее, он отвечает за тип контрола, который мы увидим в панели управления.
Полный список параметров можно найти тут (*.php файлы)
administrator\components\com_zoo\helpers\fields
media\zoo\applications\jbuniversal\joomla\elements
Первый параметр у нас булевый jbbool. Покажет обычный выбор да/нет.
Второй параметр - это список групп. Если приглядитесь то в указанных папках нет файла jbusergroups
Именно по этому мы в корень элемента положили jbusergroups.php и добавили метод getConfigForm(), который подключит этот файл. Там мы рендерим HTML своего уникального контрола.
Когда корзина выполнит событие, в котором расположен наш элемент, выполнится метод notify().
Там мы берем автора заказа, берем настройки и указываем новые группы пользователю.
Собственно, вот и все.
Готовый элемент по этим мотивам можно найти в нашем маркете - http://forum.jbzoo.c...oplate-v-jbzoo/