Подписка пользователя в MailChimp PHP API + HOOK для FormIt MODx

Доброго времени суток дорогие друзья! Сегодня мы вам расскажем, как автоматически подписывать пользователя на рассылку с помощью API MailChimp. В данной статье мы сделаем это на примере MODx Revo, но адаптировать код под другую CMS, думаю, не составит труда.

Шаг первый. Ключ API.

Первым делом нам необходимо получить API ключ. Сделать это можно в личном кабинете MailChimp: Account->Extras->API Keys.

mailchimp api php

mailchimp api php

Надеюсь этот шаг не вызвал у вас затруднений. API ключ получен.

Шаг второй. Получаем идентификатор списка.

Следующим шагом нам необходимо получить ID для нашего списка или списков. Если они у вас не созданы, их нужно создать. Когда создали, переходим: Lists->[нашсписок]->Settings->List Name and Defaults. Тут мы и найдем наш идентификатор.

mailchimp api php

Шаг третий. Качаем класс для работы с API Maichimp.

C GitHub качаем класс для работы с API Mailchimp и загружаем на сервер. Если вы используете MODx, то я советую разместить его в папке /assets/. Отлично! Класс у нас загружен и размещен, осталось дело за малым.

Шаг четвертый. Пишем хук для FormIt.

Я не буду много разглагольствовать, а просто приведу код сниппета “mailchimp” с комментариями:

<?php
// подключаем MailChimp
include_once(MODX_BASE_PATH.'assets/mailchimp/inc/MailChimp.php');
use \DrewM\MailChimp\MailChimp;

// Наш API key
$apiKey = "dfgsdfgdfgdfgdf1-us99";
$MailChimp = new MailChimp($apiKey);

// проверяем есть ли email в отправленной форме
if($hook->getValue('email')){
  // в нашем случае у нас два списка
  $rulistid = '79f75a6gd56b4c';
  $enlistid = '66736a4jn53263';

  // вычисляем текущий контекст
  $context = $modx->context->key;
  

  
  $name = $hook->getValue('name');
  $mail = $hook->getValue('email');
  $fname = $name;
  $email= $mail;

  // вычисляем в какой список добавить
  if($context == 'web'){
	$list_id = $rulistid;
  }else{
	$list_id = $enlistid;
  }  
  // Отправляем запрос на сервер
  $result = $MailChimp->post("lists/".$list_id."/members", [
	'email_address' => $email,
	'merge_fields'  => ['FNAME'=>$fname],
	'status'        => 'subscribed',
  ]);

  if ($MailChimp->success()) {
	  // отправка прошла успешно
	  return true;
  }else{
	  // отправка прошла НЕ успешно, либо пользователь уже подписан
	  return true;
  }
}else{
	return true;
}

В нашем случае сайт имеет несколько языковых версий и списки для русской версии и остальных отличаются, поэтому у нас стоит проверка на принадлежность к контексту. Уточню, что данный код написан для MODx Revo, если вы используете другую CMS, его нужно адаптировать.

Далее просто указываем наш сниппет в вызове FormIt или AjaxForm:

[[!AjaxForm?
	&snippet=`FormIt`
	&form=`modalCallbackFormTpl`
	&hooks=`spam,email,FormItSaveForm,mailchimp`
	&emailTpl=`modalCallbackEmailTpl`
	&emailSubject=`Вам сообщение с сайта [[++site_name]]`
	&emailTo=`mail@mail.ru`
	&emailFrom=`noreply@site.ru`
	&formName=`Заказ обратного звонка`
	&validate=`name:required,phone:required,username:blank`
]]

Бонус. Добавляем пользователей из заполненных форм FormIt.

А этот код подпишет пользователей, которые заполняли формы до реализации подписки.

<?php
include_once(MODX_BASE_PATH.'assets/mailchimp/inc/MailChimp.php');
use \DrewM\MailChimp\MailChimp;

$apiKey = "d5fb8b58fcca12bbe6de3d210b557ghgh44530a1-us99";
$MailChimp = new MailChimp($apiKey);

$rulistid = '79f75fghfha6b4c';
$enlistid = '66736ahghjh4263';

$modelPath = $modx->getOption('formit.core_path', null, $modx->getOption('core_path', null, MODX_CORE_PATH) . 'components/formit/') . 'model/formit/';
$FormIt = $modx->getService('FormIt', 'FormIt', $modelPath, $scriptProperties);
if (!$FormIt) {
    return 'Could not load FormIt class!';
}
$q = $modx->newQuery('FormItForm');
$q->limit(500);

$forms = $modx->getCollection('FormItForm', $q);
echo '<p>Всего форм: '.count($forms).'</p>';
foreach ($forms as $k => $form) {
  $context = $form->get("context_key");
  
  $data = json_decode($form->get("values"), true);
  if($data["email"]){
	$name = $data["name"];
	$mail = $data["email"];
	$fname = $name;
	$email= $mail;

	if($context == 'web'){
	  $list_id = $rulistid;
	}else{
	  $list_id = $enlistid;
	}

	$result = $MailChimp->post("lists/".$list_id."/members", [
	  'email_address' => $email,
	  'merge_fields'  => ['FNAME'=>$fname],
	  'status'        => 'subscribed',
	]);
	
	if ($MailChimp->success()) {
	  echo "Подписан: ".$email.'</br>';
	  //return true;
	}else{
	  echo $MailChimp->getLastError().'</br>';
	  //return true;
	}
  }
}

Вот так легко мы произвели интеграцию с сервисом MailChimp. Спасибо, за внимание и до новых встреч!

Подписка пользователя в MailChimp PHP API + HOOK для FormIt MODx

0 Число голосов: 4
5
5
1
4

Комментарии ()

  1. Сергей 26 августа 2019, 11:03 # 0
    Спасибо!

    Наши клиенты

    Многие компании уже доверяют нам. Будьте в их числе!

    Хотите реализовать проект?

    Контакты

    Напишите нам - мы расскажем вам много интересного!


    Пермь, шоссе Космонавтов 252, офис 218