breadhead/mailchimp-ecommerce-event-pusher

MailChimp Ecommerce Event Pusher

3.0.0 2020-02-28 03:08 UTC

This package is auto-updated.

Last update: 2024-09-28 12:58:48 UTC


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'
    ];
}