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


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

Dirty hack элемента цены - доступность выбора опций цены для разных групп пользователей


Лучший Ответ SmetDenis , 01 February 2016 - 19:06

Эх, не успел ответить :(

 

Список опций у элемента формируется тут

media\zoo\applications\jbuniversal\cart-elements\price\option\option.php _getOptions()

Можно сделать проверку на $this->identifier т.к. класс JBCartElementPriceOption наследуется и используется для разных элементов одновременно.

 

Либо сделать свой тип элемента и там переопределить _getOptions, тогда не будет хаков.

 

Далее этот список используется для валиадции при добавлении товара в корзину. Но это уже другая история.

Перейти к сообщению


  • Закрытая тема Тема закрыта
Сообщений в теме: 2

#1 Станислав

Станислав

Отправлено 01 February 2016 - 05:19

В общем-то, 50% задачи уже решено, но заклинило.

 

Итак, имеем элемент JBPricePlain и 2 списка параметров (селекты):

а) размер - "72mm", "85mm", "92mm"

б) категория покупателя - "Level 1", "Level 2", "Level 3"

В настройках элемента цены в шаблоне в поле "Подсказка" внесено 0mm и "Retail" в первый и второй селект соответственно.

 

Таким образом, для опций селектов массивы $key будут принимать значения:

а) {"0mm", "72mm", "85mm", "92mm" }

б) {"Retail", "Level 1", "Level 2", "Level 3"}

 

Для товара забиты вариации цены в зависимости от размера (4 размера) и категории покупателей (4 категории) - итого 4х4 = 16 вариаций. Для каждого размера - свой артикул, всего 4 артикула. Цена по умолчанию с параметрами по умолчанию "0mm", "Retail".

 

Для привязки категорий покупателей к учетным записям Joomla заведено 3 группы пользователей с именами Level 1, Level 2, Level 3 и id равными 11, 12 и 13 соответственно + группа для менеджеров Local Manager (id = 10) и SuperUsers (id= 8), которые должны видеть с морды сайта все вариации.

 

Дальше в код моего шаблона (скопированного из базового) /templates/uikit/cart-elements/price/options/tmpl/select.php добавлен небольшой код, который определяет группу текущего пользователя и определяет его уровень доступа. Затем в зависимости от уровня доступа, корректируется массив $data, который передаются в селект с уровнями пользователей.

<?php
/**
 * JBZoo App is universal Joomla CCK, application for YooTheme Zoo component
 * @package     jbzoo
 * @version     2.x Pro
 * @author      JBZoo App http://jbzoo.com
 * @copyright   Copyright (C) JBZoo.com,  All rights reserved.
 * @license     http://jbzoo.com/license-pro.php JBZoo Licence
 * @coder       Alexander Oganov <t_tapak@yahoo.com>
 */

// no direct access
defined('_JEXEC') or die('Restricted access');

/* Begin of custom code */
$user = JFactory::getUser();
$groups = $user->get('groups');

$userLevel = 0;
foreach($groups as $group) {
    if ($group == 11) {$userLevel = 1; break; }
    if ($group == 12) {$userLevel = 2; break; }
    if ($group == 13) {$userLevel = 3; break; }
    if ($group == 10) {$userLevel = 4; break; }
    if ($group == 8 ) {$userLevel = 5; break; }
}

$existRetail = array_search( 'Retail', $data);
if ($existRetail !== false)
{
    if ($userLevel == 0) { $data = array_slice($data, 0, 1); }
    if ($userLevel == 1) { $data = array_slice($data, 1, 1); }
    if ($userLevel == 2) { $data = array_slice($data, 2, 1); }
    if ($userLevel == 3) { $data = array_slice($data, 3, 1); }
    if ($userLevel == 4) { $data = array_slice($data, 0, 4); }
    if ($userLevel == 5) { $data = array_slice($data, 0, 4); }
}
/* End of custom code */
?>

<span class="uk-form jbprice-option-select">
    <?php echo $this->_jbhtml->select($data, $this->getRenderName('value'), null, $this->getValue());?>
</span>)

В итоге с селектами получилось, как и задумывалось. Каждая группа пользователей имеет доступ только к своему уровню цен и всем размерам товара. В селекте выбора типа цены для групп Level 1 , Level 2, Level 3 осталась только одна опция соответствующая их группе, а менеджер и суперадминистратор имеют доступ ко всем группам цен и могут их переключать.

 

Но осталась одна загвоздка: значение цены остается дефолтным, что ожидаемо, так как значения селектов поправлены, но обновления значения цены согласно вариации не произведено. Надо либо отрендерить значение цены, согласно данным о вариациях в селектах, либо программно "передернуть" ajaxChangeVariant в элементе JBPricePlain

 

К сожалению, для меня API вариаций цены покрыт туманом и мраком и попытки разобраться самостоятельно не увенчались успехом. Разработчики, помогите! Скорее всего, мой путь в корне неправильный и есть возможность изменить массив вариаций не во время рендеринга селектов, а на этапе считывания вариаций, но увы, где искать первоначальное получение вариаций и цен, чтобы изменить их до начала рендеринга, я так и не разобрался...


Сообщение отредактировал Станислав: 01 February 2016 - 05:24

  • 1

«Ну и зачем все это, лучше бы водки выпили». Из писем Белинского Гоголю.

 


#2 Станислав

Станислав

Отправлено 01 February 2016 - 15:50

Разобрался с API. Тему можно закрывать.


  • 1

«Ну и зачем все это, лучше бы водки выпили». Из писем Белинского Гоголю.

 


#3 SmetDenis

SmetDenis

Отправлено 01 February 2016 - 19:06   Лучший Ответ

Эх, не успел ответить :(

 

Список опций у элемента формируется тут

media\zoo\applications\jbuniversal\cart-elements\price\option\option.php _getOptions()

Можно сделать проверку на $this->identifier т.к. класс JBCartElementPriceOption наследуется и используется для разных элементов одновременно.

 

Либо сделать свой тип элемента и там переопределить _getOptions, тогда не будет хаков.

 

Далее этот список используется для валиадции при добавлении товара в корзину. Но это уже другая история.


  • 2
JBZoo v4.0 и новый чудный мир Open Source GPL
Отключайте проверку лицензий как можно скорее!



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





Click to return to top of page in style!