Предисловие
После прочтения этого топика 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/