Source of file CampaignMonitorCampaign.php
Size: 14,082 Bytes - Last Modified: 2021-12-23T10:39:01+00:00
/var/www/docs.ssmods.com/process/src/src/Model/CampaignMonitorCampaign.php
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431 | <?php namespace Sunnysideup\CampaignMonitor\Model; use SilverStripe\Control\Director; use SilverStripe\Core\Config\Config; use SilverStripe\Forms\CheckboxSetField; use SilverStripe\Forms\LiteralField; use SilverStripe\Forms\OptionsetField; use SilverStripe\ORM\DataObject; use SilverStripe\ORM\FieldType\DBHTMLText; use SilverStripe\View\Requirements; use SilverStripe\View\SSViewer; use Sunnysideup\CampaignMonitor\CampaignMonitorSignupPage; use Sunnysideup\CampaignMonitor\Traits\CampaignMonitorApiTrait; /** *@author nicolaas [at] sunnysideup.co.nz */ class CampaignMonitorCampaign extends DataObject { use CampaignMonitorApiTrait; protected $countOfWrites = 0; /** * @var string */ private static $default_template = CampaignMonitorCampaign::class; private static $table_name = 'CampaignMonitorCampaign'; private static $db = [ 'HasBeenSent' => 'Boolean', 'MessageFromNewsletterServer' => 'Text', 'CreateAsTemplate' => 'Boolean', 'CreateFromWebsite' => 'Boolean', 'CreatedFromWebsite' => 'Boolean', 'TemplateID' => 'Varchar(40)', 'CampaignID' => 'Varchar(40)', 'Name' => 'Varchar(100)', 'Subject' => 'Varchar(100)', 'FromName' => 'Varchar(100)', 'FromEmail' => 'Varchar(100)', 'ReplyTo' => 'Varchar(100)', 'SentDate' => 'DBDatetime', 'WebVersionURL' => 'Varchar(255)', 'WebVersionTextURL' => 'Varchar(255)', 'Hide' => 'Boolean', 'Content' => 'HTMLText', 'Hash' => 'Varchar(32)', ]; private static $indexes = [ 'TemplateID' => true, 'CampaignID' => true, 'Hide' => true, 'Hash' => true, ]; private static $field_labels = [ 'CreateFromWebsite' => 'Create on newsletter server', ]; private static $has_one = [ 'CampaignMonitorCampaignStyle' => CampaignMonitorCampaignStyle::class, ]; private static $many_many = [ 'Pages' => CampaignMonitorSignupPage::class, ]; private static $searchable_fields = [ 'Subject' => 'PartialMatchFilter', 'Content' => 'PartialMatchFilter', 'Hide' => 'ExactMatchFilter', ]; private static $summary_fields = [ 'Subject' => 'Subject', 'SentDate' => 'Sent Date', ]; private static $singular_name = 'Campaign'; private static $plural_name = 'Campaigns'; private static $default_sort = 'Hide ASC, SentDate DESC'; private $_hasBeenSent; private $_existsOnCampaignMonitorCheck; public function canDelete($member = null) { return $this->HasBeenSentCheck() ? false : parent::canDelete($member); } public function getCMSFields() { $fields = parent::getCMSFields(); //readonly $fields->makeFieldReadonly('MessageFromNewsletterServer'); $fields->makeFieldReadonly('CampaignID'); $fields->makeFieldReadonly('TemplateID'); $fields->makeFieldReadonly('WebVersionURL'); $fields->makeFieldReadonly('WebVersionTextURL'); $fields->makeFieldReadonly('SentDate'); $fields->makeFieldReadonly('HasBeenSent'); $fields->makeFieldReadonly('Hash'); //removed $fields->removeFieldFromTab('Root.Main', 'CreatedFromWebsite'); $fields->removeFieldFromTab('Root.Main', 'CreatedTemplateFromWebsite'); $fields->removeFieldFromTab('Root.Main', 'SecurityCode'); //pages $pages = CampaignMonitorSignupPage::get()->map('ID', 'Title')->toArray(); $fields->removeFieldFromTab('Root.Main', 'Pages'); $fields->replaceField('CreateAsTemplate', new OptionsetField('CreateAsTemplate', 'Type', [0 => 'Create as Campaign', 1 => 'Create as Template'])); if (count($pages)) { $fields->addFieldToTab('Root.Pages', new CheckboxSetField('Pages', 'Shown on the following pages ...', $pages)); } if ($this->ExistsOnCampaignMonitorCheck()) { $fields->removeFieldFromTab('Root.Main', 'CreateAsTemplate'); if (! $this->CreateAsTemplate) { $fields->removeFieldFromTab('Root.Main', 'CreateFromWebsite'); if (! $this->HasBeenSentCheck()) { $fields->addFieldToTab('Root.Main', new LiteralField('CreateFromWebsiteRemake', '<h2>To edit this newsletter, please first delete it from your newsletter server</h2>'), 'CampaignID'); } } $fields->removeFieldFromTab('Root.Main', 'Hash'); $fields->removeFieldFromTab('Root.Main', 'CampaignMonitorCampaignStyleID'); $fields->makeFieldReadonly('Name'); $fields->makeFieldReadonly('Subject'); $fields->makeFieldReadonly('FromName'); $fields->makeFieldReadonly('FromEmail'); $fields->makeFieldReadonly('ReplyTo'); $fields->makeFieldReadonly('SentDate'); $fields->makeFieldReadonly('WebVersionURL'); $fields->makeFieldReadonly('WebVersionTextURL'); $fields->makeFieldReadonly('Content'); } else { $this->CampaignID = null; $this->TemplateID = null; } if ($this->HasBeenSentCheck()) { $fields->addFieldToTab('Root.Main', new LiteralField('Link', '<h2><a target="_blank" href="' . $this->Link() . '">Link</a></h2>'), 'CampaignID'); } else { $fields->removeFieldFromTab('Root.Main', 'Hide'); if ($this->exists()) { if ($this->ExistsOnCampaignMonitorCheck()) { $fields->removeFieldFromTab('Root.Main', 'CreateFromWebsite'); } else { $fields->addFieldToTab('Root.Main', new LiteralField('PreviewLink', '<h2><a target="_blank" href="' . $this->PreviewLink() . '">Preview Link</a></h2>'), 'CampaignID'); } } else { $fields->removeFieldFromTab('Root.Main', 'CreateFromWebsite'); } } return $fields; } /** * returns link to view campaign. * * @param mixed $action */ public function Link($action = ''): string { $page = $this->Pages()->First(); if ($page) { $link = $page->Link('viewcampaign' . $action . '/' . $this->ID . '/'); return Director::absoluteURL($link); } return '#'; } /** * returns link to view preview campaign * this link is used to create templates / campaigns on Campaign Monitor. * * @param mixed $action */ public function PreviewLink($action = ''): string { $page = $this->Pages()->First(); if ($page) { $link = $page->Link('previewcampaign' . $action . '/' . $this->ID . '/?hash=' . $this->Hash); return Director::absoluteURL($link); } return ''; } /** * html for newsletter to be created. */ public function getNewsletterContent(): string { $extension = $this->extend('updateNewsletterContent', $content); if (is_array($extension) && count($extension)) { return $extension[0]; } $html = ''; if (class_exists('\Pelago\Emogrifier')) { $allCSS = ''; $cssFileLocations = $this->getCSSFileLocations(); foreach ($cssFileLocations as $cssFileLocation) { $cssFileHandler = fopen($cssFileLocation, 'r'); $allCSS .= fread($cssFileHandler, filesize($cssFileLocation)); fclose($cssFileHandler); } $isThemeEnabled = Config::inst()->get(SSViewer::class, 'theme_enabled'); if (! $isThemeEnabled) { Config::modify()->update(SSViewer::class, 'theme_enabled', true); } Requirements::clear(); $templateName = $this->getRenderWithTemplate(); $html = $this->RenderWith($templateName); if (! $isThemeEnabled) { Config::modify()->update(SSViewer::class, 'theme_enabled', false); } $html = CssInliner::fromHtml($html) ->inlineCss($allCSS) ->render() ; } else { user_error('Please include Emogrifier module'); } return $html; } /** * provide template used for RenderWith. * * @return string */ public function getRenderWithTemplate() { $style = $this->CampaignMonitorCampaignStyle(); if ($style) { if ($style->exists() && $style->TemplateName) { return $style->TemplateName; } } return $this->Config()->get('default_template'); } /** * @return DBHTMLText */ public function getHTMLContent() { $style = $this->CampaignMonitorCampaignStyle(); if ($style) { return $style->getHTMLContent($this); } return $this->RenderWith(CampaignMonitorCampaign::class); } public function HasBeenSentCheck() { //lazy check if ($this->HasBeenSent || $this->WebVersionURL) { return true; } //real check if (null === $this->_hasBeenSent) { if (! $this->CampaignID) { $this->_hasBeenSent = false; } elseif (! $this->HasBeenSent) { //$api = $this->getCMAPI(); $result = $this->api->getCampaigns(); if (isset($result)) { foreach ($result as $campaign) { if ($this->CampaignID === $campaign->CampaignID) { $this->HasBeenSent = true; $this->write(); $this->_hasBeenSent = true; break; } } } } else { $this->_hasBeenSent = $this->HasBeenSent; } } return $this->_hasBeenSent; } /** * checks if the template and/or the campaign exists. * * @param mixed $forceRecheck * * @return bool */ public function ExistsOnCampaignMonitorCheck($forceRecheck = false) { //lazy check if ($this->HasBeenSent) { return true; } //real check if (null === $this->_existsOnCampaignMonitorCheck || $forceRecheck) { $this->_existsOnCampaignMonitorCheck = false; if ($this->CreateAsTemplate) { $field = 'TemplateID'; $apiMethod1 = 'getTemplates'; $apiMethod2 = ''; } else { $field = 'CampaignID'; $apiMethod1 = 'getDrafts'; $apiMethod2 = 'getCampaigns'; } if (! $this->{$field}) { //do nothing } else { //check drafts $result = $this->api->{$apiMethod1}(); if (isset($result)) { foreach ($result as $campaign) { if ($this->{$field} === $campaign->{$field}) { $this->_existsOnCampaignMonitorCheck = true; break; } } } elseif ($apiMethod2) { //check sent ones $result = $this->api->{$apiMethod2}(); if (isset($result)) { foreach ($result as $campaign) { if ($this->{$field} === $campaign->{$field}) { $this->_existsOnCampaignMonitorCheck = true; break; } } } } } } return $this->_existsOnCampaignMonitorCheck; } protected function onBeforeWrite() { parent::onBeforeWrite(); if (! $this->Hash) { $this->Hash = substr(hash('md5', uniqid()), 0, 7); } $test = $this->ExistsOnCampaignMonitorCheck($forceRecheck = true); if (! $test) { if ($this->CreateAsTemplate) { $this->TemplateID = null; } else { $this->CampaignID = null; } } } protected function onAfterWrite() { parent::onAfterWrite(); if (! $this->Pages()->exists()) { $page = CampaignMonitorSignupPage::get()->first(); if ($page) { $this->Pages()->add($page); } } ++$this->countOfWrites; $testA = $this->ExistsOnCampaignMonitorCheck($forceRecheck = true); $testB = $this->CreateFromWebsite; $testC = $this->countOfWrites < 3; if (! $testA && $testB && $testC) { $api = $this->getCMAPI(); if ($this->CreateAsTemplate) { if ($this->TemplateID) { $api->updateTemplate($this, $this->TemplateID); } else { $api->createTemplate($this); } } else { $api->createCampaign($this); } } } protected function onBeforeDelete() { parent::onBeforeDelete(); $this->ExistsOnCampaignMonitorCheck($forceRecheck = true); if ($this->HasBeenSentCheck()) { //do nothing } elseif ($this) { $api = $this->getCMAPI(); if ($this->CreateAsTemplate) { $api->deleteTemplate($this->TemplateID); } else { $api->deleteCampaign($this->CampaignID); } } } /** * @return array */ protected function getCSSFileLocations() { $style = $this->CampaignMonitorCampaignStyle(); if ($style) { return $style->getCSSFilesAsArray(); } return []; } } |