Курс 2016 года “Разработка на UMI.CMS от 0 до готового сайта”

0 Пользователей и 1 Гость просматривают эту тему.

*

diii3

  • ***
  • 154
  • +6/-0
    • Просмотр профиля
Добрый день! Может кто-то сталкивался или знает как реализовать - нужно в карточке товара сделать ссылку "уведомить при поступлении", т.е. если товара нет, нажимаешь на кнопку, вводишь свой емэйл и при его поступлении тебе приходит уведомление на почту. Может есть какие то примеры? Или описание как это можно сделать?

*

Rodogor

  • ***
  • 189
  • +24/-0
    • Просмотр профиля
Re:Уведомление о поступлении товара на емэйл
« Ответ #1 : 09 Декабря 2012, 20:49:38 »
Я ещё не делал, но уже задание такое давно есть, проект отложил просто.
Особо не продумывал, но думаю как-то так будет:
у товара создаём поле выпадающий список с множественным выбором, в него будем писать пользователей, которые подписались на товар. При изменение товаров/при синхронизации запускается событие, которое проверяет изменившиеся количество ну и если есть пользователи - отсылает письма.
Таким образом не придётся кучу раз бегать по базе и т.п., думаю должно работать норм.


*

diii3

  • ***
  • 154
  • +6/-0
    • Просмотр профиля
Re:Уведомление о поступлении товара на емэйл
« Ответ #2 : 09 Декабря 2012, 22:19:02 »
Спасибо за ответ. Вы все верно сказали. Я так понимаю, нужно при появлении данного события еще и очищать список пользователей, чтобы потом не было повторных отправок писем при, например, уменьшении количества товара. Короче нужно писать кастомный макрос. С этим у меня пока сложно) Если у вас будет подобная реализация и вы скинете сюда код, буду признателен. А так дали верное направление куда надо смотреть, спасибо.

*

Rodogor

  • ***
  • 189
  • +24/-0
    • Просмотр профиля
Re:Уведомление о поступлении товара на емэйл
« Ответ #3 : 10 Декабря 2012, 09:13:14 »
Само собой разумеется, что нужно чистить список пользователей если отправлено письмо. :)
Через недельку-две буду делать - отпишусь..

*

diii3

  • ***
  • 154
  • +6/-0
    • Просмотр профиля
Re:Уведомление о поступлении товара на емэйл
« Ответ #4 : 10 Декабря 2012, 09:28:00 »
Спасибо) Будем ждать)

*

Rodogor

  • ***
  • 189
  • +24/-0
    • Просмотр профиля
Re:Уведомление о поступлении товара на емэйл
« Ответ #5 : 15 Февраля 2013, 11:22:55 »
Что-то я забыл про тему. Я уже сделал всё, но там очень много кода и есть косяк с одним системным событием, работающим непонятно как (пока его оставил, потом разбирусь, при синхронизации из 1с всё нормально срабатывает и это главйное).
Если нужно - могу выложить какие-нибудь фрагменты...

*

diii3

  • ***
  • 154
  • +6/-0
    • Просмотр профиля
Re:Уведомление о поступлении товара на емэйл
« Ответ #6 : 17 Февраля 2013, 08:43:02 »
Здравствуйте! Да, выложите, пожалуйста, код. Отлично, что вы решили эту задачу!

*

Rodogor

  • ***
  • 189
  • +24/-0
    • Просмотр профиля
Re:Уведомление о поступлении товара на емэйл
« Ответ #7 : 17 Февраля 2013, 10:33:47 »
Код сырой. Я потыкал, вроде что-то работает, но запуска ещё не было - тестирование хорошее не проводил.

У меня помимо подписки на mail есть ещё sms.

js часть:
/js/site/basket.js
site.basket.chekcSubscribe = function (){
var mail = $('.mail').val();
var phone = $('.tlf').val();
var pageId = $('.add_cart').attr('id').replace(/^add_basket_/, '');
//var id = ($('.add_cart').id.indexOf('add_basket') != -1) ? $('.add_cart').id.replace(/^add_basket_/, '') : $('.add_cart');
$('.sbscr-ok').remove();
$('.formErr').remove();
$('.alert').removeClass('alert');
if (mail!=='')
if (!mail.match(/^[A-Za-z0-9](([_\.\-]?[a-zA-Z0-9]+)*)@([A-Za-z0-9]+)(([\.\-]?[a-zA-Z0-9]+)*)\.([A-Za-z])+$/)){
$('.form_element.form_mail').addClass('alert').append('<div class="formErr">Некорректный e-mail.</div>');
return ;
}
if ((mail=='')&(phone=='')){
$('.form_element.form_mail').addClass('alert').append('<div class="formErr">Введите e-mail.</div>');
$('.form_element.form_tlf').addClass('alert').append('<div class="formErr">Введите телефон.</div>');
$('.object-subscribe-msg').append('<p class="sbscr-ok red">Введите e-mail или номер телефона.</p>');
return ;
}
basket.subscribeProduct(site.basket.subscribe(),mail,phone,pageId);
};

site.basket.subscribe = function() {
return function (e){
var resp = e;
if (resp.status=='ok'){
$('.object-subscribe-msg').append('<p class="sbscr-ok">Подписка на товар выполнена</p>');
}
};
};

js/client/basket.js

subscribeProduct : function(callback,mail,phone,pageId) {		
var options = {};
/*options['mail'] = $('.mail').val();
options['phone'] = $('.tlf').val();
options['pageId'] = $('#page-id').val();*/
options['mail'] = mail;
options['phone'] = phone;
options['pageId'] = pageId;
basket.__lightRequest("/udata/catalog/subscribeProduct/", options, callback);
}

