start.exe

start.exe

С нами с 13 сентября 2014; Место в рейтинге пользователей: #367
start.exe
12 декабря 2014, 14:32
0
Ну в общем и целом всё работает так, как и задумывалось.
Для вывода кол-ва именно в заказах [[+mycount]] не использую, воспользовался подсказкой, которая указана выше.
Начало истории с нецелым кол-вом товара в списке товаров, в корзине, в миникорзине вот тут.
Готовой пошаговой инструкции, к сожалению нет. Внимательно прочитайте посты и комменты на эту тему и у Вас тоже всё получится.
start.exe
20 октября 2014, 23:58
0
О! Спасибо за подсказку, я просматривал мельком этот файл, но не обратил на него внимания. Изменил там тип для count на decimal, теперь и в панели управления заказами проставляются дробные значения.

Обновления минишопа выходят не так уж часто, поэтому, на мой взгляд затирание изменений это не большая проблема. После обновления опять поправлю пару строчек, да и всё.
start.exe
20 октября 2014, 14:38
0
Не знаю, что за чудеса такие… ведь сумма строки это:
cost = price * count

При этом результат умножения является правильным, значит и значения тоже правильные, но count всё-равно выводится как целое число… непонятненько…

Нашел кривенький способ — пойти обратным путем и создать новый плейсхолдер [[+mycount]] который будет выводить результат деления cost на price

В чанке msGetOrder добавил строчку:

