Перейти к содержимому


Фотография
- - - - -

Как создать свой хук-элемент в JBZoo 220?

рецепт хук элемент гайд api acl права пользователь

В этой теме нет ответов

#1 SmetDenis

SmetDenis

Отправлено 19 June 2015 - 12:33

Продолжаем изучать создание элементов
 
Предисловие
После прочтения этого топика 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/
  • 2
JBZoo v4.0 и новый чудный мир Open Source GPL
Отключайте проверку лицензий как можно скорее!



— Есть два типа людей: Кто еще не делает бекапы и кто уже делает бекапы.






Темы с аналогичным тегами рецепт, хук, элемент, гайд, api, acl, права, пользователь

Click to return to top of page in style!