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


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

Как создать свой хук-элемент в 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
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <element type="element" group="Core" hidden="false">
  3. <name>Change user group</name>
  4. <author>SmetDenis</author>
  5. <creationDate>2015</creationDate>
  6. <copyright>Copyright (C) JBZoo.com</copyright>
  7. <authorEmail>admin@jbzoo.com</authorEmail>
  8. <authorUrl>http://jbzoo.com</authorUrl>
  9. <version>1.0</version>
  10. <description></description>
  11.  
  12. <params>
  13. <!-- опция, заменять права на новые, или просто добавить -->
  14. <param name="merge" type="jbbool" default="1" label="Replace groups"/>
  15.  
  16. <!-- специальное поле - список прав пользователя -->
  17. <param name="add_group" type="jbusergroups" default="" label="Add new group"/>
  18. </params>
  19.  
  20. </element>
 
changegroup.php
  1. <?php
  2. // no direct access
  3. defined('_JEXEC') or die('Restricted access');
  4.  
  5. /**
  6. * Class JBCartElementHookChangegroup
  7. */
  8. class JBCartElementHookChangegroup extends JBCartElementHook
  9. {
  10.     /**
  11. * Метод будет вызван когда корзина выполнит одно из событий
  12.      * @param $params
  13.      */
  14.     public function notify($params = array())
  15.     {
  16.         // берем пользователя из заказа
  17. $user = $this->getOrder()->getAuthor();
  18.  
  19.         if ($user && $user->id) { // убеждаемся, что это не аноним
  20.  
  21.             $values = (array)$this->config->get('add_group', array()); // берем настройки
  22.  
  23.             $newGroups = array_combine($values, $values); // собираем массив групп в формате, который требует API Joomla
  24. // Проверяем опцию, объединять или заменять группы пользователя
  25.             if ($this->config->get('merge', 1)) {
  26.                 $newGroups = $newGroups + (array)$user->groups;
  27.             }
  28.  
  29. // Указываем новые группы пользователю из заказа
  30.             JUserHelper::setUserGroups($user->id, $newGroups);
  31.         }
  32.     }
  33.  
  34.     /**
  35. * Для того чтобы элемент смог найти уникальные типы полей для настроек
  36.      * @return AppParameterForm
  37.      */
  38.     public function getConfigForm()
  39.     {
  40.         return parent::getConfigForm()->addElementPath(dirname(__FILE__));
  41.     }
  42. }

jbusergroups.php
Это файл нужен для вывода списка групп в настройках элемента
Код взят из Joomla 3.4 libraries\cms\form\field\usergrouplist.php
  1. <?php
  2. // no direct access
  3. defined('_JEXEC') or die('Restricted access');
  4.  
  5. // выбираем список существующих пользователя из базы данных
  6. $db = JFactory::getDbo();
  7. $query = $db->getQuery(true)
  8. ->select('a.id AS value')
  9. ->select('a.title AS text')
  10. ->select('COUNT(DISTINCT b.id) AS level')
  11. ->from('#__usergroups as a')
  12. ->join('LEFT', '#__usergroups AS b ON a.lft > b.lft AND a.rgt < b.rgt')
  13. ->group('a.id, a.title, a.lft, a.rgt')
  14. ->order('a.lft ASC');
  15. $db->setQuery($query);
  16.  
  17. $data = array();
  18. if ($options = $db->loadObjectList()) {
  19. foreach ($options as &$option) {
  20. $data[$option->value] = str_repeat('- ', $option->level) . $option->text;
  21. }
  22. }
  23.  
  24. // выводим HTML селекта
  25. 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!