Класс customer модуля emarket
Актуально для версии 2.9.5
Содержание
Класс customer
Описание
Одним из классов, который необходим для работы модуля "интернет-магазин" является класс customer. Данный класс предоставляет доступ к управлению объектами-покупателями интернет-магазина. Исходный код класса находится в файле classes\modules\emarket\classes\customer\customer.php
Свойства класса
$defaultExpiration хранит время жизни cookie
public static $defaultExpiration = 2678400;	// 31 days
$isAuth хранит id пользователя, если покупатель - авторизованный пользователь, false в противном случае
protected $isAuth;
Методы
__construct()
Экземпляр класса создается с помощью __construct()
Параметры:
 
iUmiObject $object:
содержит в себе либо объект "зарегистрированный пользователь" либо объект "незарегистрированный покупатель"
Результат: экземпляр класса customer
При создании объекта, методом определяется, какое значение будет хранить переменная $isAuth:
	public function __construct(iUmiObject $object) {
			$permissions = permissionsCollection::getInstance();
                         //получить id текущего пользователя
			$userId = $permissions->getUserId();
                        //получить id гостя
			$guestId = permissionsCollection::getGuestId();
                        // если id гостя равен id текущего пользователя записать в переменную $isAuth false, в противном   
                         случае записать id текущего пользователя
			$this->isAuth = ($userId == $guestId) ? false : $userId;
                        //создать экземпляр класса покупатель
			parent::__construct($object);
		}
get()
Получить экземпляр класса можно с помощью функции get(), если покупатель не существует, то метод создаст новый экземпляр класса
Параметры:
 
bool $nocache:
не использовать данные кэша, по умолчанию false
Результат: экземпляр класса customer
		public static function get($nocache = false) {
			static $customer;
//Сначала функция get() проверит создан ли уже объект покупатель
			if(!$nocache && !is_null($customer)) {
//вернет объект покупатель, если он существует
				return $customer;                           
			}
			$objects = umiObjectsCollection::getInstance();     
			$permissions = permissionsCollection::getInstance();
                        // если объект не существует, проверит авторизован ли пользователь
			if($permissions->isAuth()) {
				$userId = $permissions->getUserId();
                                 //авторизован - запишет в переменную $object(входной параметр для конструктора класса)
                                 объект текущего пользователя
				$object = $objects->getObject($userId);
			} else {
                                //не авторизован - запишет в переменную $object объект покупателя-гостя, 
                                получает этот объект функция getCustomerId()
				$object = self::getCustomerId();
				//выполнить повторную проверку, это может быть полезно при конфликтах после перезагрузки сервера
				if($object === false) $object = self::getCustomerId(true);
			}
			if($object instanceof iUmiObject) {
                        //будет создан экземпляр класса customer, на основе объекта переданного в переменную $object
				$customer = new customer($object);
                       //только что созданный экземпляр класса обратиться к функции  tryMerge()
				$customer->tryMerge();
				return $customer;
			}
		}
IsUser()
Метод isUser() вернет значение типа boolean, 1 или 0, в зависимости от того является ли покупатель зарегистрированным пользователем, т.е. будет проверено содержит ли переменная $isAuth идентификатор пользователя, или же, содержит false
Параметры:
Результат: boolean
getCustomerId()
Метод getCustomerId() вернет объект покупателя-гостя, если объект не существует, обратится к методу createGuestCustomer(), который создаст нового покупателя-гостя
Параметры:
 
bool $noCookie:
"не использовать данные кук", по умолчанию false
Результат: объект "покупатель-гость", записанный в переменную $customer
protected static function getCustomerId($noCookie = false) {
                        //в переменную $customerId записывается id покупателя-гостя
			static $customerId;
                        //проверка на то, содержит ли переменная значение
			if(is_null($customerId)) {
                        //Если переменная  $customerId пуста, получит id покупателя из кук
				$customerId = (int) getCookie('customer-id');
			}
                        //получить существующий объект "покупатель" по id
			$customer = selector::get('object')->id($customerId);
			 if($customer instanceof iUmiObject != false) {
                          //если полученный объект является экземпляром класса iUmiObject, получим тип объекта
				$type = selector::get('object-type')->id($customer->getTypeId());
                                //получим метод, по которому был создан объект
				if($type->getMethod() != 'customer') {
                                //если метод не customer, в переменную $customer запишем null
					$customer = null;
				}
			} else {
                               //если полученный объект не является экземпляром класса iUmiObject, в переменную $customer 
                                также запишем null
				$customer = null;
			}
                        //если $customer не определена, создадим новый объект "покупатель-гость"
			if(!$customer) {
				$customerId = self::createGuestCustomer();
                        //получим id объекта
				$customer = selector::get('object')->id($customerId);
			}
                        // если у объекта не задан id(т.е. объект не сущетсвует),создадим новый объект "покупатель-гость"
			if(!$customerId) {
				$customerId = self::createGuestCustomer();
			}
                        //если не активен консольный режим, создаем куку в браузере пользователя
			if (!defined('UMICMS_CLI_MODE') || !UMICMS_CLI_MODE) {
				setcookie('customer-id', $customerId, (time() + self::$defaultExpiration), '/');
			}
                        // устанавливаем "время жизни" объекта "покупатель-гость"
			$expirations = umiObjectsExpiration::getInstance();
			$expirations->set($customerId, self::$defaultExpiration);
                        //возвращаем объект "покупатель-гость"
			return $customer;
		}
