azine /
email-bundle
| 1 | <?php |
||
| 2 | |||
| 3 | namespace Azine\EmailBundle\Services; |
||
| 4 | |||
| 5 | /* |
||
| 6 | * This Service provides the templates and template-variables to be used for emails |
||
| 7 | * @author Dominik Businger |
||
| 8 | */ |
||
| 9 | use Azine\EmailBundle\DependencyInjection\AzineEmailExtension; |
||
| 10 | use Symfony\Bundle\FrameworkBundle\Translation\Translator; |
||
| 11 | use Symfony\Component\Routing\Generator\UrlGeneratorInterface; |
||
| 12 | use Symfony\Component\Translation\TranslatorInterface; |
||
| 13 | |||
| 14 | class AzineTemplateProvider implements TemplateProviderInterface |
||
| 15 | { |
||
| 16 | const BASE_TEMPLATE = 'AzineEmailBundle::baseEmailLayout'; |
||
| 17 | const NEWSLETTER_TEMPLATE = 'AzineEmailBundle::newsletterEmailLayout'; |
||
| 18 | const NOTIFICATIONS_TEMPLATE = 'AzineEmailBundle::notificationsEmailLayout'; |
||
| 19 | const CONTENT_ITEM_MESSAGE_TEMPLATE = 'AzineEmailBundle:contentItem:message'; |
||
| 20 | const EMAIL_UPDATE_CONFIRMATION_TEMPLATE = '@AzineEmailUpdateConfirmation/Email/email_update_confirmation'; |
||
| 21 | const FOS_USER_PWD_RESETTING_TEMPLATE = '@FOSUser/Resetting/email'; |
||
| 22 | const FOS_USER_REGISTRATION_TEMPLATE = '@FOSUser/Registration/email'; |
||
| 23 | const FOS_USER_CONFIRM_EMAIL_UPDATE = '@FOSUser/Profile/email_update_confirmation'; |
||
| 24 | const SEND_IMMEDIATELY_FLAG = 'AzineEmailBundle_SendThisEmailImmediately'; |
||
| 25 | |||
| 26 | /** |
||
| 27 | * Override this function for your template(s)! |
||
| 28 | * |
||
| 29 | * For each template you like to render, you need to supply the array with variables that can be passed to the twig renderer. |
||
| 30 | * Those variables can then be used in the twig-template => {{ logo_png }} |
||
| 31 | * |
||
| 32 | * In this function you should fill a set of variables for each template. |
||
| 33 | * |
||
| 34 | * @param string $template the template id in standard-notation, without the ending ( .txt.twig) => "AcmeFooBundle:bar:default" |
||
| 35 | * |
||
| 36 | * @return array |
||
| 37 | 11 | */ |
|
| 38 | protected function getParamArrayFor($template) |
||
| 39 | { |
||
| 40 | // this implementation uses the same array for all templates. |
||
| 41 | // override this function with a more sophisticated logic |
||
| 42 | // if you need different styles for different templates. |
||
| 43 | 11 | ||
| 44 | $newVars = array(); |
||
| 45 | |||
| 46 | 11 | // add template-specific stuff. |
|
| 47 | 1 | if (self::NOTIFICATIONS_TEMPLATE == $template) { |
|
| 48 | $newVars['subject'] = 'Your notifications sent by AzineEmailBundle'; |
||
| 49 | } |
||
| 50 | 11 | ||
| 51 | 5 | if (self::NEWSLETTER_TEMPLATE == $template) { |
|
| 52 | $newVars['subject'] = 'Newsletter sent by AzineEmailBundle'; |
||
| 53 | } |
||
| 54 | |||
| 55 | 11 | // send some mails immediately instead of spooled |
|
| 56 | 10 | if (self::FOS_USER_PWD_RESETTING_TEMPLATE == $template |
|
| 57 | 11 | || self::FOS_USER_REGISTRATION_TEMPLATE == $template |
|
| 58 | || self::FOS_USER_CONFIRM_EMAIL_UPDATE == $template |
||
| 59 | 3 | || self::EMAIL_UPDATE_CONFIRMATION_TEMPLATE == $template |
|
| 60 | ) { |
||
| 61 | $newVars[self::SEND_IMMEDIATELY_FLAG] = true; |
||
| 62 | } |
||
| 63 | |||
| 64 | // add generic stuff needed for all templates |
||
| 65 | |||
| 66 | // add images to be encoded and attached to the email |
||
| 67 | // the absolute file-path will be replaced with the CID of |
||
| 68 | // the attached image, so it will be rendered in the html-email. |
||
| 69 | 11 | // => to render the logo inside your twig-template you can write: |
|
| 70 | 11 | // <html><body> ... <img src="{{ logo_png }}" alt="logo"> ... </body></html> |
|
| 71 | 11 | $imagesDir = $this->getTemplateImageDir(); |
|
| 72 | 11 | $newVars['logo_png'] = $imagesDir.'logo.png'; |
|
| 73 | 11 | $newVars['bottom_shadow_png'] = $imagesDir.'bottomshadow.png'; |
|
| 74 | 11 | $newVars['top_shadow_png'] = $imagesDir.'topshadow.png'; |
|
| 75 | 11 | $newVars['left_shadow_png'] = $imagesDir.'left-shadow.png'; |
|
| 76 | $newVars['right_shadow_png'] = $imagesDir.'right-shadow.png'; |
||
| 77 | $newVars['placeholder_png'] = $imagesDir.'placeholder.png'; |
||
| 78 | 11 | ||
| 79 | 11 | // define some colors to be reused in the following style-definitions |
|
| 80 | 11 | $azGreen = 'green'; |
|
| 81 | 11 | $azBlue = 'blue'; |
|
| 82 | $blackColor = 'black'; |
||
| 83 | $lightGray = '#EEEEEE'; |
||
| 84 | |||
| 85 | // add html-styles for your html-emails |
||
| 86 | 11 | // css does not work in html-emails, so all styles need to be |
|
| 87 | 11 | // embeded directly into the html-elements |
|
| 88 | 11 | $newVars['azGreen'] = $azGreen; |
|
| 89 | 11 | $newVars['azBlue'] = $azBlue; |
|
| 90 | 11 | $newVars['blackColor'] = $blackColor; |
|
| 91 | 11 | $newVars['lightGray'] = $lightGray; |
|
| 92 | 11 | $newVars['bodyBackgroundColor'] = '#fdfbfa'; |
|
| 93 | 11 | $newVars['contentBackgroundColor'] = '#f2f1f0'; |
|
| 94 | 11 | $fontFamily = 'Arial, Helvetica, sans-serif'; |
|
| 95 | 11 | $newVars['fontFamily'] = $fontFamily; |
|
| 96 | 11 | $newVars['emailWidth'] = 640; // width for the whole email-body |
|
| 97 | 11 | $newVars['shadowWidth'] = 10; // width for the shadows left and right of the content |
|
| 98 | 11 | $newVars['contentWidth'] = 620; // width for the mail content |
|
| 99 | 11 | $newVars['mediaQueryWidth'] = 479; // width for the media-query for mobile devices |
|
| 100 | 11 | $newVars['mobileEmailWidth'] = 459; // width for the whole email-body for mobile devices |
|
| 101 | $newVars['mobileContentWidth'] = 439; // width for the mail content for mobile devices |
||
| 102 | 11 | $newVars['footerBackgroundColor'] = '#434343'; |
|
| 103 | 11 | ||
| 104 | 11 | $newVars['h1Style'] = "style='padding:0; margin:0; font:bold 30px $fontFamily; color:$azBlue; text-decoration:none;'"; |
|
| 105 | 11 | $newVars['h2Style'] = "style='padding:0; margin:0; font:bold 24px $fontFamily; color:$azBlue; text-decoration:none;'"; |
|
| 106 | 11 | $newVars['h3Style'] = "style='margin:12px 0 5px 0; font:bold 18px $fontFamily; padding:0; color:$azGreen; text-decoration:none;'"; |
|
| 107 | 11 | $newVars['h4Style'] = "style='padding:0; margin:0 0 20px 0; color:$blackColor; font-size:14px; text-decoration:none;'"; |
|
| 108 | 11 | $newVars['smallGreyStyle'] = "style='color: grey; font: $fontFamily 11px;'"; |
|
| 109 | 11 | $newVars['salutationStyle'] = "style='color:$azBlue; font:bold 16px $fontFamily;'"; |
|
| 110 | 11 | $newVars['smallerTextStyle'] = "style='font: normal 13px/18px $fontFamily;'"; |
|
| 111 | 11 | $newVars['dateStyle'] = "style='padding:0; margin:5px 0; color:$blackColor; font-weight:bold; font-size:12px;'"; |
|
| 112 | 11 | $newVars['readMoreLinkStyle'] = "style='color:$azGreen; text-decoration:none; font-size:13px;'"; |
|
| 113 | 11 | $newVars['titleLinkStyle'] = "style='text-decoration:none;'"; |
|
| 114 | 11 | $newVars['salutationStyle'] = "style='color:$azBlue; font:bold 16px Arial;'"; |
|
| 115 | 11 | $newVars['dateStyle'] = "style='padding:0; margin:5px 0; color:$blackColor; font-weight:bold; font-size:12px;'"; |
|
| 116 | 11 | $newVars['smallerTextStyle'] = "style='font: normal 13px/18px Arial, Helvetica, sans-serif;'"; |
|
| 117 | $newVars['actionButtonStyle'] = "style='font-weight: bold; background: none repeat scroll 0 0 #DF940B; border: 1px solid orange; border-radius: 5px; box-shadow: 0 1px 0 #DF940B inset; color: white; padding: 10px;'"; |
||
| 118 | $newVars['sloganStyle'] = "style='font-size: 16px; color:$blackColor; margin: 0px; padding: 0px;'"; |
||
| 119 | 11 | ||
| 120 | 11 | // some simple txt styling elements |
|
| 121 | 11 | $newVars['txtH1Style'] = '////////////////////////////////////////////////////////////////////////////////'; |
|
| 122 | 11 | $newVars['txtH2Style'] = '================================================================================'; |
|
| 123 | 11 | $newVars['txtH3Style'] = '--------------------------------------------------------------------------------'; |
|
| 124 | $newVars['txtH4Style'] = "''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''"; |
||
| 125 | 11 | $newVars['txtHR'] = '________________________________________________________________________________'; |
|
| 126 | |||
| 127 | return $newVars; |
||
| 128 | } |
||
| 129 | |||
| 130 | /** |
||
| 131 | * Override this function for your template(s) if you use other "snippets" with embedded images. |
||
| 132 | * |
||
| 133 | * This function adds more complex elements to the array of variables that are passed |
||
| 134 | * to the twig-renderer, just before sending the mail. |
||
| 135 | * |
||
| 136 | * In this implementation for example some reusable "snippets" are added to render |
||
| 137 | * a nice shadow around content parts and add a "link to top" at the top of each part. |
||
| 138 | * |
||
| 139 | * As these "snippets" contain references to images that first had to be embedded into the |
||
| 140 | * Message, these "snippets" are added after embedding/adding the attachments. |
||
| 141 | * |
||
| 142 | * This means, that here the variable "bottom_shadow_png" defined in AzineTemplateProvider.fillParamArrayFor() |
||
| 143 | * does not contain the path to the image-file anymore but now contains the CID of the embedded image. |
||
| 144 | * |
||
| 145 | * @param string $template the template id in standard-notation, without the ending ( .txt.twig) => "AcmeFooBundle:bar:default" |
||
| 146 | * @param array $vars |
||
| 147 | * @param string $emailLocale |
||
| 148 | * |
||
| 149 | * @throws \Exception |
||
| 150 | * |
||
| 151 | 11 | * @return array of strings |
|
| 152 | */ |
||
| 153 | protected function getSnippetArrayFor($template, array $vars, $emailLocale) |
||
| 154 | { |
||
| 155 | // this implementation uses the same snippets for all templates. |
||
| 156 | // override this function with a more sophisticated logic |
||
| 157 | // if you need different snippets for different templates. |
||
| 158 | |||
| 159 | // the snippets added in this implementation depend on the |
||
| 160 | 11 | // following images, so they must be present in the $vars-array |
|
| 161 | 10 | if ( |
|
| 162 | 10 | !array_key_exists('bottom_shadow_png', $vars) || |
|
| 163 | 11 | !array_key_exists('top_shadow_png', $vars) || |
|
| 164 | !array_key_exists('left_shadow_png', $vars) || |
||
| 165 | 1 | !array_key_exists('right_shadow_png', $vars) |
|
| 166 | ) { |
||
| 167 | throw new \Exception('some required images are not yet added to the template-vars array.'); |
||
| 168 | 10 | } |
|
| 169 | |||
| 170 | $snippets = array(); |
||
| 171 | 10 | ||
| 172 | 10 | // define some vars that are used several times |
|
| 173 | 10 | $lightGray = $vars['lightGray']; |
|
| 174 | 9 | $blackColor = $vars['blackColor']; |
|
| 175 | $upLinkTitle = $this->getTranslator($emailLocale)->trans('html.email.go.to.top.link.label', array(), 'messages', $emailLocale); |
||
| 176 | $fontFamily = $vars['fontFamily']; |
||
| 177 | 9 | ||
| 178 | 9 | // create and add html-elements for easy reuse in the twig-templates |
|
| 179 | 9 | $snippets['linkToTop'] = "<a href='#top' style='text-decoration:none;color:$blackColor' title='$upLinkTitle'>Λ</a>"; |
|
| 180 | 9 | $snippets['tableOpen'] = "<table summary='box with shadows' class='emailWidth' width='".$vars['emailWidth']."' border='0' align='center' cellpadding='0' cellspacing='0' style='font: normal 14px/18px $fontFamily;'>"; |
|
| 181 | 9 | $snippets['topShadow'] = $snippets['tableOpen']."<tr><td class='emailWidth' colspan='3' width='".$vars['emailWidth']."'><img class='emailWidth' width='".$vars['emailWidth']."' height='10' src='".$vars['top_shadow_png']."' alt='' style='vertical-align: bottom;'/></td></tr>"; |
|
| 182 | 9 | $snippets['leftShadow'] = "<tr><td width='10' style='border-right: 1px solid $lightGray; background-image: url(\"".$vars['left_shadow_png']."\");'> </td>"; |
|
| 183 | 9 | $snippets['rightShadow'] = "<td width='10' style='border-left: 1px solid $lightGray; background-image: url(\"".$vars['right_shadow_png']."\");'> </td></tr>"; |
|
| 184 | 9 | $snippets['bottomShadow'] = " <tr><td colspan='3' class='emailWidth' width='".$vars['emailWidth']."'><img src='".$vars['bottom_shadow_png']."' class='emailWidth' width='".$vars['emailWidth']."' height='10' alt='' style='vertical-align: top;'/></td></tr></table>"; |
|
| 185 | $snippets['linkToTopRow'] = $snippets['leftShadow']."<td width='610' bgcolor='white' style='text-align: right; padding: 5px 5px 0; border-top: 1px solid $lightGray;'>".$snippets['linkToTop'].'</td>'.$snippets['rightShadow']; |
||
| 186 | 9 | $snippets['cellSeparator'] = '</td>'.$snippets['rightShadow'].$snippets['bottomShadow'].$snippets['topShadow'].$snippets['linkToTopRow'].$snippets['leftShadow']."<td bgcolor='white' width='580' align='left' valign='top' style='padding:10px 20px 20px 20px;'>"; |
|
| 187 | |||
| 188 | return $snippets; |
||
| 189 | } |
||
| 190 | |||
| 191 | /** |
||
| 192 | * Override this function to define your own campaign-parameters |
||
| 193 | * (non-PHPdoc). |
||
| 194 | * |
||
| 195 | 8 | * @see Azine\EmailBundle\Services\TemplateProviderInterface::getCampaignParamsFor() |
|
| 196 | */ |
||
| 197 | public function getCampaignParamsFor($templateId, array $params = null) |
||
| 198 | 8 | { |
|
| 199 | 8 | $campaignParams = array( |
|
| 200 | $this->tracking_params_campaign_medium => 'email', |
||
| 201 | $this->tracking_params_campaign_name => date('y-m-d'), |
||
| 202 | 8 | ); |
|
| 203 | 5 | ||
| 204 | 4 | if (self::NEWSLETTER_TEMPLATE == $templateId) { |
|
| 205 | 1 | $campaignParams[$this->tracking_params_campaign_source] = 'newsletter'; |
|
| 206 | 4 | } elseif (self::NOTIFICATIONS_TEMPLATE == $templateId) { |
|
| 207 | 1 | $campaignParams[$this->tracking_params_campaign_source] = 'mailnotify'; |
|
| 208 | } elseif (self::CONTENT_ITEM_MESSAGE_TEMPLATE == $templateId) { |
||
| 209 | $campaignParams[$this->tracking_params_campaign_content] = 'message'; |
||
| 210 | 3 | ||
| 211 | 2 | // don't track password-reset emails |
|
| 212 | } elseif (self::FOS_USER_PWD_RESETTING_TEMPLATE == $templateId || self::FOS_USER_REGISTRATION_TEMPLATE == $templateId) { |
||
| 213 | $campaignParams = array(); |
||
| 214 | 8 | } |
|
| 215 | |||
| 216 | return $campaignParams; |
||
| 217 | } |
||
| 218 | |||
| 219 | /** |
||
| 220 | * Override this function if you want to add extra headers to the messages sent. |
||
| 221 | * (non-PHPdoc). |
||
| 222 | * |
||
| 223 | 6 | * @see Azine\EmailBundle\Services.TemplateProviderInterface::addCustomHeaders() |
|
| 224 | */ |
||
| 225 | public function addCustomHeaders($template, \Swift_Message $message, array $params) |
||
| 226 | { |
||
| 227 | 6 | $headerSet = $message->getHeaders(); |
|
| 228 | //$headerSet->addTextHeader($name, $vale); |
||
| 229 | |||
| 230 | if (array_key_exists($this->getWebViewTokenId(), $params)) { |
||
| 231 | $headerSet->addTextHeader('x-azine-webview-token', $params[$this->getWebViewTokenId()]); |
||
| 232 | } |
||
| 233 | |||
| 234 | 8 | if (array_key_exists(AzineEmailExtension::TRACKING_PARAM_CAMPAIGN_NAME, $params)) { |
|
| 235 | $headerSet->addTextHeader('x-utm_campaign', $params[AzineEmailExtension::TRACKING_PARAM_CAMPAIGN_NAME]); |
||
| 236 | 8 | } |
|
| 237 | 5 | ||
| 238 | if (array_key_exists(AzineEmailExtension::TRACKING_PARAM_CAMPAIGN_SOURCE, $params)) { |
||
| 239 | $headerSet->addTextHeader('x-utm_source', $params[AzineEmailExtension::TRACKING_PARAM_CAMPAIGN_SOURCE]); |
||
| 240 | 4 | } |
|
| 241 | } |
||
| 242 | |||
| 243 | /** |
||
| 244 | * (non-PHPdoc). |
||
| 245 | * |
||
| 246 | * @see Azine\EmailBundle\Services.TemplateProviderInterface::saveWebViewFor() |
||
| 247 | */ |
||
| 248 | 8 | public function saveWebViewFor($template) |
|
| 249 | { |
||
| 250 | 8 | if (false !== array_search($template, $this->getTemplatesToStoreForWebView())) { |
|
| 251 | 8 | return true; |
|
| 252 | } |
||
| 253 | 8 | ||
| 254 | return false; |
||
| 255 | } |
||
| 256 | |||
| 257 | /** |
||
| 258 | * Override this function to define which emails you want to make the web-view available and for which not. |
||
| 259 | * |
||
| 260 | * @return array of string => the template id in standard-notation, without the ending ( .txt.twig) => "AcmeFooBundle:bar:default" |
||
| 261 | */ |
||
| 262 | 8 | protected function getTemplatesToStoreForWebView() |
|
| 263 | { |
||
| 264 | 8 | $include = array(); |
|
| 265 | $include[] = self::NEWSLETTER_TEMPLATE; |
||
| 266 | |||
| 267 | return $include; |
||
| 268 | } |
||
| 269 | |||
| 270 | /** |
||
| 271 | * Only override this method if you want to change the ID used in the twig-template for the web-view-link from 'azineEmailWebViewToken' to something else. |
||
| 272 | * (non-PHPdoc). |
||
| 273 | * |
||
| 274 | * @see Azine\EmailBundle\Services.TemplateProviderInterface::getWebViewTokenId() |
||
| 275 | */ |
||
| 276 | public function getWebViewTokenId() |
||
| 277 | { |
||
| 278 | return self::EMAIL_WEB_VIEW_TOKEN; |
||
| 279 | } |
||
| 280 | |||
| 281 | ////////////////////////////////////////////////////////////////////////// |
||
| 282 | /* You probably don't need to change or override any of the stuff below */ |
||
| 283 | ////////////////////////////////////////////////////////////////////////// |
||
| 284 | |||
| 285 | const CONTENT_ITEMS = 'contentItems'; |
||
| 286 | const EMAIL_WEB_VIEW_TOKEN = 'azineEmailWebViewToken'; |
||
| 287 | |||
| 288 | /** |
||
| 289 | * Full filesystem-path to the directory where you store your email-template images. |
||
| 290 | * |
||
| 291 | * @var string |
||
| 292 | */ |
||
| 293 | private $templateImageDir; |
||
| 294 | |||
| 295 | /** |
||
| 296 | * List of directories from which images are allowed to be embeded into emails. |
||
| 297 | * |
||
| 298 | * @var array of string |
||
| 299 | */ |
||
| 300 | private $allowedImageFolders = array(); |
||
| 301 | |||
| 302 | /** |
||
| 303 | * @var UrlGeneratorInterface |
||
| 304 | */ |
||
| 305 | private $router; |
||
| 306 | |||
| 307 | /** |
||
| 308 | * @var TranslatorInterface |
||
| 309 | */ |
||
| 310 | private $translator; |
||
| 311 | |||
| 312 | /** |
||
| 313 | * Array to store all the arrays for the variables/parameters for all the different templates. |
||
| 314 | * |
||
| 315 | * @var array of array |
||
| 316 | */ |
||
| 317 | protected $paramArrays = array(); |
||
| 318 | |||
| 319 | /** |
||
| 320 | * @var string |
||
| 321 | */ |
||
| 322 | protected $tracking_params_campaign_source; |
||
| 323 | |||
| 324 | /** |
||
| 325 | * @var string |
||
| 326 | */ |
||
| 327 | protected $tracking_params_campaign_medium; |
||
| 328 | |||
| 329 | /** |
||
| 330 | * @var string |
||
| 331 | */ |
||
| 332 | protected $tracking_params_campaign_content; |
||
| 333 | |||
| 334 | /** |
||
| 335 | * @var string |
||
| 336 | */ |
||
| 337 | 16 | protected $tracking_params_campaign_name; |
|
| 338 | |||
| 339 | 16 | /** |
|
| 340 | 16 | * @var string |
|
| 341 | 16 | */ |
|
| 342 | 16 | protected $tracking_params_campaign_term; |
|
| 343 | 16 | ||
| 344 | /** |
||
| 345 | * Array to store all the arrays for the code snippets for all the different temlpates. |
||
| 346 | 16 | * |
|
| 347 | 16 | * @var unknown_type |
|
|
0 ignored issues
–
show
|
|||
| 348 | 16 | */ |
|
| 349 | 16 | protected $snippetArrays = array(); |
|
| 350 | |||
| 351 | public function __construct(UrlGeneratorInterface $router, TranslatorInterface $translator, array $parameters) |
||
| 352 | 16 | { |
|
| 353 | 16 | $this->router = $router; |
|
| 354 | 16 | $this->translator = $translator; |
|
| 355 | 16 | $templateImageDir = realpath($parameters[AzineEmailExtension::TEMPLATE_IMAGE_DIR]); |
|
| 356 | 16 | if (false !== $this->templateImageDir) { |
|
| 357 | 16 | $this->templateImageDir = $templateImageDir.'/'; |
|
| 358 | 16 | } |
|
| 359 | |||
| 360 | foreach ($parameters[AzineEmailExtension::ALLOWED_IMAGES_FOLDERS] as $nextFolder) { |
||
| 361 | $imageFolder = realpath($nextFolder); |
||
| 362 | if (false !== $imageFolder) { |
||
| 363 | $this->allowedImageFolders[md5($imageFolder)] = $imageFolder.'/'; |
||
| 364 | } |
||
| 365 | 11 | } |
|
| 366 | $this->allowedImageFolders[md5($this->templateImageDir)] = $this->templateImageDir; |
||
| 367 | 11 | $this->tracking_params_campaign_content = $parameters[AzineEmailExtension::TRACKING_PARAM_CAMPAIGN_CONTENT]; |
|
| 368 | $this->tracking_params_campaign_medium = $parameters[AzineEmailExtension::TRACKING_PARAM_CAMPAIGN_MEDIUM]; |
||
| 369 | $this->tracking_params_campaign_name = $parameters[AzineEmailExtension::TRACKING_PARAM_CAMPAIGN_NAME]; |
||
| 370 | $this->tracking_params_campaign_source = $parameters[AzineEmailExtension::TRACKING_PARAM_CAMPAIGN_SOURCE]; |
||
| 371 | $this->tracking_params_campaign_term = $parameters[AzineEmailExtension::TRACKING_PARAM_CAMPAIGN_TERM]; |
||
| 372 | } |
||
| 373 | |||
| 374 | /** |
||
| 375 | 11 | * (non-PHPdoc). |
|
| 376 | * |
||
| 377 | 11 | * @see Azine\EmailBundle\Services.TemplateProviderInterface::getTemplateImageDir() |
|
| 378 | 11 | */ |
|
| 379 | public function getTemplateImageDir() |
||
| 380 | { |
||
| 381 | return $this->templateImageDir; |
||
| 382 | 11 | } |
|
| 383 | |||
| 384 | /** |
||
| 385 | 11 | * (non-PHPdoc). |
|
| 386 | 6 | * |
|
| 387 | * @see Azine\EmailBundle\Services.TemplateProviderInterface::addTemplateVariablesFor() |
||
| 388 | 6 | */ |
|
| 389 | 6 | public function addTemplateVariablesFor($template, array $contentVariables) |
|
| 390 | { |
||
| 391 | if (!array_key_exists($template, $this->paramArrays)) { |
||
| 392 | 6 | $this->paramArrays[$template] = $this->getParamArrayFor($template); |
|
| 393 | } |
||
| 394 | |||
| 395 | 6 | // add vars for main template |
|
| 396 | $contentVariables = array_merge($this->paramArrays[$template], $contentVariables); |
||
| 397 | |||
| 398 | 6 | // add the template-variables to the contentItem-params-arrays |
|
| 399 | if (array_key_exists(self::CONTENT_ITEMS, $contentVariables)) { |
||
| 400 | foreach ($contentVariables[self::CONTENT_ITEMS] as $key => $contentItem) { |
||
| 401 | // get the key (=> template) |
||
| 402 | 11 | reset($contentItem); |
|
| 403 | $itemTemplate = key($contentItem); |
||
| 404 | |||
| 405 | // get the params |
||
| 406 | $itemParams = $contentItem[$itemTemplate]; |
||
| 407 | |||
| 408 | // add params for this template |
||
| 409 | $contentItem[$itemTemplate] = $this->addTemplateVariablesFor($itemTemplate, $itemParams); |
||
| 410 | 11 | ||
| 411 | // store back into the main array |
||
| 412 | 11 | $contentVariables[self::CONTENT_ITEMS][$key] = $contentItem; |
|
| 413 | 11 | } |
|
| 414 | } |
||
| 415 | 11 | ||
| 416 | 11 | return $contentVariables; |
|
| 417 | } |
||
| 418 | |||
| 419 | /** |
||
| 420 | 9 | * (non-PHPdoc). |
|
| 421 | * |
||
| 422 | * @see Azine\EmailBundle\Services.TemplateProviderInterface::addTemplateSnippetsWithImagesFor() |
||
| 423 | 9 | */ |
|
| 424 | 4 | public function addTemplateSnippetsWithImagesFor($template, array $vars, $emailLocale, $forWebView = false) |
|
| 425 | { |
||
| 426 | 4 | $channel = $forWebView ? 'webView' : 'email'; |
|
| 427 | 4 | $templateKey = $channel.$template.$emailLocale; |
|
| 428 | |||
| 429 | if (!array_key_exists($templateKey, $this->snippetArrays)) { |
||
| 430 | 4 | $this->snippetArrays[$templateKey] = $this->getSnippetArrayFor($template, $vars, $emailLocale); |
|
| 431 | } |
||
| 432 | |||
| 433 | 4 | // add vars for main template |
|
| 434 | $vars = array_merge($this->snippetArrays[$templateKey], $vars); |
||
| 435 | |||
| 436 | 4 | // add the template-code-snippets to the contentItem-params-arrays |
|
| 437 | if (array_key_exists(self::CONTENT_ITEMS, $vars)) { |
||
| 438 | foreach ($vars[self::CONTENT_ITEMS] as $key => $contentItem) { |
||
| 439 | // get the key (=> template) |
||
| 440 | 9 | reset($contentItem); |
|
| 441 | $itemTemplate = key($contentItem); |
||
| 442 | |||
| 443 | // get the params |
||
| 444 | $itemParams = $contentItem[$itemTemplate]; |
||
| 445 | |||
| 446 | 3 | // add params for this template |
|
| 447 | $contentItem[$itemTemplate] = $this->addTemplateSnippetsWithImagesFor($itemTemplate, $itemParams, $emailLocale, $forWebView); |
||
| 448 | 3 | ||
| 449 | // store back into the main array |
||
| 450 | $vars[self::CONTENT_ITEMS][$key] = $contentItem; |
||
| 451 | } |
||
| 452 | } |
||
| 453 | |||
| 454 | return $vars; |
||
| 455 | } |
||
| 456 | |||
| 457 | /** |
||
| 458 | * @return UrlGeneratorInterface |
||
| 459 | */ |
||
| 460 | 10 | protected function getRouter() |
|
| 461 | { |
||
| 462 | 10 | return $this->router; |
|
| 463 | 1 | } |
|
| 464 | |||
| 465 | /** |
||
| 466 | 9 | * Only use the translator here when you already know in which language the user should get the email. |
|
| 467 | * |
||
| 468 | * @param string $emailLocale |
||
| 469 | * |
||
| 470 | * @throws \Exception |
||
| 471 | * |
||
| 472 | * @return Translator |
||
| 473 | */ |
||
| 474 | protected function getTranslator($emailLocale) |
||
| 475 | { |
||
| 476 | if (null === $emailLocale) { |
||
| 477 | 3 | throw new \Exception('Only use the translator here when you already know in which language the user should get the email.'); |
|
| 478 | } |
||
| 479 | 3 | ||
| 480 | 3 | return $this->translator; |
|
| 481 | } |
||
| 482 | 3 | ||
| 483 | 3 | /** |
|
| 484 | * Recursively replace all absolute image-file-paths with relative web-paths. |
||
| 485 | 3 | * |
|
| 486 | 3 | * @param array $emailVars |
|
| 487 | 3 | * @param string $locale |
|
| 488 | * |
||
| 489 | 3 | * @return array |
|
| 490 | 3 | */ |
|
| 491 | public function makeImagePathsWebRelative(array $emailVars, $locale) |
||
| 492 | { |
||
| 493 | foreach ($emailVars as $key => $value) { |
||
| 494 | 3 | if (is_string($value) && is_file($value)) { |
|
| 495 | // check if the file is in an allowed_images_folder |
||
| 496 | $folderKey = $this->isFileAllowed($value); |
||
| 497 | if (false !== $folderKey) { |
||
| 498 | // replace the fs-path with the web-path |
||
| 499 | $fsPathToReplace = $this->getFolderFrom($folderKey); |
||
| 500 | $filename = substr($value, strlen($fsPathToReplace)); |
||
| 501 | $newValue = $this->getRouter()->generate('azine_email_serve_template_image', array('folderKey' => $folderKey, 'filename' => urlencode($filename), '_locale' => $locale)); |
||
| 502 | 9 | $emailVars[$key] = $newValue; |
|
| 503 | } |
||
| 504 | 9 | } elseif (is_array($value)) { |
|
| 505 | 9 | $emailVars[$key] = $this->makeImagePathsWebRelative($value, $locale); |
|
| 506 | 9 | } |
|
| 507 | 9 | } |
|
| 508 | |||
| 509 | return $emailVars; |
||
| 510 | } |
||
| 511 | 2 | ||
| 512 | /** |
||
| 513 | * (non-PHPdoc). |
||
| 514 | * |
||
| 515 | * @see Azine\EmailBundle\Services.TemplateProviderInterface::isFileAllowed() |
||
| 516 | */ |
||
| 517 | public function isFileAllowed($filePath) |
||
| 518 | { |
||
| 519 | 1 | $filePath = realpath($filePath); |
|
| 520 | foreach ($this->allowedImageFolders as $key => $nextFolder) { |
||
| 521 | 1 | if (0 === strpos($filePath, $nextFolder)) { |
|
| 522 | 1 | return $key; |
|
| 523 | } |
||
| 524 | } |
||
| 525 | 1 | ||
| 526 | return false; |
||
| 527 | } |
||
| 528 | |||
| 529 | /** |
||
| 530 | * (non-PHPdoc). |
||
| 531 | * |
||
| 532 | * @see Azine\EmailBundle\Services.TemplateProviderInterface::getFolderFrom() |
||
| 533 | */ |
||
| 534 | public function getFolderFrom($key) |
||
| 535 | { |
||
| 536 | if (array_key_exists($key, $this->allowedImageFolders)) { |
||
| 537 | return $this->allowedImageFolders[$key]; |
||
| 538 | } |
||
| 539 | |||
| 540 | return false; |
||
| 541 | } |
||
| 542 | } |
||
| 543 |
The issue could also be caused by a filter entry in the build configuration. If the path has been excluded in your configuration, e.g.
excluded_paths: ["lib/*"], you can move it to the dependency path list as follows:For further information see https://scrutinizer-ci.com/docs/tools/php/php-scrutinizer/#list-dependency-paths