Курс цен производителей
Всем привет. Делаю курс цен от производителя. Нужно к ценам умножать курс от производителя для price и old_price, если производитель у товара не указан, то выводить глобальный курс, который создан в системных настройках. Не самый изящный способ использовал. Добавил новое поле `curs` в таблицу ms2_vendors изменения в файлах модели, схемы и extjs, чтобы добавить новое поле с курсом пересчёта и установил на эти файлы CHMOD 444, чтоб при обновлении эти файлы не затёрлись.
Затем написал плагин:
CursPrice и повесил на события msOnGetProductPrice, msOnChangeInCart, msOnAddToCart и msOnRemoveFromCart.
Код плагина:
Вот такая форма у страницы с товаром:
/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 при клике на кнопку Купить и сразу добавляется товар в это модальное окно. Нужно чтобы при нажатии на кнопку Купить в корзину товар клался с уже изменённой ценой. Комментарии: 10
Как-то все сложно.
Разве не можно, поменять цену через сниппет?
Примерно так:
и создаем плагин:
Разве не можно, поменять цену через сниппет?
Примерно так:
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']);
А при добавлении товара в корзину цена будет уже с курсом или без? И мне ещё нужно старую цену по тому же алгоритму обновлять.
да. Прочитайте статью
Хорошая статья, но не нашёл как всё таки модифицировать старую цену old_price?
Цена из 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;
}
В статье написано:
Если цена товара меняется после прохождения через плагин-модификатор, то оригинальное значение помещается в old_price, а его значение уже больше никого не интересует.и
Свойства old_price заменяется и его нигде не видно, кроме админки — напоминаю еще раз.Может можно добраться до старой цены через $data
$data['old_price']
$data['old_price']
выводит то что в поле old_price в админке задано, через плагин я получаю старую цену, но она не изменяется по формуле.
Попробуйте тогда через дополнительное поле (tv).
А каким образом сохранить значение 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));
getTVValue — получение значения
setTVValue — запись нового значения
setTVValue — запись нового значения
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.