createGuestCustomer()
Метод createGuestCustomer() создаст новый объект "покупатель-гость"
Параметры:
Результат: id "покупателя-гость", записанный в переменную $customer
protected static function createGuestCustomer() {
                         //получить коллекцию типов объектов
			$objectTypes = umiObjectTypesCollection::getInstance();
                        //получить коллекцию объектов
			$objects = umiObjectsCollection::getInstance();
                        //получить тип данных "покупатель"
			$objectTypeId = $objectTypes->getBaseType('emarket', 'customer');
                        //добавить объект "покупатель-гость", имеющий тип данных "покупатель", записать в переменную $customerId
                        id "покупателя-гостя"
			$customerId = $objects->addObject(getServer('REMOTE_ADDR'), $objectTypeId);
                        
                        //получить объект "покупатель-гость"
			$customer = $objects->getObject($customerId);
                        
                        //установить владельцем объекта пользователя гость
			$customer->setOwnerId($objects->getObjectIdByGUID('system-guest'));
                        //вернуть id объекта "покупатель-гость"
			return $customerId;
		}
tryMerge()
Метод tryMerge() попытается перенести товары "покупателя-гостя" авторизованному покупателю(пользователю), обратившись к методу merge()
Параметры:
Результат:
Данная функция используется, например, если пользователь положил товары в корзину, будучи не авторизован, а потом авторизовался на сайте
	public function tryMerge() {
                        //проверяет является ли текущий экземпляр класса авторизованным пользователем и есть лиу  него в браузере кука
			if($this->isUser() && getCookie('customer-id')) {
                                //получает объект "покупателя-гостя"
				$guestCustomer = self::getCustomerId();
                                 
                                //если объект является экземпляром класса iUmiObject, обратится к функции merge()
				if($guestCustomer instanceof iUmiObject) {
					$this->merge($guestCustomer);
				}
			}
		}
merge()
Метод merge() "переносит" товары "покупателя-гостя" авторизованному покупателю(пользователю), обратившись к методу mergeBasket()
Параметры:
 
iUmiObject $customer:
содержит в себе объект "покупатель"
Результат:
		public function merge(umiObject $customer) {
                        //получаем id текущего домена
			$cmsController = cmsController::getInstance();
			$domain = $cmsController->getCurrentDomain();
			$domainId = $domain->getId();
                          
                        //получаем список всех заказов текущего объекта "покупатель"
			$sel = new selector('objects');
			$sel->types('object-type')->name('emarket', 'order');
			$sel->where('customer_id')->equals($customer->id);
			$sel->where('domain_id')->equals($domainId);
			$sel->order('id')->desc();
                        
                        //получаем id текущего авторизованного пользователя
			$permissions = permissionsCollection::getInstance();
			$userId = $permissions->getUserId();
			foreach($sel as $order) {
                                //ищем заказ, у которого нет статуса
				if(!$order->status_id) {
                                        //обращаемся к методу mergeBasket(), передавая в качестве параметра текущий объект заказа
					$this->mergeBasket($order);
					continue;
				}
                                //присваиваем для текущего заказа в качестве id покупателя,id авторизованного пользователя
				$order->customer_id = $userId;
                                //сохраняем изменения
				$order->commit();
			}
                        //если не активен консольный режим, создаем куку в браузере пользователя
			if (!defined('UMICMS_CLI_MODE') || !UMICMS_CLI_MODE) {
				setcookie('customer-id', 0, 1, '/');
			}
                        //удаляем экземпляр класса "покупатель"
			$customer->delete();
		}
mergeBasket()
Метод mergeBasket() "переносит" товары "покупателя-гостя" авторизованному покупателю(пользователю), удаляя по завершению переноса объект "заказ"(корзина гостя)
Параметры:
 
umiObject $guestBasket:
содержит в себе текущий объект "заказ"(корзина покупателя)
Результат:
		protected function mergeBasket(umiObject $guestBasket) {
                        //получить все товары в корзине покупателя-гостя
			$orderItems = $guestBasket->order_items;
                        
                        //проверить являются ли полученные товары массивом
			if(is_array($orderItems)) {
                               //передать в переменную $userBasket заказ, который представляет текущую корзину товаров
				$userBasket = __emarket_purchasing::getBasketOrder(false);
                                // проверить задана ли $userBasket
 				if($userBasket) {
                                       
                                        
					foreach($orderItems as $orderItemId) {
						$orderItem = orderItem::get($orderItemId);
						if($orderItem) {
                                                        //добавить в текущую корзину товаров, товары из корзины покупателя-гостя
							$userBasket->appendItem($orderItem);
						}
					}
                                        //сохранить текущую корзину товаров
					$userBasket->commit();
				}
			}
                        //удалить корзину покупателя-гостя
			$guestBasket->delete();
		}
