コード例 #1
0
 /**
  * @param SproutEmail_CampaignModel $campaign
  * @param string $tab
  *
  * @throws \Exception
  * @return int CampaignRecordId
  */
 public function saveCampaign(SproutEmail_CampaignModel $campaign, $tab = 'info')
 {
     $oldCampaign = null;
     if (is_numeric($campaign->id)) {
         $campaignRecord = SproutEmail_CampaignRecord::model()->findById($campaign->id);
         $oldCampaign = SproutEmail_CampaignModel::populateModel($campaignRecord);
     } else {
         $campaignRecord = new SproutEmail_CampaignRecord();
     }
     $transaction = craft()->db->getCurrentTransaction() === null ? craft()->db->beginTransaction() : null;
     // @todo - Refactor. We no longer use tabs in the CP section.
     switch ($tab) {
         case 'fields':
             $fieldLayout = $campaign->getFieldLayout();
             craft()->fields->saveLayout($fieldLayout);
             // Delete our previous record
             if ($campaign->id && $oldCampaign && $oldCampaign->fieldLayoutId) {
                 craft()->fields->deleteLayoutById($oldCampaign->fieldLayoutId);
             }
             // Assign our new layout id info to our
             // form model and records
             $campaign->fieldLayoutId = $fieldLayout->id;
             $campaignRecord->fieldLayoutId = $fieldLayout->id;
             $campaignRecord = $this->saveCampaignInfo($campaign);
             if ($campaignRecord->hasErrors()) {
                 if ($transaction) {
                     $transaction->rollBack();
                 }
                 return $campaign;
             }
             break;
             // save the campaign
         default:
             if ($campaign->type == 'notification') {
                 $campaign->type = Campaign::Notification;
             } else {
                 $campaign->type = Campaign::Email;
             }
             try {
                 // Save the Campaign
                 $campaignRecord = $this->saveCampaignInfo($campaign);
                 // Rollback if saving fails
                 if ($campaignRecord->hasErrors()) {
                     $transaction->rollBack();
                     return $campaign;
                 }
                 // If we have a Notification, also Save the Entry
                 if ($campaign->type == Campaign::Notification) {
                     if (isset($oldCampaign->id)) {
                         $criteria = craft()->elements->getCriteria('SproutEmail_Entry');
                         $criteria->campaignId = $oldCampaign->id;
                         $entry = $criteria->first();
                     }
                     if (isset($entry)) {
                         // if we have a blast already, update it
                         $entry->campaignId = $campaignRecord->id;
                         $entry->subjectLine = $entry->subjectLine != '' ? $entry->subjectLine : $campaign->name;
                         $entry->getContent()->title = $campaign->name;
                     } else {
                         // If we don't have a blast yet, create a new entry
                         $entry = new SproutEmail_EntryModel();
                         $entry->campaignId = $campaignRecord->id;
                         $entry->subjectLine = $campaign->name;
                         $entry->getContent()->title = $campaign->name;
                     }
                     if (sproutEmail()->entries->saveEntry($entry, $campaign)) {
                         // @todo - redirect and such
                     } else {
                         SproutEmailPlugin::log(json_encode($entry->getErrors()));
                     }
                 }
             } catch (\Exception $e) {
                 SproutEmailPlugin::log(json_encode($e));
                 throw new Exception(Craft::t('Error: Campaign could not be saved.'));
             }
             break;
     }
     if ($transaction) {
         $transaction->commit();
     }
     return SproutEmail_CampaignModel::populateModel($campaignRecord);
 }