1
|
|
|
<?php |
2
|
|
|
|
3
|
|
|
/** |
4
|
|
|
* ____ _ _ _ _ |
5
|
|
|
* | _ \| |__ | |_ ___ _ __ ___ __ _(_) | |
6
|
|
|
* | |_) | '_ \| __/ _ \ '_ ` _ \ / _` | | | |
7
|
|
|
* | __/| | | | || __/ | | | | | (_| | | | |
8
|
|
|
* |_| |_| |_|\__\___|_| |_| |_|\__,_|_|_| |
9
|
|
|
* |
10
|
|
|
* This file is part of Kristuff\Phtemail. |
11
|
|
|
* |
12
|
|
|
* (c) Kristuff <[email protected]> |
13
|
|
|
* |
14
|
|
|
* For the full copyright and license information, please view the LICENSE |
15
|
|
|
* file that was distributed with this source code. |
16
|
|
|
* |
17
|
|
|
* @version 0.2.0 |
18
|
|
|
* @copyright 2017-2020 Kristuff |
19
|
|
|
*/ |
20
|
|
|
|
21
|
|
|
namespace Kristuff\Phtemail\Core; |
22
|
|
|
|
23
|
|
|
/** |
24
|
|
|
* Extends the HtmlBuilder with html head helper functions |
25
|
|
|
*/ |
26
|
|
|
abstract class HtmlHeadBuilder extends HtmlBuilder |
27
|
|
|
{ |
28
|
|
|
/** |
29
|
|
|
* Gets html meta tags as string |
30
|
|
|
* |
31
|
|
|
* @access protected |
32
|
|
|
* @return string |
33
|
|
|
*/ |
34
|
|
|
protected function getMeta() |
35
|
|
|
{ |
36
|
|
|
$html = ' <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />'.PHP_EOL; |
37
|
|
|
$html .= ' <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">'.PHP_EOL; |
38
|
|
|
$html .= ' <meta name="viewport" content="width=device-width, initial-scale=1.0">'.PHP_EOL; |
39
|
|
|
$html .= $this->getHtmlComment('Disable auto telephone linking in iOS', ' '); |
40
|
|
|
$html .= ' <meta name="format-detection" content="telephone=no" />'.PHP_EOL; |
41
|
|
|
return $html; |
42
|
|
|
} |
43
|
|
|
|
44
|
|
|
/** |
45
|
|
|
* Gets html title tag as string |
46
|
|
|
* |
47
|
|
|
* @access protected |
48
|
|
|
* @param string $title The email meta title |
49
|
|
|
* |
50
|
|
|
* @return string |
51
|
|
|
*/ |
52
|
|
|
protected function getTitle(string $title) |
53
|
|
|
{ |
54
|
|
|
return ' <title>' . $title . '</title>' . PHP_EOL; |
55
|
|
|
} |
56
|
|
|
|
57
|
|
|
/** |
58
|
|
|
* Gets the html styles as string |
59
|
|
|
* |
60
|
|
|
* @access protected |
61
|
|
|
* |
62
|
|
|
* @return string |
63
|
|
|
*/ |
64
|
|
|
protected function getStyles() |
65
|
|
|
{ |
66
|
|
|
// start style tag |
67
|
|
|
$html = ' <style type="text/css">'.PHP_EOL; |
68
|
|
|
$html .= PHP_EOL; |
69
|
|
|
|
70
|
|
|
// -- reset styles ---------------------------------------- |
71
|
|
|
$html .= $this->getCssComment('--- RESET STYLES ---', ' '); |
72
|
|
|
$html .= ' html { background-color:'. $this->backsideBackgroundColor . '; margin:0; padding:0; }'.PHP_EOL; |
73
|
|
|
$html .= ' body, #bodyTable, #bodyCell, #bodyCell{height:100% !important; margin:0; padding:0;'; |
74
|
|
|
$html .= ' width:100% !important; font-family:'. $this->emailBodyFont .';}'.PHP_EOL; |
75
|
|
|
$html .= ' table{border-collapse:collapse;}'.PHP_EOL; |
76
|
|
|
$html .= ' table[id=bodyTable] {width:100%!important;margin:auto;max-width:500px!important; color:'. $this->emailBodyColor . ';font-weight:normal;}'.PHP_EOL; |
77
|
|
|
$html .= ' img, a img{border:0; outline:none; text-decoration:none;height:auto; line-height:100%;}'.PHP_EOL; |
78
|
|
|
$html .= ' a {text-decoration:none !important;border-bottom: 1px solid;}'.PHP_EOL; |
79
|
|
|
|
80
|
|
|
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! |
81
|
|
|
// todo custom COLOR !!!!!!!!!!!!!! font size ? line height ? margin ? see |
82
|
|
|
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! |
83
|
|
|
$html .= ' h1, h2, h3, h4, h5, h6 {color:#5F5F5F; font-weight:normal; font-family:'. $this->emailBodyFont .';'.PHP_EOL; |
84
|
|
|
$html .= ' font-size:20px; line-height:125%; text-align:Left; letter-spacing:normal;'.PHP_EOL; |
85
|
|
|
$html .= ' margin-top:0;margin-right:0;margin-bottom:0;margin-left:0;'.PHP_EOL; |
86
|
|
|
$html .= ' padding-top:0;padding-bottom:10px;padding-left:0;padding-right:0;}'.PHP_EOL; |
87
|
|
|
// custom |
88
|
|
|
$html .= ' p {margin-top:0;margin-right:0;margin-bottom:0;margin-left:0;'; |
89
|
|
|
$html .= 'padding-top:0;padding-bottom:0;padding-left:0;padding-right:0;}'.PHP_EOL; |
90
|
|
|
$html .= ' p + p {padding-top:10px;}'.PHP_EOL; |
91
|
|
|
$html .= PHP_EOL; |
92
|
|
|
|
93
|
|
|
// -- client specific styles ------------------------------------------- |
94
|
|
|
$html .= $this->getCssComment('--- CLIENT-SPECIFIC STYLES ---', ' '); |
95
|
|
|
$html .= ' .ReadMsgBody{width:100%;} .ExternalClass{width:100%;}'. $this->getCssComment(' Force Hotmail/Outlook.com to display emails at full width.'); |
96
|
|
|
$html .= ' .ExternalClass, .ExternalClass p, .ExternalClass span, .ExternalClass font, .ExternalClass td, .ExternalClass div{line-height:100%;}' . $this->getCssComment(' Force Hotmail/Outlook.com to display line heights normally.'); |
97
|
|
|
$html .= ' table, td{mso-table-lspace:0pt; mso-table-rspace:0pt;}' . $this->getCssComment(' Remove spacing between tables in Outlook 2007 and up.'); |
98
|
|
|
$html .= ' #outlook a{padding:0;}'. $this->getCssComment(' Force Outlook 2007 and up to provide a "view in browser" message.'); |
99
|
|
|
$html .= ' img{-ms-interpolation-mode: bicubic;display:block;outline:none; text-decoration:none;}'. $this->getCssComment(' Force IE to smoothly render resized images.'); |
100
|
|
|
$html .= ' body, table, td, p, a, li, blockquote{-ms-text-size-adjust:100%; -webkit-text-size-adjust:100%; font-weight:normal!important;}'. $this->getCssComment(' Prevent Windows- and Webkit-based mobile platforms from changing declared text sizes. '); |
101
|
|
|
$html .= ' .ExternalClass td[class="ecxflexibleContainerBox"] h3 {padding-top: 10px !important;} '. $this->getCssComment(' Force hotmail to push 2-grid sub headers down'); |
102
|
|
|
$html .= PHP_EOL; |
103
|
|
|
|
104
|
|
|
// -- our styles -------------------------------------------------------- |
105
|
|
|
$html .= $this->getCssComment('--- FRAMEWORK HACKS & OVERRIDES ---', ' '); |
106
|
|
|
|
107
|
|
|
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! |
108
|
|
|
// todo custom font size ? line height ? colors .. |
109
|
|
|
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!#3497D9!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! |
110
|
|
|
$html .= ' h1{display:block;font-size:32px;font-style:normal;font-weight:200!important;line-height:100%;}'.PHP_EOL; |
111
|
|
|
$html .= ' h2{display:block;font-size:27px;font-style:normal;font-weight:200!important;line-height:120%;}'.PHP_EOL; |
112
|
|
|
$html .= ' h3{display:block;font-size:24px;font-style:normal;font-weight:200!important;line-height:110%;}'.PHP_EOL; |
113
|
|
|
$html .= ' h4{display:block;font-size:22px;font-style:normal;font-weight:200!important;line-height:100%;}'.PHP_EOL; |
114
|
|
|
$html .= ' h5{display:block;font-size:20px;font-style:normal;font-weight:200!important;line-height:110%;}'.PHP_EOL; |
115
|
|
|
$html .= ' h6{display:block;font-size:18px;font-style:normal;font-weight:200!important;line-height:110%;}'.PHP_EOL; |
116
|
|
|
|
117
|
|
|
$html .= ' .flexibleImage{height:auto;}'.PHP_EOL; |
118
|
|
|
$html .= ' .linkRemoveBorder{border-bottom:0 !important;}'.PHP_EOL; |
119
|
|
|
$html .= ' table[class=flexibleContainerCellDivider] {padding-bottom:0 !important;padding-top:0 !important;}'.PHP_EOL; |
120
|
|
|
|
121
|
|
|
$html .= ' body, #bodyTable{background-color:'. $this->backsideBackgroundColor . ';}'.PHP_EOL; |
122
|
|
|
$html .= ' #emailHeader{background-color:' . $this->backsideBackgroundColor . ';}'.PHP_EOL; |
123
|
|
|
$html .= ' #emailBody{background-color:' . $this->emailBodyBackgroundColor . ';}'.PHP_EOL; |
124
|
|
|
$html .= ' #emailFooter{background-color:' . $this->backsideBackgroundColor . ';}'.PHP_EOL; |
125
|
|
|
$html .= ' .emailButton{background-color:#3497D9; border-collapse:separate;}'.PHP_EOL; |
126
|
|
|
$html .= ' .buttonContent{color:#FFFFFF; font-family:Helvetica; font-size:18px; font-weight:200; line-height:100%; padding:15px; text-align:center;}'.PHP_EOL; |
127
|
|
|
$html .= ' .buttonContent a{color:#FFFFFF; display:block; text-decoration:none!important; border:0!important;}'.PHP_EOL; |
128
|
|
|
$html .= PHP_EOL; |
129
|
|
|
|
130
|
|
|
|
131
|
|
|
// ------------------------------------------------------------- |
132
|
|
|
// -- mobiles styles ------------------------------------------- |
133
|
|
|
// ------------------------------------------------------------- |
134
|
|
|
$html .= $this->getCssComment('--- MOBILE STYLES ---', ' '); |
135
|
|
|
$html .= ' @media only screen and (max-width: '. strval($this->emailBodyWidth - 20) . 'px) {'.PHP_EOL; |
136
|
|
|
$html .= PHP_EOL; |
137
|
|
|
|
138
|
|
|
// -- client specific styles ------------------------------------------- |
139
|
|
|
$html .= $this->getCssComment('--- CLIENT-SPECIFIC STYLES ---', ' '); |
140
|
|
|
$html .= ' body{width:100% !important; min-width:100% !important;}'. $this->getCssComment(' Force iOS Mail to render the email at full width.'); |
141
|
|
|
$html .= PHP_EOL; |
142
|
|
|
|
143
|
|
|
//todo |
144
|
|
|
$html .= $this->getCssComment('--- FRAMEWORK STYLES ---', ' '); |
145
|
|
|
$html .= ' table[id="emailHeader"],'.PHP_EOL; |
146
|
|
|
$html .= ' table[id="emailBody"],'.PHP_EOL; |
147
|
|
|
$html .= ' table[id="emailFooter"],'.PHP_EOL; |
148
|
|
|
$html .= ' table[class="flexibleContainer"],'.PHP_EOL; |
149
|
|
|
$html .= ' td[class="flexibleContainerCell"] {width:100% !important;}'.PHP_EOL; |
150
|
|
|
$html .= ' td[class="flexibleContainerBox"], '.PHP_EOL; |
151
|
|
|
$html .= ' td[class="flexibleContainerBox"] table {display: block;width: 100%;text-align: left;}'.PHP_EOL; |
152
|
|
|
|
153
|
|
|
//todo |
154
|
|
|
|
155
|
|
|
$html .= $this->getCssComment('The following style rule makes any image classed with \'flexibleImage\'fluid' . PHP_EOL |
156
|
|
|
. ' when the query activates. Make sure you add an inline max-width to those '. PHP_EOL |
157
|
|
|
. ' to prevent them from blowing out.', ' '); |
158
|
|
|
|
159
|
|
|
$html .= ' td[class="imageContent"] img {height:auto !important; width:100% !important; max-width:100% !important; }'. PHP_EOL; |
160
|
|
|
$html .= ' img[class="flexibleImage"]{height:auto !important; width:100% !important;max-width:100% !important;}'. PHP_EOL; |
161
|
|
|
$html .= ' img[class="flexibleImageSmall"]{height:auto !important; width:auto !important;}'. PHP_EOL; |
162
|
|
|
|
163
|
|
|
$html .= $this->getCssComment('Create top space for every second element in a block', ' '); |
164
|
|
|
$html .= ' table[class="flexibleContainerBoxNext"]{padding-top: 10px !important;}'. PHP_EOL; |
165
|
|
|
|
166
|
|
|
$html .= $this->getCssComment('Make buttons in the email span the full width of their container, allowing' |
167
|
|
|
. 'for left- or right-handed ease of use.', ' '); |
168
|
|
|
|
169
|
|
|
$html .= ' table[class="emailButton"]{width:100% !important;}'. PHP_EOL; |
170
|
|
|
$html .= ' td[class="buttonContent"]{padding:0 !important;}'. PHP_EOL; |
171
|
|
|
$html .= ' td[class="buttonContent"] a{padding:15px !important;}'. PHP_EOL; |
172
|
|
|
$html .= ' }'.PHP_EOL; |
173
|
|
|
|
174
|
|
|
//todo more ... |
175
|
|
|
|
176
|
|
|
// close style tag |
177
|
|
|
$html .= ' </style>'.PHP_EOL; |
178
|
|
|
|
179
|
|
|
// ------- conditional formatting for outlook -------------------- |
180
|
|
|
$html .= $this->getHtmlComment('Outlook Conditional CSS. ' . PHP_EOL |
181
|
|
|
. ' These two style blocks target Outlook 2007 & 2010 specifically, forcing' . PHP_EOL |
182
|
|
|
. ' columns into a single vertical stack as on mobile clients. This is' . PHP_EOL |
183
|
|
|
. ' primarily done to avoid the \'page break bug\' and is optional.' . PHP_EOL |
184
|
|
|
. ' More information here: https://templates.mailchimp.com/development/css/outlook-conditional-css' . PHP_EOL |
185
|
|
|
. ' ',' '); |
186
|
|
|
|
187
|
|
|
$html .= ' <!--[if mso 12]>'.PHP_EOL; |
188
|
|
|
$html .= ' <style type="text/css">'.PHP_EOL; |
189
|
|
|
$html .= ' .flexibleContainer{display:block !important; width:100% !important;}'.PHP_EOL; |
190
|
|
|
$html .= ' </style>'.PHP_EOL; |
191
|
|
|
$html .= ' <![endif]-->'.PHP_EOL; |
192
|
|
|
$html .= ' <!--[if mso 14]>'.PHP_EOL; |
193
|
|
|
$html .= ' <style type="text/css">'.PHP_EOL; |
194
|
|
|
$html .= ' .flexibleContainer{display:block !important; width:100% !important;}'.PHP_EOL; |
195
|
|
|
$html .= ' </style>'.PHP_EOL; |
196
|
|
|
$html .= ' <![endif]-->'.PHP_EOL; |
197
|
|
|
|
198
|
|
|
// done |
199
|
|
|
return $html; |
200
|
|
|
} |
201
|
|
|
|
202
|
|
|
/** |
203
|
|
|
* Get a formatted CSS comment for given string if $renderCssComments is true, |
204
|
|
|
* otherwise an empty string or just a break line. |
205
|
|
|
* |
206
|
|
|
* @access public |
207
|
|
|
* @param string $text The comment text. |
208
|
|
|
* @param string $indent The indentation before comment. Default is an empty string. |
209
|
|
|
* @param bool $breakLine True to add a break line (ie: PHP_EOL) after comment. Default is true. |
210
|
|
|
* |
211
|
|
|
* @return string |
212
|
|
|
*/ |
213
|
|
|
protected function getCssComment(string $text, string $indent = '', bool $breakLine = true) |
214
|
|
|
{ |
215
|
|
|
return $this->renderCssComments ? $indent . '/* ' . $text . ' */' . ($breakLine ? PHP_EOL : '') : ($breakLine ? PHP_EOL : ''); |
216
|
|
|
} |
217
|
|
|
} |