freeze()
Метод freeze() "заморозит" покупателя, т.е. не удалит его по истечении 31 дня
Параметры:
Результат:
public function freeze() {
                        //получить коллекцию "сроков жизни" объектов
			$expirations = umiObjectsExpiration::getInstance();
                        //обнулить "срок жизни" для текущего экземпляра класса
			$expirations->clear($this->id);
}
__toString()
Метод __toString() вернет id текущего экземпляра класса в качестве строки
Параметры:
Результат:
		public function __toString() {
                        //вернуть id покупателя в строковом виде
			return (string) $this->object->id;
		}
getLastOrder()
Метод getLastOrder() получит id последнего заказа пользователя
Параметры:
 
int $domainId:
id домена заказа
Результат:
int $orderId идентификатор последнего заказа пользователя или false
		public function getLastOrder($domainId) {
                        //присвоить id заказа идентификатор сессии админа(редактирование заказа под администратором). Если запишется не пустое значение, вернуть $orderId
			if ($orderId = getSession('admin-editing-order')) return $orderId;
                        //присвоим переменной $lastOrders значение поля "последний заказ" у покупателя(является составным)
			if ($lastOrders = $this->last_order) {
				foreach($lastOrders as $lastOrder) {
					if (isset($lastOrder['float']) && $lastOrder['float'] == $domainId) {
                                         //если $lastOrders не окажется пустым, присвоим в переменную $orderId номер последнего заказа
						$orderId = $lastOrder['rel'];
                                                //получим объект последнего заказа
						$order = order::get($orderId);
                                                //если $order пустая, функция возвращает false
						if (!$order) return false;
                                                //получим код код статуса последнего заказа
						$status = order::getCodeByStatus($order->status_id);
                                                //если $status пустая, или статус заказа - "редактируется", или "оплачивается" и, при 
                                                 этом, оплата "инициализирована", метод вернет id последнего заказа
						if (!$status || $status == 'executing' || ($status == 'payment' && order::getCodeByStatus($order->payment_status_id) == 'initialized') ) return $orderId;
					}
				}
			}
                        //при невыполнении вышеперечисленных условий метод вернет  false
			return false;
		}
setLastOrder()
Метод setLastOrder() установит последний заказ пользователя
Параметры:
 
int $domainId:
id домена заказа
int $orderId:
id заказа
Результат:
		public function setLastOrder($orderId, $domainId) {
                        //получим значение поля last_order(составное) у покупателя
			$lastOrders = $this->last_order;
                        //объявим переменную $matchDomain, присвоив значение false
			$matchDomain = false;
			foreach($lastOrders as &$lastOrder) {
                                //если у составного поля last_order существует  float и float равен переданному в качестве параметра 
                                id домена, установим в качестве id последнего заказа, переданный в функцию id
				if (isset($lastOrder['float']) && $lastOrder['float'] == $domainId) {
					$lastOrder['rel'] = $orderId;
                                        //установим значение $matchDomain как true
					$matchDomain = true;
				}
			}
                        //если  $matchDomain содержит false,  в id последнего заказа устанавливаем  переданный в функцию id заказа
                        в  поле float запишем переданный id домена
			if (!$matchDomain) $lastOrders[] = array("rel" => $orderId, "float" => $domainId);
			$this->last_order = $lastOrders;
                        //сохраним внесенные изменения
			$this->commit();
		}
Класс order
Описание
Данный класс предоставляет доступ к заказу интернет-магазина либо к текущей корзине. Исходный код класса находится в файле classes\modules\emarket\classes\order\order.php
Переменные
В класса объявлены следующие переменные.
Переменная $items, которая содержит предметы в заказе или корзине
protected $items = Array();
Переменная $actualPrice хранит в себе актуальную цену на товар
protected $actualPrice;
Переменная $originalPrice хранит в себе первоначальную цену товара
protected $originalPrice;
Переменная $totalAmount хранит общее количество предметов в заказе или корзине товаров
protected $totalAmount;
Методы
__construct()
Экземпляр класса создается с помощью функции __construct()
Параметры:
 
iUmiObject $object:
содержит в себе либо объект "зарегистрированный пользователь" либо объект "незарегистрированный покупатель"
Результат: экземпляр класса customer
При создании объекта, методом определяется, какое значение будет хранить переменная $isAuth:
	public function __construct(iUmiObject $object) {
			$permissions = permissionsCollection::getInstance();
                         //получить id текущего пользователя
			$userId = $permissions->getUserId();
                        //получить id гостя
			$guestId = permissionsCollection::getGuestId();
                        // если id гостя равен id текущего пользователя записать в переменную $isAuth false, в противном   
                         случае записать id текущего пользователя
			$this->isAuth = ($userId == $guestId) ? false : $userId;
                        //создать экземпляр класса покупатель
			parent::__construct($object);
		}
