Добавить пользователя в рассылки 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);
}