Класс customer модуля emarket — различия между версиями
Williwaw (обсуждение | вклад) |
Williwaw (обсуждение | вклад) |
||
Строка 236: | Строка 236: | ||
<source lang="php"> | <source lang="php"> | ||
public function merge(umiObject $customer) { | public function merge(umiObject $customer) { | ||
− | + | //получаем id текущего домена | |
$cmsController = cmsController::getInstance(); | $cmsController = cmsController::getInstance(); | ||
$domain = $cmsController->getCurrentDomain(); | $domain = $cmsController->getCurrentDomain(); | ||
$domainId = $domain->getId(); | $domainId = $domain->getId(); | ||
− | + | ||
+ | //получаем список всех заказов текущего объекта "покупатель" | ||
$sel = new selector('objects'); | $sel = new selector('objects'); | ||
$sel->types('object-type')->name('emarket', 'order'); | $sel->types('object-type')->name('emarket', 'order'); | ||
Строка 246: | Строка 247: | ||
$sel->where('domain_id')->equals($domainId); | $sel->where('domain_id')->equals($domainId); | ||
$sel->order('id')->desc(); | $sel->order('id')->desc(); | ||
+ | |||
+ | //получаем id текущего авторизованного пользователя | ||
$permissions = permissionsCollection::getInstance(); | $permissions = permissionsCollection::getInstance(); | ||
$userId = $permissions->getUserId(); | $userId = $permissions->getUserId(); | ||
foreach($sel as $order) { | foreach($sel as $order) { | ||
+ | //ищем заказ, у которого нет статуса | ||
if(!$order->status_id) { | if(!$order->status_id) { | ||
+ | //обращаемся к методу mergeBasket() | ||
$this->mergeBasket($order); | $this->mergeBasket($order); | ||
continue; | continue; | ||
} | } | ||
+ | //присваиваем для текущего заказа в качестве id покупателя,id авторизованного пользователя | ||
$order->customer_id = $userId; | $order->customer_id = $userId; | ||
+ | //сохраняем изменения | ||
$order->commit(); | $order->commit(); | ||
} | } | ||
+ | //если не активен консольный режим, создаем куку в браузере пользователя | ||
if (!defined('UMICMS_CLI_MODE') || !UMICMS_CLI_MODE) { | if (!defined('UMICMS_CLI_MODE') || !UMICMS_CLI_MODE) { | ||
setcookie('customer-id', 0, 1, '/'); | setcookie('customer-id', 0, 1, '/'); | ||
} | } | ||
+ | //удаляем экземпляр класса "покупатель" | ||
$customer->delete(); | $customer->delete(); | ||
} | } | ||
</source> | </source> | ||
[[Категория:API]][[Категория:Модуль Интернет-магазин]] | [[Категория:API]][[Категория:Модуль Интернет-магазин]] |
Версия 15:52, 24 февраля 2014
Актуально для версии 2.9.5
Содержание
Описание
Одним из классов, который необходим для работы модуля "интернет-магазин" является класс 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();
}