Заказ черновик или временная корзина

Материал из Umicms
Версия от 11:26, 29 октября 2011; VITL' (обсуждение | вклад)
(разн.) ← Предыдущая | Текущая версия (разн.) | Следующая → (разн.)
Перейти к:навигация, поиск

В данной статье будет рассмотрен пример кастомного функционала, который позволяет создавать заказ черновик со списком выбранных товаров, в случае необходимости разработчик сайта может на отдельной странице вывести этот список товаров с кнопкой "Печать".

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