Skip to content

Commit

Permalink
Add deactivate attachment save flag (#271)
Browse files Browse the repository at this point in the history
* Add deactivate attachment save flag

* Adjust notify email for better readability

* Adjusts tests

* Adjust upgrade

* Avoid saving of a false state of deactivate attachment save
  • Loading branch information
alexander-schranz authored Dec 10, 2020
1 parent 87f7f28 commit 414e0bf
Show file tree
Hide file tree
Showing 15 changed files with 197 additions and 50 deletions.
17 changes: 17 additions & 0 deletions Configuration/FormConfiguration.php
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,11 @@ class FormConfiguration implements FormConfigurationInterface
*/
private $fileFields = [];

/**
* @var bool
*/
private $fileSave = true;

/**
* @var MailConfigurationInterface
*/
Expand Down Expand Up @@ -120,6 +125,18 @@ public function setFileFields(array $fileFields)
return $this;
}

public function getFileSave(): bool
{
return $this->fileSave;
}

public function setFileSave(bool $fileSave)
{
$this->fileSave = $fileSave;

return $this;
}

public function getSave(): bool
{
return $this->save;
Expand Down
7 changes: 6 additions & 1 deletion Configuration/FormConfigurationFactory.php
Original file line number Diff line number Diff line change
Expand Up @@ -64,8 +64,13 @@ public function __construct(
*/
public function buildByDynamic(Dynamic $dynamic): FormConfigurationInterface
{
$config = $this->create($dynamic->getLocale());
$form = $dynamic->getForm();
$locale = $dynamic->getLocale();
$translation = $form->getTranslation($locale);

$config = $this->create($locale);
$config->setFileFields($this->getFileFieldsByDynamic($dynamic));
$config->setFileSave(!$translation->getDeactivateAttachmentSave());

$adminMailConfiguration = $this->buildAdminMailConfigurationByDynamic($dynamic);
$websiteMailConfiguration = $this->buildWebsiteMailConfigurationByDynamic($dynamic);
Expand Down
7 changes: 7 additions & 0 deletions Configuration/FormConfigurationInterface.php
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,13 @@ public function getSave(): bool;
*/
public function getFileFields(): array;

/**
* Should the files be saved.
*
* @return bool
*/
public function getFileSave(): bool;

/**
* Get admin mail configuration.
*/
Expand Down
1 change: 1 addition & 0 deletions Controller/FormController.php
Original file line number Diff line number Diff line change
Expand Up @@ -330,6 +330,7 @@ private function getApiEntity(Form $entity, string $locale): array
'submitLabel' => $translation->getSubmitLabel(),
'successText' => $translation->getSuccessText(),
'sendAttachments' => $translation->getSendAttachments(),
'deactivateAttachmentSave' => $translation->getDeactivateAttachmentSave(),
'deactivateNotifyMails' => $translation->getDeactivateNotifyMails(),
'deactivateCustomerMails' => $translation->getDeactivateCustomerMails(),
'receivers' => $receivers,
Expand Down
17 changes: 17 additions & 0 deletions Entity/FormTranslation.php
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,11 @@ class FormTranslation implements AuditableInterface
*/
private $sendAttachments = false;

/**
* @var bool
*/
private $deactivateAttachmentSave = false;

/**
* @var bool
*/
Expand Down Expand Up @@ -251,6 +256,18 @@ public function getSendAttachments(): bool
return $this->sendAttachments;
}

public function getDeactivateAttachmentSave(): bool
{
return $this->deactivateAttachmentSave;
}

public function setDeactivateAttachmentSave(bool $deactivateAttachmentSave): self
{
$this->deactivateAttachmentSave = $deactivateAttachmentSave;

return $this;
}

public function setDeactivateNotifyMails(bool $deactivateNotifyMails): self
{
$this->deactivateNotifyMails = $deactivateNotifyMails;
Expand Down
64 changes: 48 additions & 16 deletions Form/Handler.php
Original file line number Diff line number Diff line change
Expand Up @@ -55,11 +55,6 @@ class Handler implements HandlerInterface
*/
protected $mailHelper;

/**
* @var array
*/
protected $attachments = [];

/**
* @var string
*/
Expand All @@ -84,7 +79,6 @@ public function __construct(
$this->twig = $twig;
$this->eventDispatcher = $eventDispatcher;
$this->mediaManager = $mediaManager;
$this->attachments = [];
$this->honeyPotStrategy = $honeyPotStrategy;
$this->honeyPotField = $honeyPotField;
}
Expand All @@ -104,8 +98,11 @@ public function handle(FormInterface $form, FormConfigurationInterface $configur
return true; // emulate a successfully form submit
}

$mediaIds = $this->uploadMedia($form, $configuration);
$this->mapMediaIds($form->getData(), $mediaIds);
if ($configuration->getFileSave()) {
$mediaIds = $this->uploadMedia($form, $configuration);
$this->mapMediaIds($form->getData(), $mediaIds);
}

$this->save($form, $configuration);

if ($isSpam && self::HONEY_POT_STRATEGY_NO_EMAIL === $this->honeyPotStrategy) {
Expand Down Expand Up @@ -148,17 +145,19 @@ private function save(FormInterface $form, FormConfigurationInterface $configura

private function sendMails(FormInterface $form, FormConfigurationInterface $configuration): void
{
$attachments = $this->getAttachments($form, $configuration);

if ($adminMailConfiguration = $configuration->getAdminMailConfiguration()) {
$subjectPrefix = '';
if ($this->isSpamByHoneypot($form)) {
$subjectPrefix = '(SPAM) ';
}

$this->sendMail($form, $adminMailConfiguration, $subjectPrefix);
$this->sendMail($form, $adminMailConfiguration, $attachments, $subjectPrefix);
}

if ($websiteMailConfiguration = $configuration->getWebsiteMailConfiguration()) {
$this->sendMail($form, $websiteMailConfiguration);
$this->sendMail($form, $websiteMailConfiguration, $attachments, '');
}
}

Expand All @@ -167,10 +166,15 @@ private function sendMails(FormInterface $form, FormConfigurationInterface $conf
*
* @param FormInterface $form
* @param MailConfigurationInterface $configuration
* @param \SplFileInfo[] $attachments
* @param string $subjectPrefix
*/
private function sendMail(FormInterface $form, MailConfigurationInterface $configuration, string $subjectPrefix = '')
{
private function sendMail(
FormInterface $form,
MailConfigurationInterface $configuration,
array $attachments = [],
string $subjectPrefix = ''
) {
// TODO FIXME this is currently the only way to get the medias to the email view.
$additionalData = [];
$formData = $form->getData();
Expand Down Expand Up @@ -201,21 +205,51 @@ private function sendMail(FormInterface $form, MailConfigurationInterface $confi
$configuration->getFrom(),
true,
$configuration->getReplyTo(),
$configuration->getAddAttachments() ? $this->attachments : [],
$configuration->getAddAttachments() ? $attachments : [],
$configuration->getCc(),
$configuration->getBcc(),
$this->getPlainText($form, $configuration, $additionalData)
);
}

/**
* @return \SplFileInfo[]
*/
private function getAttachments(FormInterface $form, FormConfigurationInterface $configuration): array
{
$attachments = [];

foreach ($configuration->getFileFields() as $field => $collectionId) {
if (!$form->has($field) || !count($form[$field]->getData())) {
continue;
}

$files = $form[$field]->getData();

if (!is_array($files)) {
$files = [$files];
}

/** @var UploadedFile $file */
foreach ($files as $file) {
if (!$file instanceof UploadedFile) {
continue;
}

$attachments[] = $file;
}
}

return $attachments;
}

/**
* Upload media.
*
* @return mixed[]
*/
private function uploadMedia(FormInterface $form, FormConfigurationInterface $configuration): array
{
$this->attachments = [];
$mediaIds = [];

foreach ($configuration->getFileFields() as $field => $collectionId) {
Expand All @@ -242,8 +276,6 @@ private function uploadMedia(FormInterface $form, FormConfigurationInterface $co
null
);

// save attachments data for swift message
$this->attachments[] = $file;
$ids[] = $media->getId();
}

Expand Down
1 change: 1 addition & 0 deletions Manager/FormManager.php
Original file line number Diff line number Diff line change
Expand Up @@ -92,6 +92,7 @@ public function save(array $data, ?string $locale = null, ?int $id = null): ?For
$translation->setSubmitLabel(self::getValue($data, 'submitLabel'));
$translation->setSuccessText(self::getValue($data, 'successText'));
$translation->setSendAttachments(self::getValue($data, 'sendAttachments', false));
$translation->setDeactivateAttachmentSave($translation->getSendAttachments() && self::getValue($data, 'deactivateAttachmentSave', false));
$translation->setDeactivateNotifyMails(self::getValue($data, 'deactivateNotifyMails', false));
$translation->setDeactivateCustomerMails(self::getValue($data, 'deactivateCustomerMails', false));
$translation->setReplyTo(self::getValue($data, 'replyTo', false));
Expand Down
5 changes: 5 additions & 0 deletions Resources/config/doctrine/FormTranslation.orm.xml
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,11 @@
<option name="default">0</option>
</options>
</field>
<field name="deactivateAttachmentSave" column="deactivateAttachmentSave" type="boolean" nullable="false">
<options>
<option name="default">0</option>
</options>
</field>
<field name="deactivateNotifyMails" column="deactivateNotifyMails" type="boolean" nullable="false">
<options>
<option name="default">0</option>
Expand Down
Loading

0 comments on commit 414e0bf

Please sign in to comment.