Использование нескольких Цен для одного товара

Материал из Umicms
Перейти к:навигация, поиск

Бывает необходимость для одного товара назначать несколько Цен и потом в зависимости от каких-то условий, выводить на сайте одну из цен. Одной из задач может быть предоставление незарегистрированному пользователю сайта одну цену на товар, а зарегистрированному другую. Общая логика решения задачи описана в статье Цена в зависимости от условий
Рассмотрим пример реализации описанной в указанной выше статье.
Для выполнения данной задачи можно воспользоваться такой функциональностью как "События". В системной файле \classes\system\subsystems\models\data\properties\umiObjectPropertyPrice.php , в методе loadValue() присутствует событие:

$oEventPoint = new umiEventPoint("umiObjectProperty_loadPriceValue");
$oEventPoint->setParam("object_id", $this->object_id);
$oEventPoint->addRef("price", $price);
$oEventPoint->call();

к которому мы можем подключиться и в зависимости от определенного условия вывести значение Цены товара из другой ячейки. Создадим в типе данных товара, модуль Шаблоны данных, еще одно поле типа "число с точкой" (Не "Цена"!), допустим с идентификатором "price2". Заполним это поле для каждого товара. Далее зарегистрируем обработчик события umiObjectProperty_loadPriceValue, для этого в папке classes/modules/emarket/ создадим файл custom_events.php со следующим содержанием:

<?php
new umiEventListener("umiObjectProperty_loadPriceValue", "emarket", "OnPriceValue");
?>

В той же папке, в файле __custom.php пропишем наш метод обработчик события OnPriceValue:

   public function OnPriceValue($e) { 
	// Объект для которого запрашивается значение из поля типа "Цена"
       $object_id = $e->getParam('object_id');
       // Значение цены 
       $value = &$e->getRef('price');
       // Текущий id пользователя
       $user_id = permissionsCollection::getInstance()->getUserId();
       // Id Гостя.
       $guest_id = permissionsCollection::getInstance()->getGuestId();

       if($user_id != $guest_id && cmsController::getInstance()->getCurrentMode() != "admin"){
         $object = umiObjectsCollection::getInstance()->getObject($object_id);
         if($object instanceof umiObject) {
           $new_price = $object->getValue('price2');
           $value = $new_price;
         }else return false;
       }		   
    }

И также необходимо установить права на использование этого метода в фале permissions.custom.php, файл необходимо создать:

<?php
$permissions = array('purchasing' => array('OnPriceValue'));
?>

В методе OnPriceValue(), в переменную $value передается значение цены по ссылке, поэтому мы можем изменить само значение, которое будет использоваться системой. При использовании указанного выше метода, для всех незарегистрированных пользователей будет выводиться значение цены из оригинального поля "Цена" (price), для все остальных из второго поля "Цена2" (price2). Новое значение цены будет использоваться при оформлении заказа на сайта. Находясь в административной панели сайта, никаких преобразований цены не будет из-за строчки:

cmsController::getInstance()->getCurrentMode() != "admin"

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