Заказ черновик или временная корзина
В данной статье будет рассмотрен пример кастомного функционала, который позволяет создавать заказ черновик со списком выбранных товаров, в случае необходимости разработчик сайта может на отдельной странице вывести этот список товаров с кнопкой "Печать".
Для реализации данного функционала, добавим в файл 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()% который выводит количество товаров добавленных в список, и общею стоимость.