Добавить пользователя в рассылки AcyMailing через свою форму

Если есть своя форма (какая-нибудь Обратная связь), автоматически подписать пользователя на рассылки AcyMailing.

За основу было взято руководство по интеграции в компонент BreezingForms  BREEZINGFORMS AND ACYMAILING из офф. документации AcyMailing. С той разнице, что нужные рассылки будут указаны в параметрах модуля.

Это не инструкция, просто как делалось себе, чтоб потом не вспоминать! Но постараюсь прокомментировать всё!

У меня Ajax модуль, т.е. отдельно форма (шаблоны форм), небольшой скрипт и один хэлпер для обработки форм. До acymailing так было просто удобнее.
А минус в том, что т.к. хэлпер один за вех, в форме пришлось делать скрытое поле с id рассылок. 

Как делалось.

В XML файле модуля в параметры добавил подключение параметров acymailing ( addfieldpath="/components/com_acymailing/params" ), чтобы можно было выбирать рассылки (просто подсмотрел в штатном модуле acymailing). Так же добавил поля для выбора рассылок по примеру того же модуля. Интересно, что если компонент не установлен, система даже не ругается, просто перестает работать поле с выбором рассылок.

<fields name="params" addfieldpath="/components/com_acymailing/params">
	<fieldset name="basic">
...
<field name="subscription" type="radio" class="btn-group" default="0" label="Подписать на рассылки com AcyMailing" description="Должен быть установлен и настроен компонент AcyMailing. Пользователь будет подписан на все выбранные рассылки, без возможности выбора."> <option value="1">JYES</option> <option value="0">JNO</option> </field> <field name="listschecked" type="lists" default="All" label="LISTS_CHECKED_DEFAULT" description="The selected lists will be checked by default on your module if they are visible." showon="subscription:1" />
...
</fieldset> </fields>

 С XML на этом всё.

В самой форме у меня два скрытых поля: одно с тем, что в модуле выбрано подписать на рассылку из параметров (field name="subscription"), второе с ID рассылок (выводит номера через запятую или «All» - все рассылки).

В общем перед отправкой формы есть две переменные:

$subscription  = 1; // - Подписать
$subs_list  = '1,2,3,'; // Или 'All' - на какие рассылки

Обработка формы.

В документации AcyMailing показано только как вручную в коде указать нужные рассылки, что не удобно, возьмём id рассылок из параметров своего модуля и немного поправим их пример. Комментарии по ходу:

if (isset($subscription)) { //Если в параметрах модуля выбрано подписать на рассылки 

	if(!include_once(rtrim(JPATH_ADMINISTRATOR, DIRECTORY_SEPARATOR).DIRECTORY_SEPARATOR.'components'.DIRECTORY_SEPARATOR.'com_acymailing'.DIRECTORY_SEPARATOR.'helpers'.DIRECTORY_SEPARATOR.'helper.php')){ //проверям на существование и подключаем
			return '<p class="warn">Не существует файла com_acymailing</p>';
		}

	$myUser = new stdClass();
	$myUser->email = strip_tags($subs_mail); //Please replace email_field by your own field name (the name of the field "email").
	$myUser->name = strip_tags($subs_name); //Please replace name_field by your own field name (the name of the field "name").

	$subscriberClass = acymailing_get('class.subscriber');
	$subid = $subscriberClass->save($myUser);

	//$subscriberClass->sendConf($subid); //we send the confirmation email... only if needed based on the current user status and the option from the Acy configuration page.
	
	
	// START Код из штатного модуля AcyMailing, нужен чтобы узнать ID всех созданный активных рассылок, если в параметрах модуля выбрано "All" - все рассылки
	$listsClass = acymailing_get('class.list');
	$allLists = $listsClass->getLists('listid');

	foreach($allLists as $oneList){
		if($oneList->published){
			$visibleListsArray[] = $oneList->listid; // ID всех рассылок
		}
	}

	$checkedLists = $subs_list; // $subs_list - своя переменная, чтоб не портить ориг. код
	if(strtolower($checkedLists) == 'all'){
		$checkedListsArray = $visibleListsArray; // Все активные рассылки
	}elseif(strpos($checkedLists, ',') OR is_numeric($checkedLists)){
		$checkedListsArray = explode(',', $checkedLists); // Id выбранных рассылок
	}else{
		$checkedListsArray = array();
	}
	// END Код из штатного модуля
	
	//$subscribe = array(1,4,5); //Specify here the ID of your lists separated by a comma, in this example the user will be subscribed to lists IDs 3,4 and 5.
	$subscribe = $checkedListsArray; // Подставляем выбранные в параметрах модуля
	$newSubscription = array();
	if(!empty($subscribe)){
	foreach($subscribe as $listId){
	$newList = array();
	$newList['status'] = 1;
	$newSubscription[$listId] = $newList;
	}
	}
	$subscriberClass->saveSubscription($subid,$newSubscription);
 
}