Курс цен производителей

Всем привет. Делаю курс цен от производителя. Нужно к ценам умножать курс от производителя для price и old_price, если производитель у товара не указан, то выводить глобальный курс, который создан в системных настройках. Не самый изящный способ использовал. Добавил новое поле `curs` в таблицу ms2_vendors изменения в файлах модели, схемы и extjs, чтобы добавить новое поле с курсом пересчёта и установил на эти файлы CHMOD 444, чтоб при обновлении эти файлы не затёрлись.

/site.ru/core/components/minishop2/model/minishop2/msvendor.class.php
/site.ru/core/components/minishop2/model/schema/minishop2.mysql.schema.xml
/site.ru/assets/components/minishop2/js/mgr/settings/vendor/grid.js
/site.ru/assets/components/minishop2/js/mgr/settings/vendor/window.js

Затем написал плагин:

CursPrice и повесил на события msOnGetProductPrice, msOnChangeInCart, msOnAddToCart и msOnRemoveFromCart.

Код плагина:
<?php
switch ($modx->event->name) {
	case 'msOnGetProductPrice': case 'msOnChangeInCart': case 'msOnAddToCart': case 'msOnRemoveFromCart':

        $curs_global = $modx->getOption('ms2_curs_global');
        $curs_global_enable = $modx->getOption('ms2_curs_global_enable');
        $product = $modx->getObject('msProduct', $data['id']);
        $curs = $product->get('vendor.curs');
        $old_price = $product->get('old_price');

		// Подключаем массив значений по ссылке - так удобнее
		if (!isset($modx->event->returnedValues['old_price'])) {
			$modx->event->returnedValues['old_price'] = $old_price;
		}
		$old_price = & $modx->event->returnedValues['old_price'];
		$values = & $modx->event->returnedValues;
        
        
        if($curs_global_enable != 1) {
		// Удваиваем цену:
    		$values['price'] = $price * $curs;
    		$old_price = $old_price * $curs;
        } else {
            $values['price'] = $price * $curs_global;
    		$old_price = $old_price * $curs_global;
        }
        //exit(var_dump($old_price));
	break;
}

Вот такая форма у страницы с товаром:

<form class="variants ms2_form count" method="post">
                                <input type="hidden" name="id" value="{$_modx->resource.id}"/>
                                <input type="hidden" name="count" value="1"/>
                                <input type="hidden" name="options" value="[]">
                                <ul class="feature">
                                    {if $model != ''}
                                    <li>
                                        <span class="feature-title">Модель:</span>
                                        <span>{$model}</span>
                                    </li>
                                    {/if}
                                    {if $vendor != ''}
                                    <li>
                                        <span class="feature-title">Производитель:</span>
                                        <span>[[!+vendor.name]]</span>
                                    </li>
                                    {/if}
                                    {if $lenght != ''}
                                    <li>
                                        <span class="feature-title">Длина (см.):</span>
                                        <span>{$lenght} </span>
                                    </li>
                                    {/if}
                                    {if $width != ''}
                                    <li>
                                        <span class="feature-title">Ширина (см.):</span>
                                        <span>{$width} </span>
                                    </li>
                                    {/if}
                                    {if $height != ''}
                                    <li>
                                        <span class="feature-title">Высота (см.):</span>
                                        <span>{$height}</span>
                                    </li>
                                    {/if}
                                    {if $made_in != ''}
                                    <li>
                                        <span class="feature-title">Страна:</span>
                                        <span>{$made_in}</span>
                                    </li>
                                    {/if}
                                    {if $guarantee != ''}
                                    <li>
                                        <span class="feature-title">Гарантия:</span>
                                        <span>{$guarantee}</span>
                                    </li>
                                    {/if}
    
                                </ul>
                                <div class="price clearfix">
                                    <span id="price">{$price}</span> руб
                                    {if $old_price != 0}
                                    <span class="old"><strike>{$old_price}</strike></span> руб
                                    {/if}
                                </div>
                                <div class="submit">
                                    <button 
                                        class="quickview" 
                                        name="ms2_action" 
                                        type="submit" 
                                        value="cart/add"
                                        data-click
                                        data-quickview-mode="modal"
                                        data-data-action="snippet"
                                        data-data-element="!msCart"
                                        data-dialog-title="Товары в корзине:"
                                        data-dialog-buttons='{
                            			    "title":"Оформить заказ","label":"Продолжить покупки"
                            		    }'>Купить</button>
                                </div>
    
                            </form>
Используется Quickview при клике на кнопку Купить и сразу добавляется товар в это модальное окно. Нужно чтобы при нажатии на кнопку Купить в корзину товар клался с уже изменённой ценой.
SEQUEL.ONE
22 марта 2018, 13:56
modx.pro
1
1 375
0

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

