Completed
Pull Request — 5.0 (#1)
by Huberty
02:41
created

SwiftTwigMailTemplate::setFromName()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 4
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 4
rs 10
c 0
b 0
f 0
cc 1
eloc 2
nc 1
nop 1
1
<?php
2
3
namespace TheCodingMachine\Mail\Template;
4
5
6
use TheCodingMachine\Mail\SwiftMailTemplate;
7
8
class SwiftTwigMailTemplate implements SwiftMailTemplate
9
{
10
    /**
11
     * @var \Twig_Environment
12
     */
13
    protected $twigEnvironment;
14
15
    /**
16
     * @var string
17
     */
18
    protected $twigPath;
19
20
    /**
21
     * @var string|array
22
     */
23
    protected $fromAddresses;
24
25
    /**
26
     * @var string
27
     */
28
    protected $fromName = null;
29
30
    /**
31
     * @var string|array
32
     */
33
    protected $toAddresses;
34
35
    /**
36
     * @var string
37
     */
38
    protected $toName = null;
39
40
    /**
41
     * @var string|array
42
     */
43
    protected $bccAddresses;
44
45
    /**
46
     * @var string
47
     */
48
    protected $bccName = null;
49
50
    /**
51
     * @var string|array
52
     */
53
    protected $ccAddresses;
54
55
    /**
56
     * @var string
57
     */
58
    protected $ccName = null;
59
60
    /**
61
     * @var string|array
62
     */
63
    protected $replyToAddresses;
64
65
    /**
66
     * @var string
67
     */
68
    protected $replyToName = null;
69
70
    /**
71
     * @var int
72
     */
73
    protected $maxLineLength = 1000;
74
75
    /**
76
     * @var int
77
     */
78
    protected $priority;
79
80
    /**
81
     * @var string
82
     */
83
    protected $readReceiptTo;
84
85
    /**
86
     * @var string
87
     */
88
    protected $returnPath;
89
90
    /**
91
     * SwiftTwigMailGenerator constructor.
92
     *
93
     * @param \Twig_Environment $twig_Environment
94
     * @param string            $twigPath
95
     */
96
    public function __construct(\Twig_Environment $twig_Environment, string $twigPath)
97
    {
98
        $this->twigEnvironment = $twig_Environment;
99
        $this->twigPath = $twigPath;
100
    }
101
102
    /**
103
     * @param array $data
104
     *
105
     * @return \Swift_Message
106
     */
107
    public function renderMail(array $data = []) :\Swift_Message
108
    {
109
        $mail = new \Swift_Message();
110
111
        $twigEnvironment = clone $this->twigEnvironment;
112
        $function = new \Twig_SimpleFunction('embedImage', function ($imgPath) use ($mail) {
113
            return $mail->embed(\Swift_Image::fromPath($imgPath));
114
        });
115
        $twigEnvironment->addFunction($function);
116
117
        $template = $twigEnvironment->loadTemplate($this->twigPath);
118
119
        if (!$template->hasBlock('subject') || !$template->hasBlock('body_html')) {
120
            throw MissingBlockException::missingBlock($template->getBlockNames());
121
        }
122
123
        $subject  = $template->renderBlock('subject', $data);
0 ignored issues
show
Bug introduced by
The method renderBlock() does not exist on Twig_TemplateInterface. Did you maybe mean render()?

This check marks calls to methods that do not seem to exist on an object.

This is most likely the result of a method being renamed without all references to it being renamed likewise.

Loading history...
124
        $bodyHtml = $template->renderBlock('body_html', $data);
0 ignored issues
show
Bug introduced by
The method renderBlock() does not exist on Twig_TemplateInterface. Did you maybe mean render()?

This check marks calls to methods that do not seem to exist on an object.

This is most likely the result of a method being renamed without all references to it being renamed likewise.

Loading history...
125
        if (!$template->hasBlock('body_text')) {
126
            $bodyText = $this->removeHtml($bodyHtml);
127
        } else {
128
            $bodyText = $template->renderBlock('body_text', $data);
0 ignored issues
show
Bug introduced by
The method renderBlock() does not exist on Twig_TemplateInterface. Did you maybe mean render()?

This check marks calls to methods that do not seem to exist on an object.

This is most likely the result of a method being renamed without all references to it being renamed likewise.

Loading history...
129
130
        }
131
132
        $mail->setSubject($subject);
133
        $mail->setBody($bodyHtml);
134
        $mail->addPart($bodyText);
135
136
137
        switch (true) {
0 ignored issues
show
Bug Best Practice introduced by
It seems like you are loosely comparing $this->maxLineLength of type integer to the boolean true. If you are specifically checking for non-zero, consider using something more explicit like > 0 or !== 0 instead.
Loading history...
Bug Best Practice introduced by
It seems like you are loosely comparing $this->priority of type integer to the boolean true. If you are specifically checking for non-zero, consider using something more explicit like > 0 or !== 0 instead.
Loading history...
Bug Best Practice introduced by
It seems like you are loosely comparing $this->readReceiptTo of type string to the boolean true. If you are specifically checking for a non-empty string, consider using the more explicit !== '' instead.
Loading history...
Bug Best Practice introduced by
It seems like you are loosely comparing $this->returnPath of type string to the boolean true. If you are specifically checking for a non-empty string, consider using the more explicit !== '' instead.
Loading history...
138
            case $this->fromAddresses:
0 ignored issues
show
Coding Style introduced by
There must be a comment when fall-through is intentional in a non-empty case body
Loading history...
139
                $mail->setFrom($this->fromAddresses, $this->fromName);
140
                $mail->setSender($this->fromAddresses, $this->fromName);
1 ignored issue
show
Bug introduced by
It seems like $this->fromAddresses can also be of type array; however, Swift_Mime_SimpleMessage::setSender() does only seem to accept string, maybe add an additional type check?

If a method or function can return multiple different values and unless you are sure that you only can receive a single value in this context, we recommend to add an additional type check:

/**
 * @return array|string
 */
function returnsDifferentValues($x) {
    if ($x) {
        return 'foo';
    }

    return array();
}

$x = returnsDifferentValues($y);
if (is_array($x)) {
    // $x is an array.
}

If this a common case that PHP Analyzer should handle natively, please let us know by opening an issue.

Loading history...
141
            case $this->toAddresses:
0 ignored issues
show
Coding Style introduced by
There must be a comment when fall-through is intentional in a non-empty case body
Loading history...
142
                $mail->setTo($this->toAddresses, $this->toName);
143
            case $this->bccAddresses:
0 ignored issues
show
Coding Style introduced by
There must be a comment when fall-through is intentional in a non-empty case body
Loading history...
144
                $mail->setBcc($this->bccAddresses, $this->bccName);
145
            case $this->ccAddresses:
0 ignored issues
show
Coding Style introduced by
There must be a comment when fall-through is intentional in a non-empty case body
Loading history...
146
                $mail->setCc($this->ccAddresses, $this->ccName);
147
            case $this->replyToAddresses:
0 ignored issues
show
Coding Style introduced by
There must be a comment when fall-through is intentional in a non-empty case body
Loading history...
148
                $mail->setReplyTo($this->replyToAddresses, $this->replyToName);
149
            case $this->maxLineLength:
0 ignored issues
show
Coding Style introduced by
There must be a comment when fall-through is intentional in a non-empty case body
Loading history...
150
                $mail->setMaxLineLength($this->maxLineLength);
151
            case $this->priority:
0 ignored issues
show
Coding Style introduced by
There must be a comment when fall-through is intentional in a non-empty case body
Loading history...
152
                $mail->setPriority($this->priority);
153
            case $this->readReceiptTo:
0 ignored issues
show
Coding Style introduced by
There must be a comment when fall-through is intentional in a non-empty case body
Loading history...
154
                $mail->setReadReceiptTo($this->readReceiptTo);
0 ignored issues
show
Documentation introduced by
$this->readReceiptTo is of type string, but the function expects a array.

It seems like the type of the argument is not accepted by the function/method which you are calling.

In some cases, in particular if PHP’s automatic type-juggling kicks in this might be fine. In other cases, however this might be a bug.

We suggest to add an explicit type cast like in the following example:

function acceptsInteger($int) { }

$x = '123'; // string "123"

// Instead of
acceptsInteger($x);

// we recommend to use
acceptsInteger((integer) $x);
Loading history...
155
            case $this->returnPath:
0 ignored issues
show
Coding Style introduced by
There must be a comment when fall-through is intentional in a non-empty case body
Loading history...
156
                $mail->setReturnPath($this->returnPath);
157
            default:
158
                break;
159
        }
160
161
        return $mail;
162
    }
163
164
    /**
165
     * @param array|string $fromAddresses
166
     */
167
    public function setFromAddresses($fromAddresses)
168
    {
169
        $this->fromAddresses = $fromAddresses;
170
    }
171
172
    /**
173
     * @param string $fromName
174
     */
175
    public function setFromName($fromName)
176
    {
177
        $this->fromName = $fromName;
178
    }
179
180
    /**
181
     * @param array|string $toAddresses
182
     */
183
    public function setToAddresses($toAddresses)
184
    {
185
        $this->toAddresses = $toAddresses;
186
    }
187
188
    /**
189
     * @param string $toName
190
     */
191
    public function setToName($toName)
192
    {
193
        $this->toName = $toName;
194
    }
195
196
    /**
197
     * @param array|string $bccAddresses
198
     */
199
    public function setBccAddresses($bccAddresses)
200
    {
201
        $this->bccAddresses = $bccAddresses;
202
    }
203
204
    /**
205
     * @param string $bccName
206
     */
207
    public function setBccName($bccName)
208
    {
209
        $this->bccName = $bccName;
210
    }
211
212
    /**
213
     * @param array|string $ccAddresses
214
     */
215
    public function setCcAddresses($ccAddresses)
216
    {
217
        $this->ccAddresses = $ccAddresses;
218
    }
219
220
    /**
221
     * @param string $ccName
222
     */
223
    public function setCcName($ccName)
224
    {
225
        $this->ccName = $ccName;
226
    }
227
228
    /**
229
     * @param array|string $replyToAddresses
230
     */
231
    public function setReplyToAddresses($replyToAddresses)
232
    {
233
        $this->replyToAddresses = $replyToAddresses;
234
    }
235
236
    /**
237
     * @param string $replyToName
238
     */
239
    public function setReplyToName($replyToName)
240
    {
241
        $this->replyToName = $replyToName;
242
    }
243
244
    /**
245
     * @param int $maxLineLength
246
     */
247
    public function setMaxLineLength($maxLineLength)
248
    {
249
        $this->maxLineLength = $maxLineLength;
250
    }
251
252
    /**
253
     * @param int $priority
254
     */
255
    public function setPriority($priority)
256
    {
257
        $this->priority = $priority;
258
    }
259
260
    /**
261
     * @param string $readReceiptTo
262
     */
263
    public function setReadReceiptTo($readReceiptTo)
264
    {
265
        $this->readReceiptTo = $readReceiptTo;
266
    }
267
268
    /**
269
     * @param string $returnPath
270
     */
271
    public function setReturnPath($returnPath)
272
    {
273
        $this->returnPath = $returnPath;
274
    }
275
276
    /**
277
     * Removes the HTML tags from the text.
278
     *
279
     * @param string $s
280
     * @param string $keep The list of tags to keep
281
     * @param string $expand The list of tags to remove completely, along their content
282
     */
283
    private function removeHtml(string $s , string $keep = '' , string $expand = 'script|style|noframes|select|option') :string
284
    {
285
        /**///prep the string
286
        $s = ' ' . $s;
287
288
        /**///initialize keep tag logic
289
        if(strlen($keep) > 0){
290
            $k = explode('|',$keep);
291 View Code Duplication
            for($i=0;$i<count($k);$i++){
0 ignored issues
show
Performance Best Practice introduced by
It seems like you are calling the size function count() as part of the test condition. You might want to compute the size beforehand, and not on each iteration.

If the size of the collection does not change during the iteration, it is generally a good practice to compute it beforehand, and not on each iteration:

for ($i=0; $i<count($array); $i++) { // calls count() on each iteration
}

// Better
for ($i=0, $c=count($array); $i<$c; $i++) { // calls count() just once
}
Loading history...
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
292
                $s = str_replace('<' . $k[$i],'[{(' . $k[$i],$s);
293
                $s = str_replace('</' . $k[$i],'[{(/' . $k[$i],$s);
294
            }
295
        }
296
        $pos = array();
297
        $len = array();
298
299
        //begin removal
300
        /**///remove comment blocks
301 View Code Duplication
        while(stripos($s,'<!--') > 0){
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
302
            $pos[1] = stripos($s,'<!--');
303
            $pos[2] = stripos($s,'-->', $pos[1]);
304
            $len[1] = $pos[2] - $pos[1] + 3;
305
            $x = substr($s,$pos[1],$len[1]);
306
            $s = str_replace($x,'',$s);
307
        }
308
309
        /**///remove tags with content between them
310
        if(strlen($expand) > 0){
311
            $e = explode('|',$expand);
312
            for($i=0;$i<count($e);$i++){
0 ignored issues
show
Performance Best Practice introduced by
It seems like you are calling the size function count() as part of the test condition. You might want to compute the size beforehand, and not on each iteration.

If the size of the collection does not change during the iteration, it is generally a good practice to compute it beforehand, and not on each iteration:

for ($i=0; $i<count($array); $i++) { // calls count() on each iteration
}

// Better
for ($i=0, $c=count($array); $i<$c; $i++) { // calls count() just once
}
Loading history...
313
                while(stripos($s,'<' . $e[$i]) > 0){
314
                    $len[1] = strlen('<' . $e[$i]);
315
                    $pos[1] = stripos($s,'<' . $e[$i]);
316
                    $pos[2] = stripos($s,$e[$i] . '>', $pos[1] + $len[1]);
317
                    $len[2] = $pos[2] - $pos[1] + $len[1];
318
                    $x = substr($s,$pos[1],$len[2]);
319
                    $s = str_replace($x,'',$s);
320
                }
321
            }
322
        }
323
324
        /**///remove remaining tags
325 View Code Duplication
        while(stripos($s,'<') > 0){
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
326
            $pos[1] = stripos($s,'<');
327
            $pos[2] = stripos($s,'>', $pos[1]);
328
            $len[1] = $pos[2] - $pos[1] + 1;
329
            $x = substr($s,$pos[1],$len[1]);
330
            $s = str_replace($x,'',$s);
331
        }
332
333
        /**///finalize keep tag
334
        if (isset($k)) {
335 View Code Duplication
            for($i=0;$i<count($k);$i++){
0 ignored issues
show
Performance Best Practice introduced by
It seems like you are calling the size function count() as part of the test condition. You might want to compute the size beforehand, and not on each iteration.

If the size of the collection does not change during the iteration, it is generally a good practice to compute it beforehand, and not on each iteration:

for ($i=0; $i<count($array); $i++) { // calls count() on each iteration
}

// Better
for ($i=0, $c=count($array); $i<$c; $i++) { // calls count() just once
}
Loading history...
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
336
                $s = str_replace('[{(' . $k[$i],'<' . $k[$i],$s);
337
                $s = str_replace('[{(/' . $k[$i],'</' . $k[$i],$s);
338
            }
339
        }
340
341
        return trim($s);
342
    }
343
}
344