Version: current

     1 <?php
     2 // Уведомление клиента во Вконтаке (создание заказа и изменение заказа )
     3 // Во Вконтакте необходимо создать Standalone-приложение, получить "вечный" access-token с правами offline,messages
     4 // https://oauth.vk.com/authorize?client_id=ID_приложения&display=page&redirect_uri=https://oauth.vk.com/blank.html&scope=offline,messages&response_type=token&v=5.37
     5 // Сообщения буту отсылаться от имени пользователя, создавшего приложение.
     6 // Для того, чтоб сообщения не пропадали (возможны сбои ВК АПИ при отправке) - они сначала складываются в очередь, а потом отправляются из нее задачей, с фиксацией результатов отправки каждого сообщения
     7 // ВК позволяет отправлять запросы не чаще 3-х запросов в секунду, поэтому после каждой отправки необходимо ставить паузу
     8 class ClientVKOrderNotification extends OrderHandlersDecorator {
     9
    10     function OnAfterCreateOrder(& $member) {
    11         $conf = SiteConfig::current_site_config();
    12         if (!$conf->ClientVKOrderNotificationActive) {
    13             return false;
    14         }
    15
    16         // проверяем пользователя у заказа
    17         if (!$member) {
    18             $member = $this->owner->Member();
    19         }
    20
    21         if ($member && $member->VKLogin) {
    22             $url = 'https://api.vk.com/method/messages.send';
    23             $message = $this->owner->customise(array(
    24                 'Member' => $member,
    25                 'Order' => $this->owner,
    26                 'PurchaseCompleteMessage' => strip_tags(DataObject::get_one('CheckoutPage')->PurchaseComplete),
    27             ))->owner->renderWith('ClientVKCreateOrderMessage');
    28
    29             // Складываем в очередь
    30             $postEntry = new VKNotificationQueue();
    31             $postEntry->UserID = $member->VKLogin;
    32             $postEntry->Message = $message;
    33             $postEntry->write();
    34         }
    35     }
    36
    37     // после смены стутса
    38     function OnAfterChangeStatus($member, $changedStatus, $note) {
    39         $conf = SiteConfig::current_site_config();
    40         if (!$conf->ClientVKOrderNotificationActive) {
    41             return false;
    42         }
    43         if ($this->owner->MemberID && $this->owner->Member() && $this->owner->Member()->VKLogin) {
    44             $url = 'https://api.vk.com/method/messages.send';
    45             $message = $this->owner->customise(array(
    46                 'Member' => $this->owner->Member(),
    47                 'Note' => $note,
    48                 'Order' => $this->owner,
    49             ))->owner->renderWith('ClientVKChangeOrderStatusMessage');
    50
    51             // Складываем в очередь
    52             $postEntry = new VKNotificationQueue();
    53             $postEntry->UserID = $this->owner->Member()->VKLogin;
    54             $postEntry->Message = $message;
    55             $postEntry->write();
    56         }
    57     }
    58 }
    59
    60 // Декоратор SiteConfig для этого типа уведомлений
    61 class ClientVKOrderNotification_SiteConfig extends SiteConfigDecorator {
    62     function extraStatics() {
    63         return array(
    64             'db' => array(
    65                 'ClientVKOrderNotificationActive' => 'Boolean', // јктивность
    66                 'ClientNotificationVKAccessToken' => 'Varchar(255)', // Email - наверное не нужен (если только импользовать как From)
    67             )
    68         );
    69     }
    70     public function updateCMSFields(FieldSet &$fields) {
    71         $tab = self::get_config_tab($fields, 'OrderNotifications.VKOrderNotification');
    72         $tab->push(new CheckboxField('ClientVKOrderNotificationActive', $this->owner->FieldLabel('ClientVKOrderNotificationActive')));
    73         $tab->push(new TextField('ClientNotificationVKAccessToken', $this->owner->FieldLabel('ClientNotificationVKAccessToken')));
    74     }
    75 }
    76

[Raise a SilverStripe Framework issue/bug](https://github.com/silverstripe/silverstripe-framework/issues/new)
- [Raise a SilverStripe CMS issue/bug](https://github.com/silverstripe/silverstripe-cms/issues/new)
- Please use the Silverstripe Forums to ask development related questions. -