Aleksandr Huz
22 марта 2018, 18:16
0
Как-то все сложно.

Разве не можно, поменять цену через сниппет?
Примерно так:
if( $input == 0 ) return 0;
$input = floatval(str_replace(array(' ',','), array('','.'), $input));

// глобальный курс
$curs_global = $modx->getOption('ms2_curs_global');

// узнаем есть ли курс для данного товара
$product = $modx->getObject('msProduct', $id);
$curs = $product->get('curs') ?:  $curs_global;

// устанавливаем новую цену
$new_price = $input * $curs;

// форматируем цену и возвращаем ее
return number_format($new_price ,(floor($new_price) == $new_price ? 0 : 2),'.',' ');

и создаем плагин:
if($modx->event->name != 'msOnGetProductPrice') return;
$values = & $modx->event->returnedValues;
$resource = $modx->getObject('msProduct', $product->id);
$values['price'] = preg_replace('/\s/', '', $_REQUEST['price']);
    SEQUEL.ONE
    22 марта 2018, 18:19
    0
    А при добавлении товара в корзину цена будет уже с курсом или без? И мне ещё нужно старую цену по тому же алгоритму обновлять.
      Aleksandr Huz
      22 марта 2018, 18:48
      0
      да. Прочитайте статью
        SEQUEL.ONE
        22 марта 2018, 19:18
        0
        Хорошая статья, но не нашёл как всё таки модифицировать старую цену old_price?
          SEQUEL.ONE
          22 марта 2018, 19:46
          0
          Цена из price меняется в карточке товара и в корзине. Но вот не пойму как менять цену old_price? Она не меняется. Вот код плагина:
          <?php
          switch ($modx->event->name) {
          	case 'msOnGetProductPrice': case 'msOnChangeInCart': case 'msOnAddToCart': case 'msOnRemoveFromCart':
          		// Плагин принимает:
          		// $product - объект msProductData
          		// $data - массив со свойствами товара, может отсутствовать
          		// $price - текущая цена товара
          
                  $curs_global = $modx->getOption('ms2_curs_global');
                  $curs_global_enable = $modx->getOption('ms2_curs_global_enable');
                  $product = $modx->getObject('msProduct', $data['id']);
                  $curs = $product->get('vendor.curs');
          
          		// Подключаем массив значений по ссылке - так удобнее
          		$values = & $modx->event->returnedValues;
          		
          		$old_price = $product->get('old_price');
          		$values['old_price'] = $old_price;
          
          		// Цена может меняться несколькими плагинами сразу, поэтому проверяем:
          		if (isset($values['price'])) {
          			$price = $values['price'];
          		}
          		
          		if (isset($values['old_price'])) {
          			$old_price = $values['old_price'];
          		}
                  if($curs_global_enable != 1) {
          		// Удваиваем цену:
              		$values['price'] = $price * $curs;
              		$values['old_price'] = $old_price * $curs;
                  } else {
                      $values['price'] = $price * $curs_global;
              		$values['old_price'] = $old_price * $curs_global;
                  }
          		
          		//exit(var_dump($curs));
          	break;
          }
            Aleksandr Huz
            24 марта 2018, 18:49
            0
            В статье написано:

            Если цена товара меняется после прохождения через плагин-модификатор, то оригинальное значение помещается в old_price, а его значение уже больше никого не интересует.
            и
            Свойства old_price заменяется и его нигде не видно, кроме админки — напоминаю еще раз.
            Может можно добраться до старой цены через $data
            $data['old_price']
              SEQUEL.ONE
              24 марта 2018, 18:54
              0
              $data['old_price']
              выводит то что в поле old_price в админке задано, через плагин я получаю старую цену, но она не изменяется по формуле.
                Aleksandr Huz
                24 марта 2018, 20:26
                0
                Попробуйте тогда через дополнительное поле (tv).
                  SEQUEL.ONE
                  29 марта 2018, 20:14
                  0
                  А каким образом сохранить значение old_price в поле TV? На какое событие нужно повесить чтобы это заработало?

                  $oldPrice = $product->get('old_price');
                          
                          $resource = $modx->getObject('modResource',$data['id']);
                          if ($resource) {
                          	$resource->getTVValue('old_price', $oldPrice);
                          	$resource->save();
                          }
                          $tvOldPrice = $resource->getTVValue('old_price');
                          exit(var_dump($tvOldPrice));
                    Aleksandr Huz
                    30 марта 2018, 10:43
                    0
                    getTVValue — получение значения
                    setTVValue — запись нового значения
      Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
      10