Андрей Копп

Андрей Копп

Был в сети 27 сентября 2018, 12:01
Заказы не принимаю
Рабочий вариант плагина:

<?php
switch ($modx->event->name) {
    case 'msOnChangeInCart': case 'msOnAddToCart': case 'msOnRemoveFromCart':
        $miniShop2 = $modx->getService('minishop2','miniShop2',
        	MODX_CORE_PATH . 'components/minishop2/model/minishop2/', $scriptProperties);
        if (!($miniShop2 instanceof miniShop2)) return '';
        
        // Инициализируем класс в текущий контекст
        $miniShop2->initialize($modx->context->key, $scriptProperties);
        $total_count = $miniShop2->cart->status()['total_count'];
        $tmp = $miniShop2->cart->get();
        if ($total_count > 499) { // если 5 и более товаров - оптовые цены, в интернет-магазине оптовые цены забиваются в поле article
            foreach ($tmp as $key1 => $value) {
                if ($product = $modx->getObject('msProduct', $value['id'])) {
                	$realPrice = $product->get('price');
                	$discount5 = $product->get('discount5');
                	$opt = $realPrice*$discount5/100;
                    $optPrice = $realPrice-$opt;
                	$tmp[$key1]['price'] = $optPrice;
                }
            }
        }
        elseif ($total_count > 99) { // если 10 и более товаров - оптовые цены, в интернет-магазине оптовые цены забиваются в поле article
            foreach ($tmp as $key1 => $value) {
                if ($product = $modx->getObject('msProduct', $value['id'])) {
                	$realPrice = $product->get('price');
                	$discount4 = $product->get('discount4');
                	$opt = $realPrice*$discount4/100;
                    $optPrice = $realPrice-$opt;
                	$tmp[$key1]['price'] = $optPrice;
                }
            }
        }
        elseif ($total_count > 29) { // если 30 и более товаров - оптовые цены, в интернет-магазине оптовые цены забиваются в поле article
            foreach ($tmp as $key1 => $value) {
                if ($product = $modx->getObject('msProduct', $value['id'])) {
                	$realPrice = $product->get('price');
                	$discount3 = $product->get('discount3');
                	$opt = $realPrice*$discount3/100;
                    $optPrice = $realPrice-$opt;
                	$tmp[$key1]['price'] = $optPrice;
                }
            }
        }
        elseif ($total_count > 9) { // если 100 и более товаров - оптовые цены, в интернет-магазине оптовые цены забиваются в поле article
            foreach ($tmp as $key1 => $value) {
                if ($product = $modx->getObject('msProduct', $value['id'])) {
                	$realPrice = $product->get('price');
                	$discount2 = $product->get('discount2');
                	$opt = $realPrice*$discount2/100;
                    $optPrice = $realPrice-$opt;
                	$tmp[$key1]['price'] = $optPrice;
                }
            }
        }
        elseif ($total_count > 4) { // если 500 и более товаров - оптовые цены, в интернет-магазине оптовые цены забиваются в поле article
            foreach ($tmp as $key1 => $value) {
                if ($product = $modx->getObject('msProduct', $value['id'])) {
                	$realPrice = $product->get('price');
                	$discount1 = $product->get('discount1');
                	$opt = $realPrice*$discount1/100;
                    $optPrice = $realPrice-$opt;
                	$tmp[$key1]['price'] = $optPrice;
                }
            }
        }
        else {
            foreach ($tmp as $key1 => $value) {
                if ($product = $modx->getObject('msProduct', $value['id'])) {
                	$realPrice = $product->get('price');
                	$tmp[$key1]['price'] = $realPrice;
                }
            }
        }
        $miniShop2->cart->set($tmp);
        break;
}
Осталось теперь придумать как это всё менять на лету, на странице с товаром и в корзине при оформлении заказа, может кто-нибудь в курсе как дописать этот скрипт, чтобы считалось всё на лету?

<script type="text/javascript">
$('#msCart input[name="count"]').change(function(){
	var count = $(this).val(); 
	var singlePrice = parseInt($(this).closest('.tab_row').children(".tab_sum").text());

	$(this).closest('.tab_row').children(".tab_pr").children("span").html(count * singlePrice);
});
</script>
Сделал через систему плагинов, плагин вот такой получился, по ощущениям всё правильно должно быть, но он не считает почему-то:

