Изменение цены в зависимости от группы польз.

Здравствуйте. Пытаюсь самостоятельно изучать modx для себя (ну и возможно в будущем применять свои знания). По большей части большую часть проблем решал методом гугления. Но возникла проблема, которую решить еще не смог.
Я подумал о реализации изменения цены в зависимости от группы в которой находится авторизованный пользователь. Условно, если пользователь в группе «group1», то окончательная стоимость заказа умножается на коэффициент (например, 0.9).
Собирая по крупицам информацию, я решил поменять некоторые функции класса «msCartHandler» (add и change). Т.е. умножив окончательную стоимость на переменную коэффициента. (да, наверняка это топорный способ, но я еще только начинаю).
И тут возник вопрос. Каким образом в этих функциях можно получить переменную коэффициента (которая зависит от группы пользователя).
Заранее благодарю за адекватные ответы.
Владимир
02 февраля 2017, 12:07
modx.pro
1 048
0

Комментарии: 7

Гриборий
02 февраля 2017, 22:59
0
Собственно, тоже возникает вопрос. Ну так а где вы храните этот коэффициент?
    Владимир
    02 февраля 2017, 23:10
    0
    Последовательно проверяя принадлежность к группе пользователя с помощью ветвления, а затем присваивая.
    Примерно таким образом
    if ($currentGroup == "group1") {
    	$coef = 0.9;
    	}
    	else if ($currentGroup == "group2") {
    	$coef = 0.8;
    	}
    	.....
    	else {
    	$coef = 1;
    	}
    Суть моего вопроса в том, чтоб узнать способ получения переменной $currentGroup(название группы в которой находится активный пользователь) в классе «msCartHandler».
      Гриборий
      02 февраля 2017, 23:41
      0
      Мне показалось, что вы спрашивали как получить коэффициент.
      Группу пользователя можно получить так:
      $modx->user->getUserGroupNames();
      Но на выходе будет массив, групп же может быть несколько.
      В виде строки(через запятую, если несколько) можно вот так:
      implode(',',$modx->user->getUserGroupNames());
        Владимир
        03 февраля 2017, 10:07
        0
        Ни одним из этих способов нельзя получить группу пользователя. Т.к. данный класс не знает о данных функциях. Именно по этому и возник данный вопрос. Таким образом можно было написать в снипете. Например, я пробовал изменять сниппет «msCart».
        Добавив в начале:
        if($modx->user->isMember('group1'))
        {
            $coef = 0.9;
        }
        else if ($modx->user->isMember('group2'))
        {
            $coef = 0.8;
        }
        .....
        else
        {
            $coef = 1;
        }
        И изменив подсчет таким образом:
        $outer['total_cost'] +=  $v['count'] * $v['price'] * $v['weight'] * $coef;
        Однако, это работает только при первой загрузке. Т.е. когда мы переходим в корзину то видим сразу новую цену, однако если прямо в корзине поменять что-то (например, удалить товар из корзины или изменить количество), то стоимость опять считается без коэффициента.
    Гриборий
    02 февраля 2017, 23:05
    0
    А если, адекватно, по делу, то перепиливание классов ни к чему хорошему вас не приведет, прекращайте. Классы можно расширять, если есть необходимость. В вашем случае ее нет, можно написать плагин на события минишопа. Ну если вы с хранением коэффициентов для разных групп все уже продумали.
      but1head
      03 февраля 2017, 10:18
      0
      5 минутные оптовые цены на tv. по хорошему плагином товар расширять.
      <?php
      if($modx->event->name != 'msOnGetProductPrice') return;
      
      if($modx->user->id != 0  && $modx->user->isMember('Wholesaler')){
          $values = & $modx->event->returnedValues;
          $resource = $modx->getObject('msProduct', $product->id);
          $wholesale_price = $resource->getTVValue('price_opt');
          if($wholesale_price){
              $values['old_price'] = $values['price'];
              $values['price'] = $wholesale_price;
          }
      }
      upd. думал нужно по товарам, оказывается по всей корзине, вообще у корзины похожее решение, смотрите плагины mscart и msorder.
        Владимир
        03 февраля 2017, 11:47
        0
        Если я вас правильно понял, то вы говорите об изменении сниппетов mscart и maorder, а конкретно добавлением подобного вашему кода. Но если мы будем производить изменения только в этих сниппетах, то цена у нас поменяется только при первоначальной загрузке.
        Например, я положил товар в корзину -> перешел в корзину -> получил правильную стоимость -> поменял кол-во товара\удалил какой-то товар -> стоимость поменялась на стоимость без коэффициента.
        Я думал о написании какого-то плагина, однако почти полностью не понимаю процесс подключения плагина (в частности — создание контроллера). Скорее всего из-за недостатка опыта, поскольку я еще учусь.
        Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
        7