Торговля электронными книгами на UMI.CMS
После покупок электронных книг в магазине пришла идея реализовать подобный функционал на UMI.CMS.
Как оказалась, задача очень легко реализуема.
Логика работы:
- Происходит оплата на сайте и меняется статус оплаты на «принята» или «подтверждена»;
- Отлавливается событие изменение статуса оплаты;
- В ответном письме приходят купленные книги.
Подготовка:
Для начала нужно создать новый тип данных или уже работать с существующим, не принципиально. В него добавить поля (Тема письма subjectstring | Контент письма letter_content):
После этого, создать страницу, которая будет использовать данный тип данных и заполнить созданные поля:
Я создал тип данных дочерний к «Страница контента»
Текст для полей:
Ваши книги из заказа №%order_id%
и
Книги из вашего заказа №%order_id% приложены к письму.
Вы заказали: %books_list%
Спасибо за ваш заказа. Читайте с удовольствием!
Я постарался дать возможность администратору сайта изменять сообщения, которые будут отправляться пользователю. Макросы %order_id% и %books_list% содержать в себе номер заказа и список купленных книг. Автозамена происходить автоматически, когда срабатывает функция.
Далее, нужно добавить поле «Статус отправки файла (sent_status)» в шаблон данных «Заказ». Добавить можно в секцию «Свойства заказа»:
Будет автоматически создан новый справочник. В созданный справочник нужно добавить два значения(/admin/data/guide_items/):
- Не отправлен
- Отправлен
Нужно запомнить ID созданных названий(в моем случае это 855 и 856) они нужны для того, чтобы совершать отправку либо нет, далее будет ясно:
Теперь нужно дать возможность прикрепить файл к объекту каталога. В шаблоне данных «Объект каталога» нужно добавить 1 или 2 поля, все зависит от того, какое кол-во файлов вам нужно будет прикреплять (Файл 1 fajl_1 | Файл 2 fajl_2):
Можете зайти в каталог и прикрепить несколько файлов в ваши товарам.
Программирование:
Если вы используете новый формат хранения шаблонов, то у вас в шаблоне должна присутствовать следующая иерархия папок - templates\[название_шаблона]\classes\modules\emarket\.
В папке emarket должно быть 3 файла:
- events.php
- permissions.php
- class.php
Если у вас остался старый формат хранения шаблонов, вам нужно в папке \classes\modules\emarket\ создать три файла, если еще нет :
- custom_events.php
- permissions.custom.php
- __custom.php
Содержание файла events.php (custom_events.php)
<?php
new umiEventListener('order-payment-status-changed', 'emarket', 'onChangeOrderStatusProp');
new umiEventListener('systemModifyPropertyValue', 'emarket', 'onChangeOrderStatusProp');
?>
Содержание файла permissions.php (permissions.custom.php)
<?php
$permissions = array(
'purchasing' => array(
'onChangeOrderStatusProp',
'onChangePaymentStatusSendFileToUser'
)
);
?>
Содержание файла class.php (__custom.php)
<?php
class emarket_custom extends def_module {
public function onChangeOrderStatusProp(iUmiEventPoint $event) {
$old_status = $event->getParam("oldValue");
$new_status = $event->getParam("newValue");
$object = $event->getRef("entity");
$oid = $object->getId();
// При изменение статуса оплаты
if ($event->getParam("property") == 'payment_status_id' && $new_status != $old_status) {
if($event->getMode() == "before") return true;
else {
$this->onChangePaymentStatusSendFileToUser($oid, $new_status);
}
}
}
public function onChangePaymentStatusSendFileToUser($oid, $new_status) {
// Получает текущий заказ
$order = order::get($oid);
if($order instanceof order == false)
throw new publicException("Order #{$oid} doesn't exists");
// Получение текущего статуса файла из заказа
$sent_status = $order->getValue('sent_status');
if( $new_status == '47' && $sent_status != '856' || $new_status == '49' && $sent_status != '856' ) {
// Получение объектов текущего заказа
$order_items = $order->getItems();
// Получение пользователя из системы
$customer = umiObjectsCollection::getInstance()->getObject($order->getCustomerId());
// Получение email
$email = $customer->email ? $customer->email : $customer->getValue("e-mail");
// Получение имени
$name = $customer->lname . " " .$customer->fname . " " . $customer->father_name;
// Получение страницы с опциями
$opt_item = umiHierarchy::getInstance()->getElement(35);
// Формирование темы для письма
$subjectString = str_replace("%order_id%", $oid, $opt_item->getValue('subjectstring'));
// Содержание письма
$letter_content = $opt_item->getValue('letter_content');
$letter_content = str_replace("%order_id%", $oid, $letter_content);
// Получение domainid
$regedit = regedit::getInstance();
$cmsController = cmsController::getInstance();
$domains = domainsCollection::getInstance();
$domainId = $cmsController->getCurrentDomain()->getId();
$defaultDomainId = $domains->getDefaultDomain()->getId();
// Формирование fromMail и fromName
if ($regedit->getVal("//modules/emarket/from-email/{$domainId}")) {
$fromMail = $regedit->getVal("//modules/emarket/from-email/{$domainId}");
$fromName = $regedit->getVal("//modules/emarket/from-name/{$domainId}");
} elseif ($regedit->getVal("//modules/emarket/from-email/{$defaultDomainId}")) {
$fromMail = $regedit->getVal("//modules/emarket/from-email/{$defaultDomainId}");
$fromName = $regedit->getVal("//modules/emarket/from-name/{$defaultDomainId}");
} else {
$fromMail = $regedit->getVal("//modules/emarket/from-email");
$fromName = $regedit->getVal("//modules/emarket/from-name");
}
$letter = new umiMail();
$letter->addRecipient($email, $name);
$letter->setFrom($fromMail, $fromName);
$letter->setSubject($subjectString);
$html = '<ul>';
foreach($order_items as $order_item) {
$item = $order_item->getItemElement();
$html .= "<li>" . $item->getValue('h1') . "</li>";
// Получение файлов из объекта каталога
if(iconv_strlen($item->getValue('fajl_1')) > 0) {
$f = '.' . $item->getValue('fajl_1');
$oFile = new umiFile($f);
if (!$oFile->getIsBroken()) //Возвращает false, если файл существует и доступен скрипту на чтение.
$letter->attachFile($oFile); // Прикрепление файлов к письму
}
// Получение файлов из объекта каталога
if(iconv_strlen($item->getValue('fajl_2')) > 0) {
$f = '.' . $item->getValue('fajl_2');
$oFile = new umiFile($f);
if (!$oFile->getIsBroken()) //Возвращает false, если файл существует и доступен скрипту на чтение.
$letter->attachFile($oFile); // Прикрепление файлов к письму
}
}
$html .= '</ul>';
$letter_content = str_replace("%books_list%", $html, $letter_content);
// Текст письма
$letter->setContent($letter_content);
// Отправка письма
$letter->commit();
$letter->send();
// Установка значения в поле статус отправки - заказ
$order->setValue('sent_status', '856');
$order->commit();
}
}
}
?>
Информация по коду.
В строке 029 происходит проверка полей статус оплаты и статус заказа. Если «статус оплаты» = «принят» и «статут отправки файла» = «не отправлен» или «статус оплаты» = «принят» и «статут отправки файла» = «не отправлен» то код будет отрабатываться.
if( $new_status == '47' && $sent_status != '856' || $new_status == '49' && $sent_status != '856' ) {
ID для данных переменных вы сможете найти в своих справочниках.
Участок кода:
$html = '<ul>';
foreach($order_items as $order_item) {
$item = $order_item->getItemElement();
$html .= "<li>" . $item->getValue('h1') . "</li>";
// Получение файлов из объекта каталога
if(iconv_strlen($item->getValue('fajl_1')) > 0) {
$f = '.' . $item->getValue('fajl_1');
$oFile = new umiFile($f);
if (!$oFile->getIsBroken()) //Возвращает false, если файл существует и доступен скрипту на чтение.
$letter->attachFile($oFile); // Прикрепление файлов к письму
}
// Получение файлов из объекта каталога
if(iconv_strlen($item->getValue('fajl_2')) > 0) {
$f = '.' . $item->getValue('fajl_2');
$oFile = new umiFile($f);
if (!$oFile->getIsBroken()) //Возвращает false, если файл существует и доступен скрипту на чтение.
$letter->attachFile($oFile); // Прикрепление файлов к письму
}
}
$html .= '</ul>';
Здесь вы можете добавлять доп. файлы для отправки в письме
И наконец:
// Установка значения в поле статус отправки - заказ
$order->setValue('sent_status', '856');
$order->commit();
Если письмо отправлено, то изменяется статус отправки файла на «отправлен».
Если вдруг в коде есть ошибки, и не работает, вы всегда можете найти на bitbucket.org последнюю версию шаблона.
Если вам понравился новый формат хранения шаблонов в UMI.CMS, то подробнее о подключении вы можете почитать в документации








