breadhead / mailchimp-ecommerce-event-pusher
MailChimp Ecommerce Event Pusher
3.0.0
2020-02-28 03:08 UTC
Requires
- php: >=7.2
- yiisoft/yii2: ~2.0.14
README
向MailChimp Ecommerce发送事件
进行迁移
php yii migrate --migrationPath=@vendor/breadhead/yii2-mailchimp-ecommerce-event-pusher/src/migrations/
从MailchimpEventInterface实现您的模型类。此电子商务模块用于跟踪
- 购物车
- 订单
- 客户和联系人
- 产品
实现示例
public function saveMailchimpEvent(string $event_type): MailchimpEvent
{
$event = (new MailchimpEvent())->setEntityId($this->id)->setEntityType(MailchimpEvent::CUSTOMER)->setEventType($event_type)->setData($this->getMailchimpData())->save();
return $event;
}
public function getMailchimpData()
{
return [
'id' => (string)$this->id,
"email_address" =>(string)$this->email,
'opt_in_status' => (bool)$this->subscribe,
'first_name' => (string)$this->name,
'last_name' => (string)$this->last_name,
'orders_count' => count($this->orders),
'total_spent' => (float)OrderModel::find()->where(['status' => OrderModel::PAYED, 'customer_id' => $this->id])->sum('total')
];
}
配置
'components' => [
'mailchimpeventpusher' => function () {
$storeId = <Your mailchimp store id>;
$mailchimpApiKey = <Your mailchimp api key>;
$listId = <Your mailchimp list id>;
$client = new \breadhead\mailchimp\api\MailchimpClient($mailchimpApiKey);
$sender = new \breadhead\mailchimp\MailchimpEventSender($client, $storeId, $listId);
return new \breadhead\mailchimp\MailchimpEventPusher($storeId, $sender);
}
]
发送事件代码示例
class MailchimpController extends Controller
{
private $maxEventsPerStep;
...
public function actionSendevents(): void
{
$jobs = $this->defineJobs();
$this->doJobs($jobs);
}
private function doJobs($jobs): bool
{
try {
$eventSender = \Yii::$app->mailchimpeventpusher->getManager();
foreach ($jobs as $event) {
$event->status = MailchimpEventModel::RUN;
Helper::saveAndLogModel($event);
$mailchimpEvent = MailchimpEvent::create($event->id);
/* @var MailchimpEventSender $eventSender */
$eventSender->sendEvent($mailchimpEvent);
}
} catch (\Exception $e) {
throw $e;
}
return true;
}
private function defineJobs(): array
{
if (MailchimpEventModel::findOne(['status' => MailchimpEventModel::RUN])) {
return [];
}
return MailchimpEventModel::find()
->where(['status' => MailchimpEventModel::NEW])
->orderBy(['created_at' => 'ASC'])
->limit($this->maxEventsPerStep)
->all();
}
...
}
重要问题:如果您需要取消客户订阅或删除客户,客户方法在这种情况下不起作用。您需要使用Member作为实体类型。以下是从CustomerModel ActiveRecord类中的示例了解更多详细信息
public function supportEvent(string $eventType): bool
{
$support = YII_ENV == 'prod';
if ($support && $eventType == ActiveRecord::EVENT_BEFORE_UPDATE && $this->subscribe <> $this->oldAttributes['subscribe']) {
$support = true;
}
return $support;
}
public function createAndSaveMailchimpEvent(string $eventType): MailchimpEvent
{
if ($this->user->status == BaseActiveRecord::DELETED && $eventType == ActiveRecord::EVENT_AFTER_UPDATE) {
$event = MailchimpEvent::createEmpty()
->setEntityId(MC_PREFIX . $this->id)
->setEntityType(MailchimpEvent::CONCACT)
->setEventType(ActiveRecord::EVENT_AFTER_DELETE)
->setData($this->getMailchimpMemberData())
->save();
} elseif ($eventType == ActiveRecord::EVENT_BEFORE_UPDATE) {
$event = MailchimpEvent::createEmpty()
->setEntityId(MC_PREFIX . $this->id)
->setEntityType(MailchimpEvent::CONCACT)
->setEventType(ActiveRecord::EVENT_AFTER_UPDATE)
->setData($this->getMailchimpMemberData())
->save();
} else {
$event = MailchimpEvent::createEmpty()
->setEntityId(MC_PREFIX . $this->id)
->setEntityType(MailchimpEvent::CUSTOMER)
->setEventType($eventType)
->setData($this->getMailchimpData())
->save();
}
return $event;
}
public function getMailchimpData()
{
return [
'id' => (string) MC_PREFIX . $this->id,
'email_address' => (string) $this->email,
'opt_in_status' => (bool) $this->subscribe,
'first_name' => (string) $this->name,
'orders_count' => count($this->orders),
'total_spent' => (float) OrderModel::find()
->where(['transaction.status' => OrderModel::PAYED, 'order.customer_id' => $this->id])
->joinWith('transaction')
->sum('transaction.total')
];
}
public function getMailchimpMemberData()
{
return [
'email_address' => $this->user->status == self::DELETED ? $this->name: $this->email,
'status' => $this->subscribe ? 'subscribed' : 'unsubscribed'
];
}