...
/** @var msOrderProduct $row */
foreach ($rows as $row) {

// добавим строчку вывода количество товара через зад
$row['mycount'] = $row['cost'] / $row['price'];

// а тут переименуем count в mycount
	$outer['cart_count'] += $row['mycount']; 

	$row['old_price'] = $miniShop2->formatPrice(
		$row['original_price'] != $row['price']
			? $row['original_price']
			: $row['old_price']
	);
	$row['price'] = $miniShop2->formatPrice($row['price']);
	$row['cost'] = $miniShop2->formatPrice($row['cost']);

	$row['weight'] = $miniShop2->formatWeight($row['weight']);

	$row['id'] = (integer) $row['id'];
	if (empty($row['name'])) {
		$row['name'] = $row['pagetitle'];
	}
	else {
		$row['pagetitle'] = $row['name'];
	}
	$row['link'] = !empty($row['id'])
		? $row['link'] = $modx->makeUrl($row['id'], '', '', 'full')
		: '';
...
На странице с отправленным заказом теперь отображается всё правильно, в письме тоже приходят правильные значения.

Теперь как-то бы разобраться со значениями в панели управления заказами…
start.exe
19 октября 2014, 11:58
0
Решил данный вопрос, добавив свой скрипт в файл assets/components/minishop2/js/web/default.js

между строчками №168 и 169, вот так:

...

,initialize: function() {
			miniShop2.Cart.setup();
			if (!$(miniShop2.Cart.cart).length) return;
			miniShop2.$doc.on('change', miniShop2.Cart.cart + ' ' + miniShop2.Cart.countInput, function() {

// ОКРУГЛЕНИЕ КОЛИЧЕСТВА
currentVal = $(this).val();
currentValNumber = currentVal.replace(/[^0-9.,]/gi, '');
currentValNum = currentValNumber.replace(/,/g, '\.');
currentValN = currentValNum.replace(/\.{2,}/g, '\.');
currentValF = parseFloat(currentValN);
step = +$(this).attr('step');
val = +currentValF;
      if(isNaN(val) || val=='0' ){
          val=step;
      }
valR = Math.round((Math.ceil(val / step) * step) * 10) / 10;
$(this).val(valR);
// КОНЕЦ ОКРУГЛЕНИЕ КОЛИЧЕСТВА

					$(this).closest(miniShop2.form).submit();
				});

...
start.exe
19 октября 2014, 01:09
0
Оказывается, всё это можно заставить работать и без скрытого импута, просто нужно сделать видимой кнопку в форме
<button value="cart/change" name="ms2_action" type="submit"></button>
При нажатии на неё итоговая сумма будет пересчитываться с округленным значением.
Только вот не очень удобно нажимать на эту кнопку рядом с каждым товаром в корзине.

Событие cart/change, как-то же вызывается и при потере фокуса, ведь сумма меняется и без нажатия на кнопку, только вот значения не округленные… непонятненько…

start.exe
19 октября 2014, 00:39
0
Изменил форму в корзине, сделал так:
<input class="quantity" value="[[+count]]" step="[[+weight]]" maxlength="5" /> м<sup>2</sup>
<input class="cart-count" name="count" value="[[+count]]" type="hidden" />
И добавил скрипт
$(document).ready(function() {
$('.quantity').blur(function(){
value = $(this).val();
$(this).next().next().val(value);
}); 
});
В скрытый инпут передается округленное значение, но итоговая сумма теперь вообще не меняется.
start.exe
18 октября 2014, 11:59
0
В корзину отправляется округленное, всё норм.
На странице с корзиной кол-во при изменении тоже округляется, но итоговая сумма считается с неокругленными.

На картинке:
в корзине было 1,5 кв.м, изменил на 2, округлилость до 3, но в итого всё-равно 2
start.exe
17 октября 2014, 06:30
0
Копировал сниппет msOptions, назвал его products_class и добавил три строчки внизу:

<?php
/* @var array $scriptProperties */
/* @var pdoFetch $pdoFetch */
if (!$modx->loadClass('pdofetch', MODX_CORE_PATH . 'components/pdotools/model/pdotools/', false, true)) {return false;}
$pdoFetch = new pdoFetch($modx, $scriptProperties);

if (empty($product) && !empty($input)) {$product = $input;}
if (empty($selected)) {$selected = '';}
if (empty($outputSeparator)) {$outputSeparator = "\n";}
if ((empty($name) || $name == 'id') && !empty($options)) {$name = $options;}

$output = '';
$product = !empty($product) ? $modx->getObject('msProduct', $product) : $product = $modx->resource;
if (!($product instanceof msProduct)) {
	$output = 'This resource is not instance of msProduct class.';
}
elseif (!empty($name) && $options = $product->get($name)) {
	if (!is_array($options) || $options[0] == '') {
		$output = !empty($tplEmpty)
			? $pdoFetch->getChunk($tplEmpty, $scriptProperties)
			: '';
	}
	else {
		$rows = array();
		foreach ($options as $value) {
			$pls = array(
				'value' => $value
				,'selected' => $value == $selected ? 'selected' : ''
			);
			$rows[] = empty($tplRow) ? $value : $pdoFetch->getChunk($tplRow, $pls);
		}

		$rows = implode($outputSeparator, $rows);
		$output = empty($tplOuter)
			? $pdoFetch->getChunk('', array('name' => $name, 'rows' => $rows))
			: $pdoFetch->getChunk($tplOuter, array_merge($scriptProperties, array('name' => $name, 'rows' => $rows)));
	}
}

if ($output=='Зеленый'){$output='green';}
if ($output=='Красный'){$output='red';}

$modx->setPlaceholder('products_class',$output);


в своем чанке my.msProducts.row вызываю созданный сниппет и вывожу результаты в плейсхолдере:

[[products_class?
 &name=`tags`
 &product=`[[+id]]`
 &tplRow=`@INLINE [[+value]]` &tplOuter=`@INLINE [[+rows]]`
 ]]

<li class="product-item [[+products_class]]">[[+pagetitle]]</li>


в чанке со списком товаров делаю «вкладки», где указывается количество соответствующего товара, подсчитанное через jquery и вызываю сниппет msProducts, который выводит все товары:

<ul id="tabs-anchor" class="item-tabs">
    <li class="tab-title1 active">Все элементы <sup>[[countProducts]]</sup></li>
    <li class="tab-title2">Красные<sup><span class="count-red"></sup></li>
    <li class="tab-title3">Зеленые<sup><span class="count-green"></sup></li>
</ul>

[[msProducts?
            &includeContent=`1` 
            &limit=`16`
            &maxLimit=`50`
            &tplWrapper=`my.msProducts.Wrapper`
            &tpl=`my.msProducts.row`
]]


Подключаю скрипт, который организует работу «вкладок», по нажатию на которые показываются либо все товары, либо товары определенного цвета:

$(document).ready(function() {
    
    $("ul.item-tabs li:first").addClass("active").show(); //Активировать первую вкладку
    $(".tab_content:first").show(); //Показать контент первой вкладки
 
    $("ul.item-tabs li").click(function() {
        $("ul.item-tabs li").removeClass("active"); //Удалить "active" класс
        $(this).addClass("active"); //Добавить "active" для выбранной вкладки
    });           
           
    $('.tab-title1').click(function() {
        $(".product-item").show(); 
    });    
    
    $('.tab-title2').click(function() {
        $(".product-item").hide(); 
        $(".red").show(); 
    });
    
    $('.tab-title3').click(function() {
        $(".product-item").hide(); 
        $(".green").show(); 
    });
});


И скрипт, который считает количесто товаров в зависимости от тега (класса):

$(document).ready(function() {

var red= $("li.red").size();
$("span.count-red").text(red);

var green= $("li.green").size();
$("span.count-green").text(green);

});

Написано не особо лаконично, но вроде всё работает, может кому-то сгодится.
start.exe
24 сентября 2014, 22:31
0
У меня разрешилось вот так:

В чанке my.msProducts.row, который выводит список товаров в категории:
[[!msOptions? &name=`size` &product=`[[+id]]` &tplRow=`@INLINE [[+value]]` &tplOuter=`@INLINE [[+rows]]` ]]

start.exe
18 сентября 2014, 11:28
0
ааа, так можно ручками закинуть товар в товар! а я и не знал…
я-то пытался добавить дочерний документ к товару через правую кнопку, а в выпадающем меню такого пункта нет, поэтому я подумал, что Василий Наумкин целенаправленно по каким-то причинам убрал или не добавил эту возможность.
Спасибо за подсказку!
Вот в модексе всегда так, задумываешь что-то сделать, и с учетом опыта работы с другими cms пытаешься построить решение, уходишь в какие-то дебри, а оказывается всё гораздо проще)
start.exe
18 сентября 2014, 05:05
0
ну да, я об этом и говорю…
попробую на тестовом сайте сделать через связи, посмотрим, получится ли
start.exe
17 сентября 2014, 10:03
1
0
Часовые пляски с бубном не помогли вывести значение поля Размер, хотя всё делал по инструкции.

В настройках категории товаров:
[[!pdoPage?
	&element=`msProducts`
	&tpl=`tovar`
]]

Чанк tovar:
[[+pagetitle]] ,
[[+size]]
<!--minishop2_size [[%ms2_frontend_size]]: [[+value]] см-->

На выходе имеем:
Товар1, Размер: см

А где ж указаное значение поля Размер? Отчего не фурычит конструкция, господа?
start.exe
13 сентября 2014, 11:50
0
на всякий случай выложу готовый сниппет здесь, вдруг кому пригодится:

<?php
$pid = $modx->resource->parent;
$childname= $modx->resource->pagetitle;
$path = 'i/pdf/'.$pid.'-'.$childname.'.pdf';

if (file_exists($path)) {
    echo '<a href="'.$path.'" class="download" title="Скачать PDF '.$childname.'">Скачать PDF-каталог '.$childname.'</a>';
}
Пригодится он для того, чтобы можно было выводить ссылку на файл, прикрепленный к документу, если он(файл) существует.
При этом не нужно создавать дополнительную ТV, и указывать её значение для каждого документа.
Достаточно закинуть все нужные файлы в папку i/pdf/
предварительно переименовав их, например, в 2-doc1.pdf, 2-doc2.pdf, 10-doc1.pdf, что легко делается через ТоталКоммандер.
start.exe
13 сентября 2014, 10:32
0
Василий, большое спасибо за столь оперативный ответ! Теперь всё работает, как надо. Спасибо еще раз)