Вывод суммы полей товаров в корзине — различия между версиями

Материал из Umicms
Перейти к:навигация, поиск
(Новая страница: «== Описание == Допустим, интернет-магазин продаёт какие-либо товары, у которых есть дополнит…»)
 
 
(не показано 7 промежуточных версий 2 участников)
Строка 1: Строка 1:
== Описание ==
+
[[Категория:Верстка в TPL]][[Категория: Верстка в XSLT]][[Категория: Модуль Интернет магазин]][[Категория: Написание кастомных макросов]]
Допустим, интернет-магазин продаёт какие-либо товары, у которых есть дополнительное поле - площадь, длина или, например, объём, и надо вывести макросом общий объём (площадь, длину и т.д.) товаров. Для этого напишем кастомный макрос.
+
'''Актуально для версии 2.9.6'''<br/><br/>
 +
'''Задача:''' Реализовать функционал подсчета общей суммы значений какого-либо поля товаров в корзине. <br/><br/>
 +
'''Реализация:''' <br/>
  
== Решение ==
+
В файл '''custom.php''', находящийся в директории /classes/modules/, добавим следующие строки:
В файл [[custom.php]] (находящийся в /classes/modules/) добавим следующие строчки:
 
 
<source lang="php">
 
<source lang="php">
//TODO: Write your own macroses here
+
public function sumPropertyValuesBasketItems($propName) {
 
+
if ( !$propName ) {
public function calculateSize() {
+
$propName = getRequest('param0');
// Переменная, содержащая сумму полей
+
}
$totalVol = 0;
+
$sumTotal = 0;
// Получение объект заказа (состояние текущей корзины)
+
// Получение объект заказа (состояние текущей корзины)
$order = cmsController::getInstance()->getModule("emarket")->getBasketOrder();
+
$basketOrder = cmsController::getInstance()->getModule("emarket")->getBasketOrder();
// Пересчёт содержимого корзины
+
// Пересчёт содержимого корзины
$order->refresh();
+
$basketOrder->refresh();
// Получение элементов корзины
+
// Получение элементов корзины
$items = $order->getItems();
+
$orderItems = $basketOrder->getItems();
// Цикл получения суммы
+
foreach($items as $item) {
+
foreach ($orderItems as $orderItem) {
// Сложение. "size" - дополнительное поле.
+
$hierarchyElement = $orderItem->getItemElement();
$totalSize += (int)$item->getItemElement()->getObject()->getValue("size") * (int)$item->getAmount();
+
$elementPropValue = floatval( $hierarchyElement->getValue($propName) );
}
+
$orderItemAmount = $orderItem->getAmount();
// Возвращаем результат
+
return $totalSize;
+
$sumTotal += $elementPropValue * $orderItemAmount;
}
+
}
 +
 +
$sumTotal = number_format($sumTotal, 2, '.', ',');
 +
return $sumTotal;
 +
}
 
</source>
 
</source>
  
Далее, в необходимом месте вставляем '''''%custom calculateSize()%'''''.
+
Макрос '''sumPropertyValuesBasketItems()''' возвращает общую сумму значений поля с идентификатором '''$propName''' товаров в корзине.
При необходимости можно добавить проверку или разделение по типам товаров.
 
  
=== Примечание ===
+
<h2>TPL-шаблонизатор</h2>
Данный макрос написан для версии '''2.8+'''.
+
Пример вызова:
 +
<source lang="html4strict">
 +
%custom sumPropertyValuesBasketItems( 'weight' )%
 +
</source>
  
[Категория:Написание кастомных макросов]
+
<h2>XSLT-шаблонизатор</h2>
 +
Пример вызова:
 +
<source lang="xml">
 +
<xsl:value-of select="document('udata://custom/sumPropertyValuesBasketItems/weight')/udata" />
 +
</source>

Текущая версия на 07:12, 27 апреля 2014

Актуально для версии 2.9.6

Задача: Реализовать функционал подсчета общей суммы значений какого-либо поля товаров в корзине.

Реализация:

В файл custom.php, находящийся в директории /classes/modules/, добавим следующие строки:

public function sumPropertyValuesBasketItems($propName) {
	if ( !$propName ) {
		$propName = getRequest('param0');
	}
	$sumTotal = 0;
	// Получение объект заказа (состояние текущей корзины)
	$basketOrder = cmsController::getInstance()->getModule("emarket")->getBasketOrder();
	// Пересчёт содержимого корзины
	$basketOrder->refresh();
	// Получение элементов корзины
	$orderItems = $basketOrder->getItems();
	
	foreach ($orderItems as $orderItem) {
		$hierarchyElement = $orderItem->getItemElement();
		$elementPropValue = floatval( $hierarchyElement->getValue($propName) );
		$orderItemAmount = $orderItem->getAmount();
		
		$sumTotal += $elementPropValue * $orderItemAmount;
	}
	
	$sumTotal = number_format($sumTotal, 2, '.', ',');
	return $sumTotal;
}

Макрос sumPropertyValuesBasketItems() возвращает общую сумму значений поля с идентификатором $propName товаров в корзине.

TPL-шаблонизатор

Пример вызова:

%custom sumPropertyValuesBasketItems( 'weight' )%

XSLT-шаблонизатор

Пример вызова:

<xsl:value-of select="document('udata://custom/sumPropertyValuesBasketItems/weight')/udata" />