Minishop2 и CityFields - коэффициент переоценки для всего города

Добрый день!
В общем, есть магазин на Minishop2 и есть дополнение CityFields. И есть необходимость сделать опцию в cityFields с коэффициентом переоценки (к примеру — «20» — это "+20% к базовой цене", "-10" — это «базовая цена — 10%»). Тогда просто при выборе нужного города сразу должны показываться нужные, правильные цены.
Я знаю, что в этом дополнении уже есть встроенная функция переоценки в зависимости от выбранного города. Но она нам не подходит, так как городов несколько сотен, а товаров — пока около 5 тысяч и впоследствии на переоценку будет тратиться просто тонна времени.
Понимаю, что скорее всего, вопрос может показаться глупым или именно такая затея переоценки странной, но надо именно так.

Я примерно понимаю, что это должен быть какой-то плагин на событие получения стоимости товара. По аналогии с плагином дополнения написал вот такую конструкцию, но цена не меняется(
<?php
if (!$modx->getOption('cityfields_active')) return false;

$cityFields = $modx->getService('cityfields','cityFields',$modx->getOption('cityfields.core_path',null,$modx->getOption('core_path').'components/cityfields/').'model/cityfields/',$scriptProperties);
if (!($cityFields instanceof cityFields)) return false;
switch($modx->event->name) {
    case 'msOnGetProductPrice':
        $field = $modx->getObject('cfField', array(
            'city_id' => $cityFields->currentCityId,
            'placeholder' => 'price-koeff'
        ));
        if ( $field ) {
            $modif = (float) $field->get('value');
            $values = & $modx->event->returnedValues;
            $values['price'] += $values['price']*$modif / 100;
        }
        echo $values['price'];
        break;
}
Подскажите, пожалуйста, в чем может быть проблема? Или может я совсем в неправильную сторону пошел и есть какое-то более грамотное решение. Ну или может кто-то что-то такое уже реализовывал на своих проектах…

В общем, заранее благодарен за любой совет
Николай
27 июня 2020, 08:06
modx.pro
779
0

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

Максим
27 июня 2020, 12:50
+1
Вопрос первый: Вы само событие включили (поставить галочку в поле Включен на вкладке Системные события)
Вопрос второй: Удалось получить результат работы этой строки:
echo $values['price'];
. Для отладки нужно использовать:
$modx->log(modX::LOG_LEVEL_ERROR, print_r($value['price'], 1))
. Результат будет в журнале ошибок.
И теперь, если событие включено и уже зная как дебажить, то можем приступать к дебагу.
В коде есть 3 условия из-за которых результат может быть не удовлетворительным, соответственно и проверяем эти условия.
    Николай
    27 июня 2020, 13:57
    0
    Благодарю за ответ!!! И за подсказку про отладку, для новичка очень полезная функция!

    Да, событие включил — «msOnGetProductPrice». Это было первое, на чем споткнулся, но сообразил))
    По второму вопросу — нет, не выводит. При этом, значение коэффициента для города поймал, вывел. Получается, неверно получаю базовую цену товара. Сейчас копаю в этой стороне.
      Максим
      27 июня 2020, 14:02
      +1
      Вообще, насколько я понимаю, то
      $modx->event->returnedValues
      используется только для вывода, а для того, а цена будет в переменной
      $price
      на основании данного кода:
      $params = array(
                      'product' => $this,
                      'data' => $data,
                      'price' => $price,
                  );
                  $response = $miniShop2->invokeEvent('msOnGetProductPrice', $params);
      Поэтому вот эту строчку
      $values['price'] += $values['price']*$modif / 100;
      нужно переписать на
      $values['price'] = $price * $modif / 100;
        Николай
        27 июня 2020, 14:29
        0
        Действительно, цена лежит в $price. Теперь цену поймал, при смене города корректно выводит в журнал верные значения.
        а это будет совсем наглостью спросить, как после этого всего заставить отображать на сайте модифицированную цену?
        Что-то наподобие такого?
        $product->set('price', $values['price']);
          Николай
          27 июня 2020, 14:41
          0
          Также и по аналогии с этим вполне рабочим примером (пробовал на тестовом сайте modhost), конструкция
          $values['price'] = ($price * $modif / 100) + $price;
          сама по себе работает, в журнале выводит, а на этом сайте не хочет.
          Пока из мыслей только, что родной плагин cityfiled может отлавливать это же событие и не давать менять.
            Максим
            27 июня 2020, 17:59
            +1
            Должно отработать так:
            $values = & $modx->event->returnedValues;
            $values['price'] = ($price * $modif / 100) + $price;
            Вот описание
              Николай
              27 июня 2020, 18:56
              0
              Ну по логике — да, вроде должно. Но почему-то не идет.
              Для чистоты эксперимента еще раз собрал на тестовом сайте, чтобы исключить влияние каких-то других событий, плагинов и дополнений.
              В итоге на тестовом все заработало после устновки приоритета плагина на значение «1».
              Значит, Ваше решение верное (За что Вам огромное спасибо!!!), надо просто поймать, что мешает работе.

              А если кому-то тоже понадобится — вот рабочее решение:

              <?php
              if (!$modx->getOption('cityfields_active')) return false;
              
              $cityFields = $modx->getService('cityfields','cityFields',$modx->getOption('cityfields.core_path',null,$modx->getOption('core_path').'components/cityfields/').'model/cityfields/',$scriptProperties);
              if (!($cityFields instanceof cityFields)) return false;
              switch($modx->event->name) {
                  case 'msOnGetProductPrice':
                      $field = $modx->getObject('cfField', array(
                          'city_id' => $cityFields->currentCityId,
                          'placeholder' => 'price-koeff'
                      ));
                      if ( $field ) {
                          $modif = (float) $field->get('value');
                          $values = & $modx->event->returnedValues;
                          $values['price'] = ($price * $modif / 100) + $price;
                      } 
                      break;
              };
              
               $modx->log(modX::LOG_LEVEL_ERROR, print_r($values['price'], 1));
    Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
    7