Skip to content

Commit 88edea0

Browse files
authored
Merge pull request #2 from justcoded/develop
Added attachments support
2 parents c666a2e + 466923a commit 88edea0

10 files changed

Lines changed: 139 additions & 197 deletions

File tree

examples/form.php

Lines changed: 21 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -13,21 +13,27 @@
1313
use JustCoded\FormHandler\DataObjects\MailMessage;
1414

1515
$validation = [
16-
'rules' => [
17-
'required' => [
18-
'fields' => ['name', 'email', 'subject', 'message'],
19-
'message' => '{field} is required'
16+
'fields' => [
17+
'name' => ['required'],
18+
'email' => ['required', 'email'],
19+
'subject' => ['required'],
20+
'message' => [
21+
'required',
22+
['lengthMin', 5]
2023
],
21-
'email' => [
22-
'fields' => ['email'],
23-
'message' => '{field} is not a valid email address'
24+
'cv_file' => [
25+
[
26+
'required',
27+
'message' => 'Please upload {field}',
28+
],
29+
[
30+
'file',
31+
['jpeg', 'jpg', 'png'], // types.
32+
2000000, // size limit 2 MB.
33+
'message' => '{field} should be up to 2MB and allows only file types jpeg, png.',
34+
],
2435
],
25-
'file' => [
26-
'fields' => ['cv_file', 'image_file'],
27-
'allowType' => ['jpeg', 'jpg', 'pdf', 'png'],
28-
'allowSize' => 10000000 // 10 MB
29-
]
30-
], // according to Valitron doc.
36+
], // according to Valitron doc for mapFieldsRules.
3137
'labels' => [
3238
'name' => 'Name',
3339
'email' => 'Email address'
@@ -41,11 +47,12 @@
4147
'password' => 'YOUR PASSWORD',
4248
'protocol' => 'tls',
4349
'port' => 587,
50+
'attachmentsSizeLimit' => 8000000, // around 8MB.
4451
];
4552

4653
$fileManager = new FileManager([
4754
'uploadPath' => __DIR__ . '/attachments',
48-
'uploadUrl' => $_SERVER['HTTP_ORIGIN'] . '/attachments',
55+
'uploadUrl' => 'http://MY-DOMAIN.COM/attachments',
4956
]);
5057

5158
$message = [

src/DataObjects/EmailAddress.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
<?php
2+
23
namespace JustCoded\FormHandler\DataObjects;
34

45
/**

src/DataObjects/EmailAttachment.php

Lines changed: 0 additions & 70 deletions
This file was deleted.

src/DataObjects/MailMessage.php

Lines changed: 18 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@
99
*/
1010
class MailMessage extends DataObject
1111
{
12-
const ATTACHMENTS_SIZE_LIMIT = 8000000;
1312

1413
/**
1514
* Property with From email
@@ -84,17 +83,10 @@ class MailMessage extends DataObject
8483
/**
8584
* List of attachments
8685
*
87-
* @var array
86+
* @var File[]|null
8887
*/
8988
protected $attachments = [];
9089

91-
/**
92-
* List of attachments files
93-
*
94-
* @var array
95-
*/
96-
protected $files = [];
97-
9890
/**
9991
* Message constructor.
10092
*
@@ -163,7 +155,7 @@ public function getBcc()
163155
/**
164156
* Getting email Subject
165157
*
166-
* @return mixed
158+
* @return string
167159
*/
168160
public function getSubject()
169161
{
@@ -177,7 +169,7 @@ public function getSubject()
177169
/**
178170
* Getting email Body Template
179171
*
180-
* @return mixed
172+
* @return string
181173
*/
182174
public function getBodyTemplate()
183175
{
@@ -235,44 +227,30 @@ public function getAltBody()
235227
}
236228

237229
/**
238-
* Setting attachments file
230+
* Getting attachments files
239231
*
240-
* @return bool
232+
* @return File[]|null
241233
*/
242-
public function setFiles()
234+
public function getAttachments()
243235
{
244-
foreach ($this->attachments as $file) {
245-
/**
246-
* File object
247-
*
248-
* @var File $file
249-
*/
250-
if ($file->size < self::ATTACHMENTS_SIZE_LIMIT) {
251-
$this->addFile([$file->uploadPath => $file->name]);
252-
}
253-
}
254-
255-
return true;
236+
return $this->attachments;
256237
}
257238

258239
/**
259-
* Getting attachments file
260-
*
261-
* @return array
240+
* Getting total size of attached files
262241
*/
263-
public function getFiles()
242+
public function getAttachmentsSize()
264243
{
265-
return $this->files;
266-
}
244+
if (empty($this->attachments)) {
245+
return 0;
246+
}
267247

268-
/**
269-
* Add EmailAttachments data to files array
270-
*
271-
* @param array $data File data with ['uploadPath' => name]
272-
*/
273-
protected function addFile(array $data)
274-
{
275-
$this->files[] = new EmailAttachment($data);
248+
$totalSize = 0;
249+
foreach ($this->attachments as $file) {
250+
$totalSize += $file->size;
251+
}
252+
253+
return $totalSize;
276254
}
277255

278256
}

src/FileManager/FileManager.php

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -47,15 +47,10 @@ public function upload(array $fields)
4747

4848
$name = preg_replace('/[^\00-\255]+/u', '', $file->name);
4949
$name = str_replace('"', '', trim($name));
50-
/**
51-
* File Object
52-
*
53-
* @varFile $file
54-
*/
55-
$path = realpath($this->uploadPath) . '/' . $name . $file->uniqName;
50+
$path = realpath($this->uploadPath) . '/' . $name . $file->uniqueName;
5651

5752
if ($file->error == 0 && move_uploaded_file($file->tmp_name, $path)) {
58-
$file->uploadUrl = $this->uploadUrl . '/' . $name . $file->uniqName;
53+
$file->uploadUrl = $this->uploadUrl . '/' . $name . $file->uniqueName;
5954
$file->uploadPath = $path;
6055
$_POST[$field] = $file;
6156
$files[] = $file;

src/FormHandler.php

Lines changed: 28 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
use JustCoded\FormHandler\Handlers\HandlerInterface;
66
use Valitron\Validator;
7-
use JustCoded\FormHandler\Validator\File as FileValidator;
7+
use JustCoded\FormHandler\Validator\FileValidator;
88

99
/**
1010
* Class FormHandler
@@ -58,6 +58,9 @@ class FormHandler
5858
public function __construct(array $validationRules, HandlerInterface $handler, string $response = 'json')
5959
{
6060
$this->rules = $validationRules;
61+
if (empty($this->rules['fields'])) {
62+
throw new \Exception("You should specify 'fields' in validation array.");
63+
}
6164

6265
$this->handler = $handler;
6366

@@ -74,19 +77,12 @@ public function __construct(array $validationRules, HandlerInterface $handler, s
7477
public function validate(array $data)
7578
{
7679
$this->formFields = $data;
77-
$v = new Validator($data);
78-
79-
$v = FileValidator::validate($v, $this->rules);
80-
// create rules from input array.
81-
foreach ($this->rules['rules'] as $key => $params) {
82-
$rule = $v->rule($key, $params['fields']);
83-
if (!empty($params['message'])) {
84-
$rule->message($params['message']);
85-
}
86-
}
80+
$v = $this->getValidator($data);
81+
82+
$v->mapFieldsRules($this->rules['fields']);
8783

8884
// apply labels.
89-
if (!empty($this->rules)) {
85+
if (!empty($this->rules['labels'])) {
9086
$v->labels($this->rules['labels']);
9187
}
9288

@@ -100,6 +96,26 @@ public function validate(array $data)
10096
return empty($this->errors);
10197
}
10298

99+
/**
100+
* Create validator object with registered custom validators.
101+
*
102+
* @param array $data Data to validate.
103+
*
104+
* @return Validator
105+
*/
106+
public function getValidator($data)
107+
{
108+
$v = new Validator($data);
109+
110+
// register additional validators.
111+
FileValidator::register($v);
112+
113+
return $v;
114+
}
115+
116+
/**
117+
* Sending email by handler
118+
*/
103119
public function process()
104120
{
105121
$this->handler->process($this->formFields);

src/Handlers/MailHandler.php

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,6 @@ public function __construct(array $config, MailMessage $message)
6161
public function process(array $data)
6262
{
6363
$this->message->setTokens($data);
64-
$this->message->setFiles();
6564
$this->mailer->send($this->message);
6665

6766
return true;

src/Mailer/PHPMailer.php

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,24 @@
33
namespace JustCoded\FormHandler\Mailer;
44

55
use JustCoded\FormHandler\DataObjects\DataObject;
6-
use JustCoded\FormHandler\DataObjects\EmailAttachment;
76
use JustCoded\FormHandler\DataObjects\MailMessage;
87
use PHPMailer\PHPMailer\PHPMailer as PHPMailerLib;
98
use PHPMailer\PHPMailer\Exception as PhpMailerException;
109

10+
/**
11+
* Class PHPMailer
12+
*
13+
* @package JustCoded\FormHandler\Mailer
14+
*/
1115
class PHPMailer extends DataObject implements MailerInterface
1216
{
17+
/**
18+
* Attachments size limit
19+
*
20+
* @var int
21+
*/
22+
protected $attachmentsSizeLimit = 8000000;
23+
1324
/**
1425
* The user's host
1526
*
@@ -107,14 +118,11 @@ public function send(MailMessage $message)
107118
}
108119

109120
// Attachments.
110-
if ($attachments = $message->getFiles()) {
121+
if (0 < $message->getAttachmentsSize() && $message->getAttachmentsSize() < $this->attachmentsSizeLimit
122+
&& $attachments = $message->getAttachments()
123+
) {
111124
foreach ($attachments as $attachment) {
112-
/**
113-
* Email attachments
114-
*
115-
* @var EmailAttachment $attachment
116-
*/
117-
$mail->addAttachment($attachment->getPath(), $attachment->getName()); // Optional name.
125+
$mail->addAttachment($attachment->uploadPath, $attachment->name);
118126
}
119127
}
120128

0 commit comments

Comments
 (0)