На одном проекте нужно было сделать курс цен от производителей, чтобы была одна глобальная цена и возможность выставлять индивидуальные курсы у производителей. Готовых решений на тот момент не было, по этому пришлось импровизировать. Нужно к ценам умножать курс от производителя для price, если производитель у товара не указан, то выводить глобальный курс, который создаём системными настройками как ms2_curs_global_enable (включить/выключить) и ms2_curs_global куда мы собственно и забиваем глобальный курс, который включается по настройке ms2_curs_global_enable. Добавил новое поле в таблицу modxms2vendors под названием curs
, а также добавил изменения в файлах модели, схемы и 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.
Код плагина:
<?php
switch ($modx->event->name) {
case 'msOnGetProductPrice':
$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');
$oldPrice = $product->get('old_price');
if (!isset($modx->event->returnedValues['price'])) {
$modx->event->returnedValues['price'] = $price;
}
$price = &$modx->event->returnedValues['price'];
//exit(var_dump($values['price']));
if($curs_global_enable != 1) {
$price = $price * $curs;
} else {
$price = $price * $curs_global;
}
break;
}
Вот такая форма у страницы с товаром:
<input name="id" type="hidden" value="{$_modx->resource.id}"/><br>
{$price} руб {if $old_price != 0} {$old_price} руб {/if}
P.S. По задаче нужно было ещё править старую цену по тому же алгоритму, но через плагин изменить эту цену у меня не получилось, по этому сделал через jQuery, не самый изящный способ, но зато работает. Вывод цен в шаблоне товаров выглядит так:
{$price} руб {$old_price} руб
Скрипт в теле шаблона
Для корзины старую цену получаем также через jQuery, но слегка изменённый под список товаров. В чанке tpl.msCart меняем вывод старой цены следующим образом:
{if $product.old_price?}
<span id="{$product.id}" class="old_price" data-curs="{$product['vendor.curs']}" data-curs-global="{$_modx->config.ms2_curs_global}"><span style="text-decoration: line-through;">{$product.old_price}</span></span> {'ms2_frontend_currency' | lexicon}
{/if}
и в самый низ чанка добавляем jQuery
...
Если используем быстрый просмотр корзины из компонента QuickView то вывод кнопки с корзиной будет выглядеть так:
<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>
Не хитрыми приёмами мы победили злого дракона старую цену.
Comments ()