/**
  * @depends testDetailsJsonActionForWorkflow
  */
 public function testDetailsJsonActionWithMergeTagResolution()
 {
     $contact = ContactTestHelper::createContactByNameForOwner('test', $this->user);
     $emailTemplateId = self::getModelIdByModelNameAndName('EmailTemplate', 'marketing 01');
     $emailTemplate = EmailTemplate::getById($emailTemplateId);
     $unsubscribePlaceholder = GlobalMarketingFooterUtil::resolveUnsubscribeUrlMergeTag();
     $manageSubscriptionsPlaceholder = GlobalMarketingFooterUtil::resolveManageSubscriptionsMergeTag();
     $emailTemplate->textContent = "Test text content with contact tag: [[FIRST^NAME]] {$unsubscribePlaceholder}";
     $emailTemplate->htmlContent = "Test html content with contact tag: [[FIRST^NAME]] {$manageSubscriptionsPlaceholder}";
     $this->assertTrue($emailTemplate->save());
     $this->setGetArray(array('id' => $emailTemplateId, 'renderJson' => true, 'includeFilesInJson' => false, 'contactId' => $contact->id));
     // @ to avoid headers already sent error.
     $content = @$this->runControllerWithExitExceptionAndGetContent('emailTemplates/default/detailsJson');
     $emailTemplateDetailsResolvedArray = CJSON::decode($content);
     $this->assertNotEmpty($emailTemplateDetailsResolvedArray);
     $this->assertEquals('Test text content with contact tag: test ', $emailTemplateDetailsResolvedArray['textContent']);
     $this->assertEquals('Test html content with contact tag: test ', $emailTemplateDetailsResolvedArray['htmlContent']);
 }
 /**
  * [[MODEL^URL]] : prints absolute url to the current model attached to template.
  * [[BASE^URL]] : prints absolute url to the current install without trailing slash.
  * [[APPLICATION^NAME]] : prints application name as set in global settings > application name.
  * [[CURRENT^YEAR]] : prints current year.
  * [[LAST^YEAR]] : prints last year.
  * [[OWNERS^AVATAR^SMALL]] : prints the owner's small avatar image (32x32).
  * [[OWNERS^AVATAR^MEDIUM ]] : prints the owner's medium avatar image (32x32).
  * [[OWNERS^AVATAR^LARGE]] : prints the owner's large avatar image (32x32).
  * [[OWNERS^EMAIL^SIGNATURE]] : prints the owner's email signature.
  * [[UNSUBSCRIBE^URL]] : prints unsubscribe url.
  * [[MANAGE^SUBSCRIPTIONS^URL]] : prints manage subscriptions url.
  * @return array
  */
 protected function getSpecialTagsData()
 {
     return array(array('id' => 'modelUrl', 'label' => Zurmo::t('EmailTemplatesModule', 'Model URL'), 'dataValue' => MergeTagsUtil::TAG_PREFIX . 'MODEL' . MergeTagsUtil::CAPITAL_DELIMITER . 'URL' . MergeTagsUtil::TAG_SUFFIX), array('id' => 'baseUrl', 'label' => Zurmo::t('EmailTemplatesModule', 'Base URL'), 'dataValue' => MergeTagsUtil::TAG_PREFIX . 'BASE' . MergeTagsUtil::CAPITAL_DELIMITER . 'URL' . MergeTagsUtil::TAG_SUFFIX), array('id' => 'applicationName', 'label' => Zurmo::t('ZurmoModule', 'Application Name'), 'dataValue' => MergeTagsUtil::TAG_PREFIX . 'APPLICATION' . MergeTagsUtil::CAPITAL_DELIMITER . 'NAME' . MergeTagsUtil::TAG_SUFFIX), array('id' => 'currentYear', 'label' => Zurmo::t('EmailTemplatesModule', 'Current Year'), 'dataValue' => MergeTagsUtil::TAG_PREFIX . 'CURRENT' . MergeTagsUtil::CAPITAL_DELIMITER . 'YEAR' . MergeTagsUtil::TAG_SUFFIX), array('id' => 'lastYear', 'label' => Zurmo::t('EmailTemplatesModule', 'Last Year'), 'dataValue' => MergeTagsUtil::TAG_PREFIX . 'LAST' . MergeTagsUtil::CAPITAL_DELIMITER . 'YEAR' . MergeTagsUtil::TAG_SUFFIX), array('id' => 'ownersAvatarSmall', 'label' => Zurmo::t('EmailTemplatesModule', 'Owner\'s Avatar Small'), 'dataValue' => MergeTagsUtil::TAG_PREFIX . 'OWNERS' . MergeTagsUtil::CAPITAL_DELIMITER . 'AVATAR' . MergeTagsUtil::CAPITAL_DELIMITER . 'SMALL' . MergeTagsUtil::TAG_SUFFIX), array('id' => 'ownersAvatarMedium', 'label' => Zurmo::t('EmailTemplatesModule', 'Owner\'s Avatar Medium'), 'dataValue' => MergeTagsUtil::TAG_PREFIX . 'OWNERS' . MergeTagsUtil::CAPITAL_DELIMITER . 'AVATAR' . MergeTagsUtil::CAPITAL_DELIMITER . 'MEDIUM' . MergeTagsUtil::TAG_SUFFIX), array('id' => 'ownersAvatarLarge', 'label' => Zurmo::t('EmailTemplatesModule', 'Owner\'s Avatar Large'), 'dataValue' => MergeTagsUtil::TAG_PREFIX . 'OWNERS' . MergeTagsUtil::CAPITAL_DELIMITER . 'AVATAR' . MergeTagsUtil::CAPITAL_DELIMITER . 'LARGE' . MergeTagsUtil::TAG_SUFFIX), array('id' => 'ownersEmailSignature', 'label' => Zurmo::t('EmailTemplatesModule', 'Owner\'s Email Signature'), 'dataValue' => MergeTagsUtil::TAG_PREFIX . 'OWNERS' . MergeTagsUtil::CAPITAL_DELIMITER . 'EMAIL' . MergeTagsUtil::CAPITAL_DELIMITER . 'SIGNATURE' . MergeTagsUtil::TAG_SUFFIX), array('id' => 'unsubscribeUrl', 'label' => Zurmo::t('EmailTemplatesModule', 'Unsubscribe URL'), 'dataValue' => GlobalMarketingFooterUtil::resolveUnsubscribeUrlMergeTag()), array('id' => 'manageSubscriptionsUrl', 'label' => Zurmo::t('EmailTemplatesModule', 'Manage Subscriptions URL'), 'dataValue' => GlobalMarketingFooterUtil::resolveManageSubscriptionsMergeTag()));
 }
 protected function renderSpecialTagsContent()
 {
     $content = ZurmoHtml::tag('h4', array(), 'Special Tags');
     $content = ZurmoHtml::tag('div', array('id' => 'mergetag-special-tags-head'), $content);
     $specialTagsContent = null;
     $specialTagsItems = array();
     $specialTagsItems[] = $this->renderBoldMergeTag(MergeTagsUtil::TAG_PREFIX . "MODEL" . MergeTagsUtil::CAPITAL_DELIMITER . "URL" . MergeTagsUtil::TAG_SUFFIX) . " : prints absolute url to the current model attached to template.";
     $specialTagsItems[] = $this->renderBoldMergeTag(MergeTagsUtil::TAG_PREFIX . "BASE" . MergeTagsUtil::CAPITAL_DELIMITER . "URL" . MergeTagsUtil::TAG_SUFFIX) . " : prints absolute url to the current install without trailing slash.";
     $specialTagsItems[] = $this->renderBoldMergeTag(MergeTagsUtil::TAG_PREFIX . "APPLICATION" . MergeTagsUtil::CAPITAL_DELIMITER . "NAME" . MergeTagsUtil::TAG_SUFFIX) . " : prints application name as set in global settings > application name.";
     $specialTagsItems[] = $this->renderBoldMergeTag(MergeTagsUtil::TAG_PREFIX . "CURRENT" . MergeTagsUtil::CAPITAL_DELIMITER . "YEAR" . MergeTagsUtil::TAG_SUFFIX) . " : prints current year.";
     $specialTagsItems[] = $this->renderBoldMergeTag(MergeTagsUtil::TAG_PREFIX . "LAST" . MergeTagsUtil::CAPITAL_DELIMITER . "YEAR" . MergeTagsUtil::TAG_SUFFIX) . " : prints last year.";
     $specialTagsItems[] = $this->renderBoldMergeTag(MergeTagsUtil::TAG_PREFIX . 'OWNERS' . MergeTagsUtil::CAPITAL_DELIMITER . 'AVATAR' . MergeTagsUtil::CAPITAL_DELIMITER . 'SMALL' . MergeTagsUtil::TAG_SUFFIX) . " : prints the owner's small avatar image (32x32).";
     $specialTagsItems[] = $this->renderBoldMergeTag(MergeTagsUtil::TAG_PREFIX . 'OWNERS' . MergeTagsUtil::CAPITAL_DELIMITER . 'AVATAR' . MergeTagsUtil::CAPITAL_DELIMITER . 'MEDIUM ' . MergeTagsUtil::TAG_SUFFIX) . " : prints the owner's medium avatar image (64x64).";
     $specialTagsItems[] = $this->renderBoldMergeTag(MergeTagsUtil::TAG_PREFIX . 'OWNERS' . MergeTagsUtil::CAPITAL_DELIMITER . 'AVATAR' . MergeTagsUtil::CAPITAL_DELIMITER . 'LARGE' . MergeTagsUtil::TAG_SUFFIX) . " : prints the owner's large avatar image (128x128).";
     $specialTagsItems[] = $this->renderBoldMergeTag(MergeTagsUtil::TAG_PREFIX . 'OWNERS' . MergeTagsUtil::CAPITAL_DELIMITER . 'EMAIL' . MergeTagsUtil::CAPITAL_DELIMITER . 'SIGNATURE' . MergeTagsUtil::TAG_SUFFIX) . " : prints the owner's email signature.";
     $specialTagsItems[] = $this->renderBoldMergeTag(MergeTagsUtil::TAG_PREFIX . 'GLOBAL' . MergeTagsUtil::CAPITAL_DELIMITER . 'MARKETING' . MergeTagsUtil::CAPITAL_DELIMITER . 'FOOTER' . MergeTagsUtil::CAPITAL_DELIMITER . 'PLAIN' . MergeTagsUtil::CAPITAL_DELIMITER . 'TEXT' . MergeTagsUtil::TAG_SUFFIX) . " : prints the Global Marketing Footer(Plain Text).";
     $specialTagsItems[] = $this->renderBoldMergeTag(MergeTagsUtil::TAG_PREFIX . 'GLOBAL' . MergeTagsUtil::CAPITAL_DELIMITER . 'MARKETING' . MergeTagsUtil::CAPITAL_DELIMITER . 'FOOTER' . MergeTagsUtil::CAPITAL_DELIMITER . 'HTML' . MergeTagsUtil::TAG_SUFFIX) . " : prints the Global Marketing Footer(Rich Text).";
     $specialTagsItems[] = $this->renderBoldMergeTag(GlobalMarketingFooterUtil::resolveUnsubscribeUrlMergeTag()) . " : prints unsubscribe url.";
     $specialTagsItems[] = $this->renderBoldMergeTag(GlobalMarketingFooterUtil::resolveManageSubscriptionsMergeTag()) . " : prints manage subscriptions url.";
     foreach ($specialTagsItems as $specialTagsItem) {
         $specialTagsContent .= ZurmoHtml::tag('li', array(), $specialTagsItem);
     }
     $specialTagsContent = ZurmoHtml::tag('ul', array(), $specialTagsContent);
     $specialTagsContent = ZurmoHtml::tag('div', array('id' => 'mergetag-special-tags-body'), $specialTagsContent);
     $content .= $specialTagsContent;
     $content = ZurmoHtml::tag('div', array('id' => 'mergetag-special-tags'), $content);
     return $content;
 }
 /**
  * @depends testProcessDueAutoresponderItemWithManageSubscriptionsUrlMergeTag
  */
 public function testProcessDueAutoresponderItemWithUnsubscribeAndManageSubscriptionsUrlMergeTags()
 {
     $email = new Email();
     $email->emailAddress = '*****@*****.**';
     $contact = ContactTestHelper::createContactByNameForOwner('contact 12', $this->user);
     $contact->primaryEmail = $email;
     $this->assertTrue($contact->save());
     $marketingList = MarketingListTestHelper::createMarketingListByName('marketingList 12', 'description', 'CustomFromName', '*****@*****.**');
     $autoresponder = AutoresponderTestHelper::createAutoresponder('subject 12', GlobalMarketingFooterUtil::resolveUnsubscribeUrlMergeTag() . ', ' . GlobalMarketingFooterUtil::resolveManageSubscriptionsMergeTag(), GlobalMarketingFooterUtil::resolveUnsubscribeUrlMergeTag() . ', ' . GlobalMarketingFooterUtil::resolveManageSubscriptionsMergeTag(), 1, Autoresponder::OPERATION_SUBSCRIBE, true, $marketingList);
     $processed = 0;
     $processDateTime = DateTimeUtil::convertTimestampToDbFormatDateTime(time());
     $autoresponderItem = AutoresponderItemTestHelper::createAutoresponderItem($processed, $processDateTime, $autoresponder, $contact);
     $this->processDueItem($autoresponderItem);
     $this->assertEquals(1, $autoresponderItem->processed);
     $textContent = $autoresponderItem->emailMessage->content->textContent;
     $htmlContent = $autoresponderItem->emailMessage->content->htmlContent;
     $this->assertNotEquals($autoresponder->textContent, $textContent);
     $this->assertNotEquals($autoresponder->htmlContent, $htmlContent);
     $this->assertContains('localhost', $textContent);
     $this->assertEquals(1, substr_count($textContent, '/marketingLists/external/unsubscribe?hash='));
     $this->assertContains('localhost', $htmlContent);
     $this->assertEquals(1, substr_count($htmlContent, '/marketingLists/external/unsubscribe?hash='));
     $this->assertContains('<img width="1" height="1" src="localhost', $htmlContent);
     $this->assertContains('/tracking/default/track?id=', $htmlContent);
     $this->assertEquals(2, substr_count($textContent, 'localhost'));
     $this->assertEquals(1, substr_count($textContent, '/marketingLists/external/manageSubscriptions?hash='));
     $this->assertContains(', localhost', $htmlContent);
     $this->assertEquals(1, substr_count($htmlContent, '/marketingLists/external/manageSubscriptions?hash='));
     $this->assertContains('<img width="1" height="1" src="localhost', $htmlContent);
     $this->assertContains('/tracking/default/track?id=', $htmlContent);
 }
 /**
  * @depends testCreateAndGetEmailTemplateById
  */
 public function testUnsubscribeAndManageSubscriptionsMergeTagsValidation()
 {
     $emailTemplate = new EmailTemplate();
     $emailTemplate->type = EmailTemplate::TYPE_CONTACT;
     $emailTemplate->subject = 'Another Test subject';
     $emailTemplate->name = 'Another Test Email Template';
     $emailTemplate->textContent = GlobalMarketingFooterUtil::resolveUnsubscribeUrlMergeTag() . ', ' . GlobalMarketingFooterUtil::resolveManageSubscriptionsMergeTag();
     $emailTemplate->htmlContent = GlobalMarketingFooterUtil::resolveUnsubscribeUrlMergeTag() . ', ' . GlobalMarketingFooterUtil::resolveManageSubscriptionsMergeTag();
     $emailTemplate->builtType = EmailTemplate::BUILT_TYPE_PASTED_HTML;
     $emailTemplate->modelClassName = 'Contact';
     $validated = $emailTemplate->validate(null, false, true);
     $this->assertTrue($validated);
     $this->assertEmpty($emailTemplate->getErrors());
 }
 /**
  * @depends testProcessDueCampaignItemWithManageSubscriptionsUrlMergeTag
  */
 public function testProcessDueCampaignItemWithUnsubscribeAndManageSubscriptionsUrlMergeTags()
 {
     $email = new Email();
     $email->emailAddress = '*****@*****.**';
     $contact = ContactTestHelper::createContactByNameForOwner('contact 17', $this->user);
     $contact->primaryEmail = $email;
     $this->assertTrue($contact->save());
     $marketingList = MarketingListTestHelper::createMarketingListByName('marketingList 17', 'description', null, null);
     MarketingListMemberTestHelper::createMarketingListMember(0, $marketingList, $contact);
     $campaign = CampaignTestHelper::createCampaign('campaign 15', 'subject 15', GlobalMarketingFooterUtil::resolveUnsubscribeUrlMergeTag() . ', ' . GlobalMarketingFooterUtil::resolveManageSubscriptionsMergeTag(), GlobalMarketingFooterUtil::resolveUnsubscribeUrlMergeTag() . ', ' . GlobalMarketingFooterUtil::resolveManageSubscriptionsMergeTag(), 'testFromName', '*****@*****.**', null, null, null, null, $marketingList);
     $processed = 0;
     $campaignItem = CampaignItemTestHelper::createCampaignItem($processed, $campaign, $contact);
     $this->processDueItem($campaignItem);
     $textContent = $campaignItem->emailMessage->content->textContent;
     $htmlContent = $campaignItem->emailMessage->content->htmlContent;
     $this->assertNotEquals($campaign->textContent, $textContent);
     $this->assertNotEquals($campaign->htmlContent, $htmlContent);
     $this->assertContains('localhost', $textContent);
     $this->assertEquals(1, substr_count($textContent, '/marketingLists/external/unsubscribe?hash='));
     $this->assertContains('localhost', $htmlContent);
     $this->assertEquals(1, substr_count($htmlContent, '/marketingLists/external/unsubscribe?hash='));
     $this->assertContains('<img width="1" height="1" src="localhost', $htmlContent);
     $this->assertContains('/tracking/default/track?id=', $htmlContent);
     $this->assertContains(', localhost', $textContent);
     $this->assertEquals(1, substr_count($textContent, '/marketingLists/external/manageSubscriptions?hash='));
     $this->assertContains(', localhost', $htmlContent);
     $this->assertEquals(1, substr_count($htmlContent, '/marketingLists/external/manageSubscriptions?hash='));
     $this->assertContains('<img width="1" height="1" src="localhost', $htmlContent);
     $this->assertContains('/tracking/default/track?id=', $htmlContent);
 }
                                                <!-- /standard article (right text) -->

                                            </td>
                                        </tr>
                                        <!-- /CONTENT -->

                                        <!-- FOOTER -->
                                        <tr>
                                            <td>
                                                <table bgcolor="#cccccc" text="#ffffff" width="100%" cellpadding="0" cellspacing="0" border="0">
                                                    <tr>
                                                        <td>
                                                            <table align="left" bgcolor="#cccccc" text="#333333" width="280" cellpadding="10" cellspacing="0" border="0" class="footer-left">
                                                                <tr>
                                                                    <td style="color:#333333;">
                                                                             <p> ' . GlobalMarketingFooterUtil::resolveUnsubscribeUrlMergeTag() . ' <br/> ' . GlobalMarketingFooterUtil::resolveManageSubscriptionsMergeTag() . '</p>
                                                                    </td>
                                                                </tr>
                                                            </table>
                                                            <table align="right" bgcolor="#cccccc" text="#333333" width="280" cellpadding="10" cellspacing="0" border="0" class="footer-right">
                                                                <tr>
                                                                    <td style="color:#333333;">
                                                                        <p>
                                                                            <a href="#" target="_blank"><img style="margin-left:1em;" align="right" src="' . PlaceholderImageUtil::resolveUrlForThemeFile('/default/images/demo/email-template-demo-one/facebook.gif') . '" width="32" height="32" border="0" alt="Facebook" /></a>
                                                                            <a href="#" target="_blank"><img style="margin-left:1em;" align="right" src="' . PlaceholderImageUtil::resolveUrlForThemeFile('/default/images/demo/email-template-demo-one/googleplus.gif') . '" width="32" height="32" border="0" alt="Google+" /></a>
                                                                            <a href="#" target="_blank"><img style="margin-left:1em;" align="right" src="' . PlaceholderImageUtil::resolveUrlForThemeFile('/default/images/demo/email-template-demo-one/linkedin.gif') . '" width="32" height="32" border="0" alt="LinkedIn" /></a>
                                                                            <a href="#" target="_blank"><img style="margin-left:1em;" align="right" src="' . PlaceholderImageUtil::resolveUrlForThemeFile('/default/images/demo/email-template-demo-one/twitter.gif') . '" width="32" height="32" border="0" alt="Twitter" /></a>
                                                                            <a href="#" target="_blank"><img style="margin-left:1em;" align="right" src="' . PlaceholderImageUtil::resolveUrlForThemeFile('/default/images/demo/email-template-demo-one/youtube.gif') . '" width="32" height="32" border="0" alt="YouTube" /></a>
                                                                        </p>
                                                                    </td>
                                                                </tr>