Source of file CampaignMonitorMemberDOD.php
Size: 9,317 Bytes - Last Modified: 2021-12-23T10:39:01+00:00
/var/www/docs.ssmods.com/process/src/src/Decorators/CampaignMonitorMemberDOD.php
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266 | <?php namespace Sunnysideup\CampaignMonitor\Decorators; use SilverStripe\Forms\DropdownField; use SilverStripe\Forms\FieldList; use SilverStripe\Forms\GridField\GridField; use SilverStripe\Forms\GridField\GridFieldConfig_RelationEditor; use SilverStripe\Forms\ReadonlyField; use SilverStripe\ORM\DataExtension; use SilverStripe\Security\Group; use SilverStripe\Versioned\Versioned; use Sunnysideup\CampaignMonitor\Api\CampaignMonitorSignupFieldProvider; use Sunnysideup\CampaignMonitor\CampaignMonitorSignupPage; use Sunnysideup\CampaignMonitor\Model\CampaignMonitorSubscriptionLog; use Sunnysideup\CampaignMonitor\Traits\CampaignMonitorApiTrait; /** * @author nicolaas [at] sunnysideup.co.nz * @todoonly apply the on afterwrite to people in the subscriber group. */ class CampaignMonitorMemberDOD extends DataExtension { use CampaignMonitorApiTrait; private static $db = [ 'CM_PermissionToTrack' => 'Enum("Yes, No, Unchanged", "Unchanged")', ]; private static $has_many = [ 'CampaignMonitorSubscriptionLogs' => CampaignMonitorSubscriptionLog::class, ]; /** * returns a form field for signing up to all available lists * or if a list is provided, for that particular list. * * @param null|CampaignMonitorSignupPage|string $listPage * @param string $fieldName * @param string $fieldTitle * * @return \SilverStripe\Forms\FormField */ public function getCampaignMonitorSignupField($listPage = null, ?string $fieldName = '', ?string $fieldTitle = '') { $provider = $this->getCampaignMonitorSignupFieldProvider($listPage); return $provider->getCampaignMonitorSignupField($fieldName, $fieldTitle); } public function processCampaignMonitorSignupField($listPage, $data, $values): string { $provider = $this->getCampaignMonitorSignupFieldProvider($listPage); return $provider->processCampaignMonitorSignupField($data, $values); } public function updateCMSFields(FieldList $fields) { $fields->removeByName([ 'CampaignMonitorSubscriptionLogs', ]); $fields->addFieldsToTab( 'Root.Newsletter', [ DropdownField::create('CM_PermissionToTrack', 'Permission to track', singleton(__CLASS__)->owner->dbObject('CM_PermissionToTrack')->enumValues())->setDescription('For more info, please check <a href="https://help.campaignmonitor.com/permission-to-track" target="_blank">this page</a>.'), ReadonlyField::create( 'IsCampaignMonitorSubscriberNice', 'Has subcribed to any list - ever?', $this->IsCampaignMonitorSubscriber() ? 'yes' : 'no' ), ReadonlyField::create( 'CampaignMonitorSignedUpArrayNice', 'Currently Subscribed to', implode(',', $this->CampaignMonitorSignedUpArray()) ), GridField::create( 'CampaignMonitorSubscriptionLogs', 'Logs', $this->getOwner()->CampaignMonitorSubscriptionLogs(), GridFieldConfig_RelationEditor::create() ), ] ); } public function unsubscribeFromAllCampaignMonitorLists(?int $listId = 0) { $lists = CampaignMonitorSignupPage::get_ready_ones(); foreach ($lists as $list) { if (0 === $listId || $list->ListID === $listId) { $this->getOwner()->removeCampaignMonitorList($list->ListID); } } } /** * is this user currently signed up to one or more newsletters. */ public function IsCampaignMonitorSubscriber(): bool { $stage = Versioned::LIVE === Versioned::get_stage() ? '_Live' : ''; return (bool) CampaignMonitorSignupPage::get_ready_ones() ->where('MemberID = ' . $this->getOwner()->ID) ->innerJoin('Group_Members', 'CampaignMonitorSignupPage' . $stage . '.GroupID = Group_Members.GroupID') ->exists() ; } /** * add to Group * add to CM database... * * @param CampaignMonitorSignupPage|string $listPage * @param array $customFields * * @return bool - returns true on success */ public function addCampaignMonitorList($listPage, $customFields = []): bool { if (is_string($listPage)) { /** @var CampaignMonitorSignupPage $listPage */ $listPage = CampaignMonitorSignupPage::get()->filter(['ListID' => $listPage])->first(); } $logId = CampaignMonitorSubscriptionLog::log_attempt($this->owner, $listPage, 'Subscribe', $customFields); $successForGroups = $this->addToCampaignMonitorSecurityGroup($listPage); $successForCm = $this->addToCampaignMonitor($listPage, $customFields); CampaignMonitorSubscriptionLog::log_outcome($logId, $successForCm); return $successForGroups && $successForCm; } /** * remove from Group * remove from CM database... * * @param CampaignMonitorSignupPage|string $listPage * * @return bool returns true if successful */ public function removeCampaignMonitorList($listPage): bool { if (! ($listPage instanceof CampaignMonitorSignupPage)) { /** @var CampaignMonitorSignupPage $listPage */ $listPage = CampaignMonitorSignupPage::get()->filter(['ListID' => (string) $listPage])->first(); } $logId = CampaignMonitorSubscriptionLog::log_attempt($this->owner, $listPage, 'Unsubscribe'); $successForGroups = false; $successForCm = false; if ($listPage->GroupID) { $gp = Group::get_by_id($listPage->GroupID); if ($gp) { $groups = $this->getOwner()->Groups(); if ($groups) { $this->getOwner()->Groups()->remove($gp); $successForGroups = true; } } } if ($listPage->ListID) { $successForCm = $this->getCMAPI()->unsubscribeSubscriber($listPage->ListID, $this->owner); CampaignMonitorSubscriptionLog::log_outcome($logId, $successForCm); } return $successForGroups && $successForCm; } /** * returns a list of list IDs * that the user is currently subscribed to. */ public function CampaignMonitorSignedUpArray(): array { $lists = $this->getCMAPI()->getListsForEmail($this->owner); $array = []; if ($lists && count($lists)) { foreach ($lists as $listArray) { if (in_array($listArray->SubscriberState, ['Active', 'Bounced'], true)) { $array[$listArray->ListID] = $listArray->ListName; } } } return $array; } protected function getCampaignMonitorSignupFieldProvider($listPage = null) { $provider = CampaignMonitorSignupFieldProvider::create(); $provider->setMember($this->owner); $provider->setListPage($listPage); return $provider; } /** * returns true on success. * * @param CampaignMonitorSignupPage $listPage */ protected function addToCampaignMonitorSecurityGroup($listPage): bool { //internal database if ($listPage) { $gp = Group::get_by_id($listPage->GroupID); if ($gp) { $groups = $this->getOwner()->Groups(); if ($groups) { $this->getOwner()->Groups()->add($gp); return true; } } } else { user_error('Error, no subscription page supplied for group.'); } return false; } /** * returns true on success. * * @param CampaignMonitorSignupPage $listPage * @param array $customFields */ protected function addToCampaignMonitor($listPage, ?array $customFields = []): bool { $success = false; if ($listPage && $listPage->ListID) { if ($this->isPartOfCampaignMonitorList($listPage)) { $success = (bool) $this->getCMAPI()->updateSubscriber( $listPage->ListID, $this->owner, $oldEmailAddress = '', $customFields, $resubscribe = true, $restartSubscriptionBasedAutoResponders = false ); } else { $success = (bool) $this->getCMAPI()->addSubscriber( $listPage->ListID, $this->owner, $customFields, true, false ); } } else { user_error('Error, no subscription page supplied for campaign monitor subscription.'); } return $success; } protected function isPartOfCampaignMonitorList($listPage): bool { return (bool) $this->getCMAPI()->getSubscriber($listPage->ListID, $this->owner); } } |