Заказ черновик или временная корзина
Материал из Umicms
В данной статье будет рассмотрен пример кастомного функционала, который позволяет создавать заказ черновик со списком выбранных товаров, в случае необходимости разработчик сайта может на отдельной странице вывести этот список товаров с кнопкой "Печать".
Для реализации данного функционала, добавим в файл classes/modules/emarket/__custom.php дополнительные методы:
public function getFavoritesLink($elementId = null, $template = 'default') { if(!$elementId) return; if(!$template) $template = "default"; list($tpl_add_link, $tpl_del_link) = def_module::loadTemplates("./tpls/emarket/favorites/{$template}.tpl", 'add_link', 'del_link'); $elements = $this->getFavoritesElements(); $inCompare = in_array($elementId, $elements); $addLink = $this->pre_lang . '/emarket/addToFavorites/' . $elementId . '/'; $delLink = $this->pre_lang . '/emarket/removeFromFavorites/' . $elementId . '/'; $block_arr = array( 'add-link' => $inCompare ? null : $addLink, 'del-link' => $inCompare ? $delLink : null ); return def_module::parseTemplate(($inCompare ? $tpl_del_link : $tpl_add_link), $block_arr, $elementId); } public function getFavoritesElements() { static $elements; if(is_array($elements)) { return $elements; } if(!is_array(getSession("favorites_list"))) { $_SESSION['favorites_list'] = array(); } if(is_array(getRequest('favorites_list'))) { $_SESSION['favorites_list'] = getRequest('favorites_list'); } $elements = getSession("favorites_list"); $elements = array_unique($elements); return $elements; } public function totalPrice() { $total_price = 0; $hierarchy = umiHierarchy::getInstance(); $result = $this->getFavoritesElements(); foreach($result as $item){ $element = $hierarchy->getElement($item, true); if($element) $total_price += $element->price; } $str = "Общее количество: " . count($result) . ' ; Сумма: ' . $total_price .';'; return $str; } public function addToFavorites() { $element_id = getRequest("param0"); if(!is_array($_SESSION['favorites_list'])) { $_SESSION['favorites_list'] = array(); } if (count($_SESSION['favorites_list']) >= 8) { $this->errorNewMessage("Максимальное количество избранных товаров = 8"); $this->errorPanic(); } if(!in_array($element_id, $_SESSION['favorites_list'])) { $_SESSION['favorites_list'][] = $element_id; } $this->redirect(getServer('HTTP_REFERER')); } public function removeFromFavorites() { $element_id = getRequest("param0"); if(!is_array($_SESSION['favorites_list'])) { $_SESSION['favorites_list'] = array(); return; } if(in_array($element_id, $_SESSION['favorites_list'])) { unset($_SESSION['favorites_list'][array_search($element_id, $_SESSION['favorites_list'])]); } $referer = getServer('HTTP_REFERER'); if(stristr(getServer('HTTP_USER_AGENT'), 'msie')) { $referer = preg_replace(array("/\b\d{10,}\b/", "/&{2,}/", "/&$/"), array("", "&", ""), $referer); $referer.= (strstr($referer, "?") ? "&" : "?") . time(); $referer = str_replace("?&", "?", $referer); } $this->redirect($referer); } public function favorites($template = "default") { if($this->breakMe()) return; if(!$template) $template = "default"; list( $template_block, $template_block_empty, $template_block_line ) = $this->loadTemplates( "./tpls/emarket/favorites/{$template}.tpl", "favorites_block", "favorites_block_empty", "favorites_block_line"); $elements = $this->getFavoritesElements(); if(sizeof($elements) == 0) return $template_block_empty; $hierarchy = umiHierarchy::getInstance(); $block_arr = array(); $lines = array(); foreach($elements as $element_id) { $element = $hierarchy->getElement($element_id); if(!$element) continue; $lines_arr = array( 'attribute:id' => $element_id, 'attribute:link' => $hierarchy->getPathById($element_id), 'node:title' => $element->getName() ); $lines[] = $this->parseTemplate($template_block_line, $lines_arr, $element_id); } $block_arr['subnodes:lines'] = $lines; return $this->parseTemplate($template_block, $block_arr); }
Также в папке classes/modules/emarket/ создадим файл permissions.custom.php, со следующим содержанием:
<?php $permissions = array('purchasing' => array('getFavoritesLink', 'addToFavorites', 'removeFromFavorites', 'favorites', 'totalPrice')); ?>
Если вы используете TPL-шаблонизатор, то в папке tpls/emarket/ необходимо создать папку favorites, а в ней шаблон default.tpl со следующим содержанием:
<?php $FORMS = Array(); $FORMS['add_link'] = <<<END <a href="%add-link%">Добавить в список</a> END; $FORMS['del_link'] = <<<END <a href="%del-link%">Удалить из списка</a> END; $FORMS['favorites_block'] = <<<END Ваш список товаров:<br /> <ul> %lines% </ul> END; $FORMS['favorites_block_empty'] = <<<END END; $FORMS['favorites_block_line'] = <<<END <li> <a href="%link%">%title%</a> <a href="/emarket/removeFromFavorites/%id%">X</a> </li> END; ?>
Макрос для вывода списка выбранных товаров вызывается следующим образом:
%emarket favorites('default')%
для XSLT-шаблонизатора, вызов стандартный udata://emarket/favorites/
<udata module="emarket" method="favorites" generation-time="0.258070"> <lines> <item id="48" link="/market/hamsters/homyachok_obychnyj/">Хомячок обычный</item> <item id="49" link="/market/hamsters/homyachok_na_kolesah/">Хомячок на колесах</item> </lines> </udata>
При формировании списка товаров, или вывода подробного описания, необходимо использовать макрос:
%emarket getFavoritesLink(%id%, 'default')%
где %id% - id товара.
В зависимости от того, добавлен товар в список или нет, будет выводиться ссылка по добавлению товара или удалению из списка. Пример результата вызова udata://emarket/getFavoritesLink/48
<udata module="emarket" method="getFavoritesLink" generation-time="0.180689"> <del-link>/emarket/removeFromFavorites/48/</del-link> </udata>
Также можно использовать метод %emarket totalPrice()% который выводит количество товаров добавленных в список, и общею стоимость.
