Битрикс — подписка на новости

12.10.2017  09:12

Не буду описывать как работает рассылка новостей в Битриксе, задача — сделать на сайте возможность подписки. Визуально это форма на сайте для ввода e-mail.

JS:
	$('#subscribe_frm').submit(function () {
		var email = $(this).find('input[name=email]').val();
		var frm = $(this);
		var temp = $('.ok_mes');
		temp.remove();
		var lnk = '/ajax/subscribe_actions.php';
		$.post(lnk, { email: email, 'act': 'subscribe' }, function(data) {
			if (data) {
			frm.append('


' + data + '
'); var temp = $('.ok_mes'); setTimeout(function(){ temp.animate({ opacity:'0' }, 2000, '', function(){ //animation complete }); }, 100); } }, "html"); return false; });


PHP (файл /ajax/subscribe_actions.php):
function subscribe(){
	global $APPLICATION,$USER;
	$user_email = $_REQUEST["email"];
	$hash = $_REQUEST["hash"];
	/*if ($hash != md5(date("Y-m-d H"))) {
		echo 'error';
	}
	else {*/
	if (!empty($user_email)) {
		$filter = Array("EMAIL" => "{$user_email}");

		$rsUsers = CUser::GetList(($by="id"), ($order="asc"), $filter); // выбираем пользователей
		$is_filtered = $rsUsers->is_filtered; // отфильтрована ли выборка ?
		$rsUsers->NavStart(1); // разбиваем постранично по n записей
		if($ar = $rsUsers->GetNext()) :
			// user exist
			$UserID = $ar["ID"];
			if($UserID  > 0){
				$res = CUser::GetUserGroupList($UserID);
				while ($arGroup = $res->Fetch()){
					$arUserGroups[] = $arGroup["GROUP_ID"];
				}
	
				if (in_array(5,$arUserGroups)) {
					echo 'Вы уже подписаны на обновления.';
				}
				else {
					$arGroups = CUser::GetUserGroup($UserID);
					$arGroups[] = 5;
					CUser::SetUserGroup($UserID, $arGroups);
					echo 'Вы успешно подписаны на обновления.';
				}
			} else {

			}
		else:
			// add new user
			$user_login = $user_email;//'user_'.mb_strtolower(randString(6));
			if (empty($user_name)) $user_name = $user_login;//'user_'.mb_strtolower(randString(6));
			$user_pass = randString(6);
			$user = new CUser;
			$arFields = Array(
				"NAME"              => $user_name,
				"LAST_NAME"         => "",
				"EMAIL"             => $user_email,
				"LOGIN"             => $user_login,
				"LID"               => "ru",
				"ACTIVE"            => "Y",
				"GROUP_ID"          => array(2,5),
				"PASSWORD"          => $user_pass,
				"CONFIRM_PASSWORD"  => $user_pass
			);

			$ID = $user->Add($arFields);
			if (intval($ID) > 0) echo 'Вы успешно подписаны на обновления.';
		endif;
	}
	else {
		echo 'Заполните, пожалуйста, поле email.';
	}
}
if($_REQUEST["act"]=="subscribe") subscribe();

Смысл такой: если юзер авторизован, то присваиваем ему группу «подписчики» (я специально добавил такую группу, т.к. рассылка в битриксе работает либо по всем пользователям, либо по пользователям конкретной группы). Если пользователь не авторизован, то добавляем его. В моём случае у группы «подписчики» ID 5, дополнительно присваиваю новому пользователю группу «зарегистрированные пользователи».

В принципе всё. Для красоты сделаем в личном кабинете пользователя галочку «подписка на новости». Тут нас ждёт сюрприз от Битрикса: в стандартном компоненте main.profile нет возможности менять группу пользователя, а у нас подписка на новости как раз на это и завязана. Делаем велосипед:

JS:
	$("input[name=F_SUBSCRIBE]").change(function(e){
		var todo = 'subscribe';
		if ($(this).is(":checked")) todo = 'subscribe';
		else todo = 'unsubscribe';
		
		var lnk = '/ajax/subscribe_actions.php';
		$.post(lnk, { todo: todo, act: 'subscribe_user' }, function(data) {
			// alert(data);
		}, "html");
		
	});


PHP (тот же файл /ajax/subscribe_actions.php):
require_once($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_before.php");
//пролог не забываем подключить, да
function subscribe_user(){
	global $APPLICATION,$USER;
	
	$todo = $_REQUEST["todo"];
	if(!empty($todo)){
	
		$rsUsers = CUser::GetByID($USER->GetParam('USER_ID')); // выбираем пользователей
		$is_filtered = $rsUsers->is_filtered; // отфильтрована ли выборка ?
		$rsUsers->NavStart(1); // разбиваем постранично по 50 записей

		if($ar = $rsUsers->GetNext()) {

			$UserID = $ar["ID"];
			if($UserID  > 0){
				$res = CUser::GetUserGroupList($UserID);
				while ($arGroup = $res->Fetch()){

					$arUserGroups[] = $arGroup["GROUP_ID"];
				}
				$k = array_search(5,$arUserGroups);
				if ($k > 0 && $todo == 'unsubscribe') {
					unset($arUserGroups[$k]);
					CUser::SetUserGroup($UserID, $arUserGroups);
					// echo 'Вы отподписаны.';
				}
				else {
					if ($todo == 'subscribe') {
						$arGroups = CUser::GetUserGroup($UserID);//лишняя контрольная выборка
						$arGroups[] = 5;
						CUser::SetUserGroup($UserID, $arGroups);
						// echo 'Вы успешно подписаны.';
					}
				}
			}
		}
	}
}
if($_REQUEST["act"]=="subscribe_user") subscribe_user();


Всё! Наслаждаемся. Как-нибудь напишу как в Битриксе можно автоматизировать рассылку.


перейти в Блог | Блог (стр. 2)

Ударим лайками по бездорожью, разгильдяйству и бюрократизму!


Ключевые слова (тэги): 1С-Битрикс 18  JavaScript 17  jQuery 10  PHP 25  web-программирование 41  

Вам есть что сказать — ну я же чую.
Высказаться о наболевшем, я выслушаю:
Имя


email (не публикуется)