Последние темы


Мультивалютность + param_edit – пересчет доп. параметров с ценой в текущую валюта.

  • Установлена Демо-сборка автора - MODx 2.5.5 + Shopkeeper 3.2.6. Проведено обновление MODx до версии 2.7.1.

    Мультивалютность - пересчета цены param_edit.

    Задача: Реализовать визуализацию пересчета цены дополнительных параметров, выводимых через tv с типом ввода param_edit, по курсу в текущую валюту сайта (выбранную пользователем).

    Проблема состоит в том, что из коробки нет пересчета цен доп. параметров с ценой, и они всегда выводятся в той валюте, в которой заданы в карточке товара. Хотя при добавлении товара в корзину пересчет по валютам производится корректно:
    0_1555053969076_2.jpg
    На странице товара получаем:
    0_1555053992578_1.jpg

    На сегодняшний день этот момент автором не решен, очень надеюсь, что хотя разработка Shopkeeper 3 остановлена, но все же Андрей в будущем выпустит еще для нас обновление Shopkeeper-а 3.хх, и тогда этот момент будет учтен.

    По докам вывод производится так:

    <div class="product-price">
    	Цена: <span class="shk-price">[[!*price:shk_curr_rate:num_format]]</span>
    	[[!+shk_currency]]
    </div>
    
    <div class="padding-lr-30">
    	<h5>Дополнительные услуги</h5>
    	[[*params:replace=`[[+id]]==[[*id]]`]]
    </div>
    

    Т.е. доп. параметры выводятся с помощью модификатора replace, преобразованием данных из tv params. В итоге в html-коде на странице товара получаем набор чекбоксов:

    <div class="padding-lr-30">
      <h5>Дополнительные услуги</h5>
      <div><input class="shk_param" type="checkbox" name="params__15__0" value="0__500" id="params150" onclick="SHK.additOpt(this)" /> <label for="params150">Установка ПО</label></div>
      <div><input class="shk_param" type="checkbox" name="params__15__1" value="1__1000" id="params151" onclick="SHK.additOpt(this)" /> <label for="params151">Гарантия +1 год</label></div>
    </div>
    

    Соответственно цены доп. параметров выводятся в value="0__500" и value="1__1000", и по клику по чекбоксу запускается обработчик onclick="SHK.additOpt(this)", который находится в файле /assets/components/shopkeeper3/web/js/shopkeeper.js.

    *(Внимательно смотреть что подключается в чанке head. В моем случае этот чанк подгружается из файла assets/template/head_dev.html).

    Я решил этот момент следующим образом:

    В оригинальном файле shopkeeper.js в стр. 771 обработчик произвел подсчет суммы цен выбранных доп. параметров и поместил ее в переменную additPriceSum.
    стр. 771. additPriceSum = this.round(additPriceSum,2);
    и далее в стр. 772 формируется тег <sup> … </sup>, в который и выводится суммарная цена выбранных доп. параметров.
    Значит, достаточно знать курс текущей валюты по отношению к базовой и пересчитать эту переменную, умножив на текущий курс. Но где взять текущий курс?

    Вариантов решения несколько, например, использовать сниппет shkOptions, как рекомендовал Андрей кому-то, в одной из тем.:

    [[!shkOptions?
    &get=`currency_rate`
    &post_name=`currency_rate`
    &toPlaceholders=`1`
    &pl_prefix=`shkopt_`
    &tpl=`shkOptionsTpl`
    ]]
     [[!+shkopt_currency_rate]]
    

    Пример чанка (tpl) shkOptionsTpl:

    <p>id=[[+id]], value=[[+value]], label=[[+label]]</p>
    

    И дальше что-то с этим делать я не стал разбираться (глубоко нырять нужно).

    Кстати, нигде в доках не написано про параметр &get=**currency_rate**, с названием поля в таблице БД - currency_rate. Есть упоминания об этом и показаны примеры для Доставки и Оплаты. А вот за именем currency_rate пришлось лезть в БД и там его искать (А может я доки курил уже накуренный 🙂 ).

    Но я пошел другим путем. Хотя мне очень не хотелось править оригинальный файл, но все же решил, что для моей задачи такое решение приемлемо, а обновление SHK 3 не предвидеться в обозримом будущем.

    Итак, Создаю сниппет, например myCarentKurs, в котором высчитываю курс текущей валюты по отношению к базовой, и помещаю его в невидимый блок с **" :

    <?php
    $kurs=$tv_price_curr_rate/$tv_price ;
    echo '<div id="curent_kurs" style="display:none;">'.$kurs.'</div>';
    

    И в любом месте в шаблон карточки товара вставляю его вызов:

    [[!myCarentKurs? &tv_price=`[[!*price]]` &tv_price_curr_rate=`[[!*price:shk_curr_rate]]`]]
    

    В вызове сниппета использую модификатор shk_curr_rate, который корректно пересчитает базовую цену по курсу заданному в настройках Shopkeeper-a (Приложения – Управление заказами - Настройки). Соответственно прописываю выводимому блоку свойство style="display:none;", посетителю не нужно видеть этот блок.
    И теперь в js нужно отловить значение курса в этом блоке, ловлю id со значением curent_kurs.
    Для этого оригинальную строку 772:

    $( '.shk-price:first', parent ).after('<sup id="add_'+productId+'" class="price-add">' + ( additPriceSum > 0 ? '+' : '' ) + additPriceSum + '</sup>');
    

    Заменяю на следующий код:

    /*мои дополнения 1*/
    // Ловлю тег с id="curent_kurs", сформированный сниппетом myCarentKurs. Пример: <div id="curent_kurs" style="display:none;">27,5</div> 
    var curent_kurs = document.getElementById('curent_kurs').textContent; //Получаю значение тега - 27,5
    curent_kurs = curent_kurs.replace(/,/, '.'); //Заменяю запятую на точку, чтобы использовать значение как число
    var additPriceSum_curr_rate = Math.round(additPriceSum * curent_kurs); //Пересчитываю по курсу и округляю до ближайшего целого без копеек. 
    $( '.shk-price:first', parent ).after('<sup id="add_'+productId+'" class="price-add">' + ( additPriceSum_curr_rate > 0 ? '+' : '' ) + additPriceSum_curr_rate + '</sup>');
    /*end мои дополнения 1*/
    

    Внимание! Значение цен в tv-параметре params, должно быть цифрой, т.е. копейки, если они есть, должны быть указаны через точку! 50,25 – не правильно, нужно 50.25

    P.S. Для себя я сделал округление цен доп. параметров до целых, т.е. без копеек.

    С удовольствием почитаю ваши комментарии, а может быть, кроме критики, увидим и реальные предложения или даже улучшения. Они очень нужны, т.к. Андрей вряд ли вернется к этой теме.

  • Теоретически можно было использовать сниппет "param_edit_table"

    [[!param_edit_table?
    &docId=`[[*id]]`
    &tvName=`params`
    &tpl=`properties_checkbox`
    ]]
    

    примерно с таким шаблоном (properties_checkbox):

    [[+inner]]
    <!--tpl_separator-->
    <div>
        <input class="shk_param" type="checkbox" name="params__[[*id]]__[[+idx]]" value="[[+idx]]__[[+field2:shk_curr_rate]]" id="params[[*id]][[+idx]]" onclick="SHK.additOpt(this)">
        <label for="params[[*id]][[+idx]]">[[+field1]]</label>
    </div>
    

    Т.е. здесь используется "shk_curr_rate" для пересчета цены параметра: [[+field2:shk_curr_rate]].

    Но на практике парсер почему-то это не осилил. Даже так: [[shk_curr_rate?input=`[[+field2]]`]]. В сниппет не передается значение плейсхолдера, а передается строка.
    Нет времени разбираться с причинами. Может что-то изменилось в коде MODX с тех пор когда писался сниппет "param_edit_table". Поэтому пока более простого решения я не нашел.

    Но Вы можете поэкспериментировать в этом направлении.

  • Да, на форуме проскальзывала подсказка про использование param_edit_table, но у меня не хватило мозгов быстро этот вариант решить. Благодарю за подробную подсказку с примером. Очень интересно.

 

