Денис Усачев

Денис Усачев

С нами с 26 июля 2016; Место в рейтинге пользователей: #823
Александр Мельник
03 ноября 2017, 17:56
3
0
Я делаю так
<div class="sort-title">Сортировать по:</div>
	<div class="sort-item">
	<a href="{$_modx->resource.id | url}?sortby=price&sortdir=DESC">убыванию </a>
	<i class="zmdi zmdi-long-arrow-down"></i>
	</div>
	<div class="sort-item">
	<a href="{$_modx->resource.id | url}?sortby=price&sortdir=ASC">возрастанию</a>
	<i class="zmdi zmdi-long-arrow-up"></i>
	</div>
В вызове сниппета, который будет выводить товары
'sortby' => $_modx->runSnippet('sortItName.php'),
    'sortdir' => $_modx->runSnippet('sortItDir.php'),
Ну и собственно содержание этих сниппетов
sortItDir.php'
<?php
$request=$_GET['sortby'];
switch($request) {
case "price":
    return ("Data.price");
    break;
case "rating":
    return("rating");
    break;
default:
    return("{\"menuindex\":\"DESC\"}");
    break;
}
sortItName.php
<?php
$request=$_GET['sortdir'];
switch($request) {
case "ASC":
    return("ASC");
    break;
case "DESC":
    return("DESC");
    break;
default:
    return("DESC");
    break;
}
Таким образом к ссылкам можно прикреплять любые поля и направления в GET параметрах.
Работает с перезагрузкой страницы, что можно считать минусом. А можно и плюсом, потому что сортировка без перезагрузки приводит к тому, что пагинация перестает работать. Если по умолчанию на странице 20 товаров, отсортировали и скажем товаров стало 10, то изменение пагинации требует сложной (уточню — для меня сложной работы с хешем), а так все ок.
Dolce
16 октября 2017, 10:33
5
+2
Точно, не удалил лишений код — как следствие и скопировал не то. Вот для селектов:
$(document).ready(function() {
                               
                    $(document).on('change', '#mse2_sort', function() {
                        var selected = $(this).find('option:selected');
                        var sort = selected.data('sort');
                        sort += mse2Config.method_delimeter + selected.val();
                        mse2Config.sort =  sort;
                        mSearch2.submit();
                    });

   });
Futuris
14 июля 2017, 18:48
1
0
В чанке tpl.msProducts.row присутствует такая строчка
{'!AddComparison' | snippet : ['list_id' => 18, 'id' => $id, 'minItems' => 1]}
. Но это дефолтный код MS2 и я не пользуюсь AddComparison. К тому же на предыдущем поддомене все работало. Странно!
Klike
12 июля 2017, 11:44
1
+2
Код сниппета:
<?php
if (empty($options) || $options == 0) return;
$price = preg_replace('/\s+/', '' , $input);
$old_price = preg_replace('/\s+/', '' , $options);
$discount = round(100 - ($price * 100 / $old_price) , 2);
return $discount;

Вызывать либо с помощью Fenom:
{$price|discount:$old_price}

Либо стандартным синтаксисом:
[[+old_price:gt=`0`:then=`[[+price:discount=`[[+old_price]]`]]`]]
Алексей П
09 июля 2017, 16:07
1
0
Проблема была в том, что сессии были разные для поддомена и домена.
Решение
В системной настройке session_cookie_domain указал .site.com
but1head
23 мая 2017, 18:29
1
+1
Локализатор грузит свои словари вот так:
$modx->lexicon->load($cultureKey . ':localizator:site');
Следовательно вам надо (возможно синтаксис не правильный)
{$_modx->lexicon->load(('cultureKey' | option) ~ ':minishop2:default')}
или в плагине\сниппете
$modx->lexicon->load($modx->cultureKey . ':minishop2:default');
А вообще должно было «само», но видимо минишоп грузит словари раньше чем локализатор подменит язык.
Володя
11 мая 2017, 13:29
1
0
Спасибо за оперативные исправления!
пожалуйста!

Подскажите, можно ли назначить в модификациях цену по-умолчанию, чтобы она выводилась в списке продукции (в категории магазина) через сниппет msProduct?

