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

25 march 2018, 16:33

На одном проекте нужно было сделать курс цен от производителей, чтобы была одна глобальная цена и возможность выставлять индивидуальные курсы у производителей. Готовых решений на тот момент не было, по этому пришлось импровизировать. Нужно к ценам умножать курс от производителя для 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>

Не хитрыми приёмами мы победили злого дракона старую цену.

SEQUEL.ONE
2    2790    0
+3

Comments ()

    You need to login to create comments.