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