можно попробовать плагином
gist.github.com/vgrish/85b5d8e9e3a159975b330cc90d63f3ca
Володя
11 апреля 2017, 07:26
5
+2
примерно так можно
s6200.h3.modhost.pro/katalog/11999.html
joxi.ru/E2pMqLGS9YgaRA
{foreach $options as $name => $values}
    <div class="form-group">
        <label class="col-md-2 control-label" for="option_{$name}">{('ms2_product_' ~ $name) | lexicon}:</label>
        <div class="col-md-10">
            <select name="options[{$name}]" class="input-sm form-control" id="option_{$name}">
                {foreach $values as $value}
                    <option value="{$value}">{$value}</option>
                {/foreach}
            </select>
        </div>
    </div>    
        
        
    <div class="form-group form-inline embroidery_parent" style="display:none;">    
        <label class="col-md-2 control-label" for="option_{$name}"></label>
        <div class="col-md-10">
			<input type="text" name="options[embroidery_text]" placeholder="Текст вышивки" class="input-sm form-control" value="">
		</div>
    </div>
    
{/foreach}

<script>
$(document).on('change', '.ms2_form', function (e) {   
    
    var embroidery = $(this).find('select[name="options[embroidery]"]');
    var embroidery_text = $(this).find('input[name="options[embroidery_text]"]');
    if (embroidery.val() == 'да') {
        embroidery_text.closest('.embroidery_parent').show();
    }
    else {
        embroidery_text.closest('.embroidery_parent').hide();
        embroidery_text.val('');
    }
});
</script>
Володя
07 декабря 2016, 21:44
1
0
Если я вас правильно понял то можно попробовать так.
Плагин на событие msopOnGetModificationById примерно так
if ($modx->event->name = 'msopOnGetModificationById') {
    
    $m = null;
    $msoptionsprice = $modx->getService('msoptionsprice');
   
    // пробуем получить модификацию по свойству
    foreach ($options as $k => $v) {
        $m = $msoptionsprice->getModificationByOptions($rid, array($k => $v));
        if ($m) {
            break;
        }
    }
    
    if ($m) {
	// получаем все свойства модификации
        $options = $modx->call('msopModificationOption', 'getOptions', array(&$modx, $m['id'], $rid));
        $modification->set('options', $options);
        $modification->set('rid', $rid);
        // сигнализируем что модификация найдена и не нужно выводить пустую модификацию по дефолту
        $modx->event->returnedValues['found'] = true;
}

далее событие msoptionsprice_product_action
$(document).on('msoptionsprice_product_action', function (e, action, form, r) {
	if (action == 'modification/get') {
	    var m = r.data.modification || {};
	    var o = r.data.options || {};
	    
	    if (m.rid) {
	        if (!msOptionsPrice.Tools.empty(o)) {
				for (key in o) {
				    if (!o.hasOwnProperty(key)) {
						continue;
					}
					var value = o[key];
					value = msOptionsPrice.Tools.formatOptionValue(key, value);
					// выставляем свойства модификации
					msOptionsPrice.Tools.setInputValue(key, value, m.rid);
				}
			}
	    }
	}
});
Сергей Росоловский
10 ноября 2016, 20:56
1
0
Ага, велосипед я тот сделал так.
Для категории товара создал tv переменную optCount — в которой количество товара после которого уже идет оптовая цена. Теперь для каждой категории я могу проставить количество которое уже считается оптовым.
Оптовую цену решил прописать в old_price.
Далее в core/components/minishop2/model/minishop2/mscarthandler.class.php в функциях add() и change() приделал маленький самокатик (например в функции add):
$product1 = $modx->getObject('modResource',$id);
	$optcount = $product1->getTVValue('optCount');
	$price = $product->getPrice(); 
	$old_price = $product1->get('old_price');
	$weight = $product->getWeight(); 
	$count = $response['data']['count'];
	$options = $response['data']['options'];
           
        if ($count >= $optcount && $old_price > 0) {
             $price = $old_price; 
         }


Вероятно оно все неправильно, надо все не так, если покопаться в исходниках минишопа можно сделать все правильно. Но у меня работает и заказчик не жаловался. Вот и все, дальше копаться не хотелось.