<?php
switch ($modx->event->name) {
    case 'msOnChangeInCart': case 'msOnAddToCart': case 'msOnRemoveFromCart':
        $miniShop2 = $modx->getService('minishop2','miniShop2',
        	MODX_CORE_PATH . 'components/minishop2/model/minishop2/', $scriptProperties);
        if (!($miniShop2 instanceof miniShop2)) return '';
        
        // Инициализируем класс в текущий контекст
        $miniShop2->initialize($modx->context->key, $scriptProperties);
        $total_count = $miniShop2->cart->status()['total_count'];
        $tmp = $miniShop2->cart->get();
        if ($total_count > 4) { // если 5 и более товаров - оптовые цены, в интернет-магазине оптовые цены забиваются в поле article
            foreach ($tmp as $key1 => $value) {
                if ($product = $modx->getObject('msProduct', $value['id'])) {
                	$realPrice = $product->get('price');
                	$discount1 = $product->get('discount1');
                	$opt = $realPrice*$discount1/100;
                    $optPrice = $realPrice-$opt;
                	$tmp[$key1]['price'] = $optPrice;
                }
            }
        }
        elseif ($total_count > 9) { // если 10 и более товаров - оптовые цены, в интернет-магазине оптовые цены забиваются в поле article
            foreach ($tmp as $key1 => $value) {
                if ($product = $modx->getObject('msProduct', $value['id'])) {
                	$realPrice = $product->get('price');
                	$discount2 = $product->get('discount2');
                	$opt = $realPrice*$discount2/100;
                    $optPrice = '';
                	$tmp[$key1]['price'] = $optPrice;
                }
            }
        }
        elseif ($total_count > 29) { // если 30 и более товаров - оптовые цены, в интернет-магазине оптовые цены забиваются в поле article
            foreach ($tmp as $key1 => $value) {
                if ($product = $modx->getObject('msProduct', $value['id'])) {
                	$realPrice = $product->get('price');
                	$discount3 = $product->get('discount3');
                	$opt = $realPrice*$discount3/100;
                    $optPrice = $realPrice-$opt;
                	$tmp[$key1]['price'] = $optPrice;
                }
            }
        }
        elseif ($total_count > 99) { // если 100 и более товаров - оптовые цены, в интернет-магазине оптовые цены забиваются в поле article
            foreach ($tmp as $key1 => $value) {
                if ($product = $modx->getObject('msProduct', $value['id'])) {
                	$realPrice = $product->get('price');
                	$discount4 = $product->get('discount4');
                	$opt = $realPrice*$discount4/100;
                    $optPrice = $realPrice-$opt;
                	$tmp[$key1]['price'] = $optPrice;
                }
            }
        }
        elseif ($total_count > 499) { // если 500 и более товаров - оптовые цены, в интернет-магазине оптовые цены забиваются в поле article
            foreach ($tmp as $key1 => $value) {
                if ($product = $modx->getObject('msProduct', $value['id'])) {
                	$realPrice = $product->get('price');
                	$discount5 = $product->get('discount5');
                	$opt = $realPrice*$discount5/100;
                    $optPrice = $realPrice-$opt;
                	$tmp[$key1]['price'] = $optPrice;
                }
            }
        }
        else {
            foreach ($tmp as $key1 => $value) {
                if ($product = $modx->getObject('msProduct', $value['id'])) {
                	$realPrice = $product->get('price');
                	$tmp[$key1]['price'] = $realPrice;
                }
            }
        }
        $miniShop2->cart->set($tmp);
        break;
}
citieslist.ru/
ekimoff.ru/225/

Я бы сделал что-ниюудь с этими базами) А вам самый простой способ в форме указать

<select name="country">
<option value="Россия"></option>
<option value="Германия"></option>
<option value="Украина"></option>
<option value="США"></option>
</select>
А в форме письма указать [[+country]] и вообще если используете FormIt то лучше его вместе с AjaxForm подружить.

Поправьте меня если ошибаюсь.
Огромное спасибо! Глазам не вериться, работает))) Теперь придумать надо как сделать скидку в реальном времени зависящую от количества выбранного товара. Тут табличка есть optolider.bfa.su/katalog/igrushki/letayushhij-minon.html Формула такая:
от 5 шт — 0%
от 10 шт — 5%
от 30 шт — 20%
от 100 шт — 60%
от 500 шт — 80%

В админке через MIGX сделал табличку эту, теперь думаю как это можно сделать. Буду рад любой идее)
Накликать можно всё что угодно) Только вот разработчики врядли будут подобное использовать, а вы как я понимаю делаете это для конечного пользователя. Так что главное это простота. Обилие кучи непонятных вкладок и ссылок зачастую пугают тех же менеджеров, которые наполняют сайты обычно, но если вы сами будете по просьбе заказчика делать определённые сборки, то это не плохо. Сам имел опыт со сборками MODX Evo, но это совсем разные системы и репозитория с кучей компонентов устанавливаемых в пару кликов не было.
По теме, тема отнюдь не новая, ещё помниться где-то видел подобное, был сервис сборок MODX с необходимыми дополнениями, на сайте надо было галочки раставлять нужных дополнений и потом собирался архив с предустановкой всего этого)
Почитайте лицензию MODX Revo, для неё по идее нельзя выпускать платные скрипты с закрытым кодом, это противоречит её философии чтоли. Поэтому и придумываются разные методы обхода существующей лицензии. А согласно лицензии исходные коды дополнений к системе должны быть открытыми и выложены на не коммерческой основе.