Курс цен от производителей miniShop2 / Готовые решения / MODX

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

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

Нужно к ценам умножать курс от производителя для price, если производитель у товара не указан, то выводить глобальный курс, который создаём системными настройками как ms2_curs_global_enable (включить/выключить) и ms2_curs_global куда мы собственно и забиваем глобальный курс, который включается по настройке ms2_curs_global_enable. Добавил новое поле в таблицу modx_ms2_vendors под названием `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;
}

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

                            <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="[]">
                                <div class="price">
                                    <span id="price">{$price}</span> руб
                                    {if $old_price != 0}
                                    <span class="old"><strike>{$old_price}</strike></span> руб
                                    {/if}
                                </div>
    
                            </form>

P.S. По задаче нужно было ещё править старую цену по тому же алгоритму, но через плагин изменить эту цену у меня не получилось, по этому сделал через jQuery, не самый изящный способ, но зато работает.

Вывод цен в шаблоне товаров выглядит так:

                                <div class="price clearfix">
                                    <span id="price">{$price} руб</span>
                                    <span class="old" data-curs="{$_modx->getPlaceholder('vendor.curs')}" data-curs-global="{$_modx->config.ms2_curs_global}"><strike>{$old_price}</strike> руб</span>
                                </div>

Скрипт в теле шаблона

	<script>
        $(document).ready(function () {
            var oldPrice = jQuery('.old strike').html().replace(/[^0-9.]/g,'');
            var curs = $("span.old").data("curs");
            var cursGlobal = $("span.old").data("curs-global");
            var cursGlobalEnable = {$_modx->config.ms2_curs_global_enable};
            var cursOldPrice = oldPrice * curs;
            var cursOldPriceGlobal = oldPrice * cursGlobal;
            formatOldPrice = (cursOldPrice).toLocaleString('ru');
            formatOldPriceGlobal = (cursOldPriceGlobal).toLocaleString('ru');
            
            if(cursGlobalEnable == 0) {
                jQuery('.old strike').html(formatOldPrice);
                jQuery('.price span.old_price').html(formatOldPrice);
            } else {
                jQuery('.old strike').html(formatOldPriceGlobal);
                jQuery('.price span.old_price').html(formatOldPriceGlobal);
            }
        });
    </script>

Для корзины старую цену получаем также через jQuery, но слегка изменённый под список товаров. В чанке tpl.msCart меняем вывод старой цены следующим образом:

                            {if $product.old_price?}
                                <span class="old_price" id="{$product.id}" data-curs="{$product['vendor.curs']}" data-curs-global="{$_modx->config.ms2_curs_global}"><strike>{$product.old_price}</strike></span> {'ms2_frontend_currency' | lexicon}
                            {/if}

и в самый низ чанка добавляем jQuery

   <script>
        $(document).ready(function () {
            jQuery( 'span.old_price').each( function( index, element) {
                var id = $( element).attr( "id");
                var oldPrice = jQuery('#' + id).html().replace(/[^0-9.]/g,'');
                var curs = $('#' + id).data("curs");
                var cursGlobal = $('#' + id).data("curs-global");
                var cursGlobalEnable = {$_modx->config.ms2_curs_global_enable};
                var cursOldPrice = oldPrice * curs;
                var cursOldPriceGlobal = oldPrice * cursGlobal;
                formatOldPrice = (cursOldPrice).toLocaleString('ru');
                formatOldPriceGlobal = (cursOldPriceGlobal).toLocaleString('ru');
            
                
                if(cursGlobalEnable == 0) {
                    $('#' + id + ' strike').html(formatOldPrice);
                    console.log(id);
                } else {
                    $('#' + id + ' strike').html(formatOldPriceGlobal);
                }
            });
        });
    </script>

Если используем быстрый просмотр корзины из компонента 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":"Продолжить покупки"
                            		    }'
                            		    onclick="setTimeout((function () { return $(this).quickview();}.bind(this)), $.fn.quickview.defaults.timeout) "
                            		    >Купить</button>

Не хитрыми приёмами мы победили злого дракона старую цену.
25 марта 2018, 18:33    SEQUEL.ONE Готовые решения 2    418 +3

Отзывы ()

    Вы должны авторизоваться, чтобы оставлять комментарии.