Последние комментарии

  • Если на Formit повесить хук на отправку данных (в конце списка хуков) в платежную систему и в этом хуке (сниппете) пытаться читать значения shk.id, shk.price, то они содержат значения предыдущего заказа.

    Всё в соответствии с документацией, так и задумано.

    Тоже самое, если вызывать отправку данных через плагин и событие OnSHKSaveOrder.

    А зачем в плагине читать значение плейсхолдера, если там есть переменная $order_id?

    Читать далее
  • R

    Добрый день, коллеги.
    Использую MODx Rev 2.7.1, Shopkeeper 3.2.7.
    Вопрос следующий. Страница оформления заказа, вызываю FormIt, затем [[!$shopOrderFormCart]]. В форме заполняются все необходимые поля, для того чтобы передать в платежную систему. Если на Formit повесить хук на отправку данных (в конце списка хуков) в платежную систему и в этом хуке (сниппете) пытаться читать значения shk.id, shk.price, то они содержат значения предыдущего заказа. Тоже самое, если вызывать отправку данных через плагин и событие OnSHKSaveOrder. Пробовал из скрипта обновлять страницу, не помогает. Актуальная информация появляется в плейсхолдерах только если перенаправлять из страницы оформления заказа на другую html страницу и там читать эти плейсхолдеры. Как получить актуальные значения без пересылки на дополнительную страницу?
    Спасибо.

    Читать далее
  • Читать далее