__lightRequest : function(url, options, callback) {
jQuery.ajax({
url      : url,
type     : 'POST',
dataType : 'json',
data     : options,
success  : function(data) {
callback(data);
}
});
}

php часть:

	public function subscribeProduct(){
$mail = getRequest('mail');
$dispatches = cmsController::getInstance()->getModule('dispatches');
$phone = getRequest('phone');
$phone = eregi_replace("([^0-9])", "", $phone);
$phone = substr($phone,1,11);
//$phone = substr($phone,1,10);
if (strlen($phone)) $phone = $dispatches->checkPhone($phone);

$name='';
if (strlen($mail)){
$name = $mail;
if ($phone)
$name.=' '.$phone;
}
else{
$name = $phone;
}

$pageId = getRequest('pageId');
$element = umiHierarchy::getInstance()->getElement($pageId);
$mailList = $element->getValue('podpisavshiesya_polzovateli');
$result = array();
$checkMail = umiMail::checkEmail($mail);
if ($checkMail||$phone){

$sel = new umiSelection;
$sel->addObjectType(1332);
if ($mail) $sel->addPropertyFilterEqual(1353,$mail);
if ($phone) $sel->addPropertyFilterEqual(1354,$phone);

$result = umiSelectionsParser::runSelection($sel);
$total = umiSelectionsParser::runSelectionCounts($sel);

if (!$total){
$objectId = umiObjectsCollection::getInstance()->addObject($name,1332);
$object = umiObjectsCollection::getInstance()->getObject($objectId);
if ($mail) $object->setValue('pochta',$mail);
if ($phone) $object->setValue('telefon',$phone);
}
else
$objectId = $result[0];
$mailList = array_merge(array($objectId),$mailList);
$mailList = array_unique($mailList);
$element->setValue('podpisavshiesya_polzovateli',$mailList);
$result['status'] = 'ok';
$result['msg'] = 'Подписка выполнена';
}
else{
$result['status'] = 'err';
if (!$checkEmail) $result['msg'] = 'Неправильно введена почта.';
if (!$phone) $result['msg'] = 'Неправильно введён телефон.';
}
echo json_encode($result);
exit;
}


События.
Событие systemModifyElement НЕ УБИРАЕТ подписавшегося пользователя если в нём не выполнить EXIT, сильно смахивает на глюк umi. Я с этим потом разберусь, у меня всё через 1с работает

public function ExchangeOnUpdate(iUmiEventPoint $oEventPoint) {
if ($oEventPoint->getMode() === "after") return true;
if ($oEventPoint->getMode() === "before") {
$dispatches = cmsController::getInstance()->getModule("dispatches");
$element = $oEventPoint->getRef('element') ;

if ($element->getTypeId()==45){
$subscribe = $element->getValue('podpisavshiesya_polzovateli');

if (sizeof($subscribe)>0){
$count = $element->getValue('common_quantity');
if ($count>0){
self::sendSubscribersMsg($subscribe,$element->id);
$element->setValue('podpisavshiesya_polzovateli',array());
$element->commit();
}
}
}





}

public function systemModifyElement(iUmiEventPoint $oEventPoint) {

if ($oEventPoint->getMode() === "after") return true;
if ($oEventPoint->getMode() === "before") {
$dispatches = cmsController::getInstance()->getModule("dispatches");
$element = $oEventPoint->getRef('element') ;
if ($element->getTypeId()==45){
$subscribe = $element->getValue('podpisavshiesya_polzovateli');
if (sizeof($subscribe)>0){
$count = $element->getValue('common_quantity');
if ($count>0){
self::sendSubscribersMsg($subscribe,$element->id);

$element->podpisavshiesya_polzovateli=false;
$element->podpisavshiesya_polzovateli=array();
$element->commit();

}
}
}
}

public function sendSubscribersMsg($subscribers,$elementId){
$element = umiHierarchy::getInstance()->getElement($elementId);

foreach ($subscribers as $subscriberId){
self::sendMsg($subscriberId,$elementId);
}

}
public function sendMsg($subscriberId,$elementId){
$subscriber = umiObjectsCollection::getInstance()->getObject($subscriberId);
$mail = $subscriber->getValue('pochta');
$phone = $subscriber->getValue('telefon');
if ($mail){
self::sendMail($mail,$elementId);
if ($phone){
self::sendPhone($phone,$elementId);
}
}
else
self::sendPhone($phone,$elementId);

}
public function sendMail($mail,$elementId){
$element = umiHierarchy::getInstance()->getElement($elementId);
$letter   = new umiMail();
$letter->addRecipient($mail, 'name');
$letter->setFrom('asortiment@mail.ru', name');
$letter->setSubject('Товар появился в наличие.');
$letter->setContent('Здравствуйте. <br> Товар <a href="'.$element->link.'">'.$element->name.'</a> вновь появился в наличие интернет-магазина.<br> С уважением, интернет-магазин </a>.');
$letter->commit();
$letter->send();
}


public function sendPhone($phone,$elementId){
$element = umiHierarchy::getInstance()->getElement($elementId);
include 'api/config.php';
include 'api/Addressbook.php';
include 'api/Exceptions.php';
include 'api/Account.php';
include 'api/Stat.php';

$Gateway=new APISMS($sms_key_private,$sms_key_public, 'http://atompark.com/api/sms/');
$Addressbook=new Addressbook($Gateway);
$Exceptions=new Exceptions($Gateway);
$Account=new Account($Gateway);
$Stat = new Stat ($Gateway);
$res = $Stat->sendSMS("имя", "Здравствуйте. Товар ". $element->name ." вновь появился в наличие интернет-магазина ", $phone, '',0);



}