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


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

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

    Читать далее
  • Теоретически можно было использовать сниппет "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". Поэтому пока более простого решения я не нашел.

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

    Читать далее
  • Установлена Демо-сборка автора - 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. Для себя я сделал округление цен доп. параметров до целых, т.е. без копеек.

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

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

    Большое спасибо за код. Все плагины переворошил из-за бесконечного сохранения, при создании новых ресурсов. Оказалось этот плагин виноват.

    Читать далее