Реферальная система

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

Актуально для версии 2.9 Задача: Реализовать реферальную систему.

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

Реализация:
Административная панель:
В модуле "Шаблоны данных" для типа данных "Пользователь" нужно создать два поля с идентификаторами "ref_code" и "from_who" и типом полей "Строка", при этом видимость полей должна быть отключена. Для типа данных "Незарегистрированный покупатель" нужно создать поле с идентификатором "from_who" и типом поля "Строка".
Написание кастомных макросов:
В директорию /classes/modules/users/ необходимо добавить файлы со следующим содержанием (если они отсутствуют по указанному пути):
custom_events.php:

<?php
    new UmiEventListener("users_registrate", "users", "setReferal");
?>

__custom.php:

<?php
	abstract class __custom_users {
		public function setReferal(iUmiEventPoint $event){
                    if ($event->getMode()=='after'){
                        $collection = umiObjectsCollection::getInstance();
                        $user_id = $event->getParam('user_id');
                        if (isset($user_id)){
                            $obj = $collection->getObject($user_id);
                            $obj->setValue('ref_code',$user_id);
                        }
                    }
                }
                
                public function referal(){
                    $code = getRequest('param0');
                    if (isset($code)){
                        setCookie('ref_code',$code,0,'/');
                        $this->redirect('/');
                    }
                }
	};
	
?>

permissions.custom.php:

<?php

$permissions = Array(
		'login' => Array('referal'),
		'registrate' => Array('setReferal')
                );
?>

В директорию /classes/modules/emarket/ необходимо добавить файлы со следующим содержанием (если они отсутствуют по указанному пути):

custom_events.php:

<?php
    new UmiEventListener("order_refresh", "emarket", "putReferal");
    new UmiEventListener("systemModifyObject", "emarket", "giveBonusTo");
?>

__custom.php:

<?php
	abstract class __emarket_custom {
		//TODO: Write here your own macroses
            
            public function putReferal(iUmiEventPoint $event){
                if ($event->getMode()=='before'){
                    $collection = umiObjectsCollection::getInstance();
                    $order = $event->getRef('order');
                    $user_id = $order->getValue('customer_id');
                    
                    $user = $collection->getObject($user_id);
                    $ref = getCookie('ref_code');
                    if (isset($ref)){
                        $user->setValue('from_who',$ref);
                    }
                    
                }
                    
                
            }
            
            public function giveBonusTo(iUmiEventPoint $event){
               
                
                if ($event->getMode()=='after'){
                    
                    $order = $event->getRef('object');
                    if ($order->getTypeGUID()=='emarket-order'){
                        $status_id = $order->getValue('status_id');
                        $collection = umiObjectsCollection::getInstance();
                        if ($status_id==19){//accepted
                            $customer_id = $order->getValue('customer_id');
                            $customer = $collection->getObject($customer_id);
                            $who_id = $customer->getValue('from_who');
                            if (isset($who_id))
                                if ($who_id!=''){
                                    $bonus = 15;
                                    $who = $collection->getObject($who_id);
                                    $who->setValue('bonus',$who->getValue('bonus') + $bonus);
                                    $customer->setValue('from_who','');
                                }
                    }
                    
                    }
                }
            
            }
            
	};
?>

permissions.custom.php:

<?php

$permissions = array(
		'purchasing' => array('putReferal'));
		
?>

Вы можете воспользоваться следующей конструкцией, чтобы вести реферальную ссылку пользователя (например, в личном кабинете):

<xsl:value-of select="concat('http://',$domain,'/users/referal/',$user-id)"/>

В файле основного шаблона должны быть объявлены две переменные:

<xsl:variable name="domain" select="/result/@domain" />
<xsl:variable name="user-id" select="/result/user/@id" />

Краткое описание:
После регистрации, пользователь получает реферальную ссылку, которая выводится, например, в личном кабинете. С помощью этой ссылки пользователь может получать бонусы за привлечение новых покупателей.
Покупатель переходит по реферальной ссылке, в cookie его браузера записывается id пользователя, которому принадлежит данная ссылка. Покупатель оформляет заказ и из cookie в объект покупателя в поле с идентификатором "from_who" записывается значение этой cookie. Далее, при смене статуса заказа на "Принят", из заказа получаем объект покупателя, берем значение поля "from_who" и начисляем бонусы пользователю, который привлек покупателя, оформившего данный заказ.
Количество начисляемого бонуса можно указать, присвоив переменной $bonus значение, которая находится в файле \classes\modules\emarket\__custom.php в методе giveBonusTo().