Код сырой. Я потыкал, вроде что-то работает, но запуска ещё не было - тестирование хорошее не проводил.
У меня помимо подписки на 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);
}