| 1 |
<?php |
| 2 |
|
| 3 |
namespace AcyMailing\Controllers\Mails; |
| 4 |
|
| 5 |
use AcyMailing\Classes\MailClass; |
| 6 |
use AcyMailing\Classes\TagClass; |
| 7 |
use AcyMailing\Helpers\ExportHelper; |
| 8 |
use AcyMailing\Helpers\PaginationHelper; |
| 9 |
use AcyMailing\Helpers\ToolbarHelper; |
| 10 |
use AcyMailing\Helpers\UpdateHelper; |
| 11 |
|
| 12 |
trait Listing |
| 13 |
{ |
| 14 |
public function listing(): void |
| 15 |
{ |
| 16 |
acym_setVar('layout', 'listing'); |
| 17 |
|
| 18 |
$searchFilter = $this->getVarFiltersListing('string', 'mails_search', ''); |
| 19 |
$tagFilter = $this->getVarFiltersListing('string', 'mails_tag', ''); |
| 20 |
$ordering = $this->getVarFiltersListing('string', 'mails_ordering', 'creation_date'); |
| 21 |
$orderingSortOrder = $this->getVarFiltersListing('cmd', 'mails_ordering_sort_order', 'desc'); |
| 22 |
|
| 23 |
$pagination = new PaginationHelper(); |
| 24 |
$mailsPerPage = $pagination->getListLimit(); |
| 25 |
$page = $this->getVarFiltersListing('int', 'mails_pagination_page', 1); |
| 26 |
$mailClass = new MailClass(); |
| 27 |
$status = MailClass::TYPE_STANDARD; |
| 28 |
|
| 29 |
$requestData = [ |
| 30 |
'ordering' => $ordering, |
| 31 |
'search' => $searchFilter, |
| 32 |
'elementsPerPage' => $mailsPerPage, |
| 33 |
'offset' => ($page - 1) * $mailsPerPage, |
| 34 |
'tag' => $tagFilter, |
| 35 |
'status' => $status, |
| 36 |
'ordering_sort_order' => $orderingSortOrder, |
| 37 |
'onlyStandard' => true, |
| 38 |
]; |
| 39 |
$matchingMails = $this->getMatchingElementsFromData($requestData, $status, $page); |
| 40 |
|
| 41 |
|
| 42 |
$matchingMailsNb = count($matchingMails['elements']); |
| 43 |
|
| 44 |
if (empty($matchingMailsNb) && $page > 1) { |
| 45 |
$this->setVarFiltersListing('mails_pagination_page', 1); |
| 46 |
$this->listing(); |
| 47 |
|
| 48 |
return; |
| 49 |
} |
| 50 |
|
| 51 |
$pagination->setStatus($matchingMails['total']->total, $page, $mailsPerPage); |
| 52 |
|
| 53 |
ob_start(); |
| 54 |
require acym_getView('mails', 'listing_import', true); |
| 55 |
$templateImportView = ob_get_clean(); |
| 56 |
|
| 57 |
$tagClass = new TagClass(); |
| 58 |
$mailsData = [ |
| 59 |
'allMails' => $matchingMails['elements'], |
| 60 |
'allTags' => $tagClass->getAllTagsByType(TagClass::TYPE_MAIL), |
| 61 |
'pagination' => $pagination, |
| 62 |
'search' => $searchFilter, |
| 63 |
'tag' => $tagFilter, |
| 64 |
'ordering' => $ordering, |
| 65 |
'status' => $status, |
| 66 |
'mailNumberPerStatus' => $matchingMails['status'], |
| 67 |
'orderingSortOrder' => $orderingSortOrder, |
| 68 |
'templateImportView' => $templateImportView, |
| 69 |
'mailClass' => $mailClass, |
| 70 |
'favoriteTemplateId' => (int)$this->config->get('favorite_template', 0), |
| 71 |
]; |
| 72 |
|
| 73 |
if (!empty($mailsData['tag'])) { |
| 74 |
$mailsData['status_toolbar'] = [ |
| 75 |
'mails_tag' => $mailsData['tag'], |
| 76 |
]; |
| 77 |
} |
| 78 |
|
| 79 |
$this->prepareToolbar($mailsData); |
| 80 |
parent::display($mailsData); |
| 81 |
} |
| 82 |
|
| 83 |
public function prepareToolbar(array &$data): void |
| 84 |
{ |
| 85 |
$toolbarHelper = new ToolbarHelper(); |
| 86 |
$toolbarHelper->addSearchBar($data['search'], 'mails_search', 'ACYM_SEARCH'); |
| 87 |
$toolbarHelper->addFilterByTag($data, 'mails_tag', 'acym__templates__filter__tags acym__select'); |
| 88 |
$toolbarHelper->addButton(acym_translation('ACYM_ADD_DEFAULT_TMPL'), ['data-task' => 'installDefaultTmpl', 'id' => 'acym__mail__install-default'], 'content_copy'); |
| 89 |
$otherContent = acym_modal( |
| 90 |
'<i class="acymicon-download"></i>'.acym_translation('ACYM_IMPORT'), |
| 91 |
$data['templateImportView'], |
| 92 |
'acym__template__import__reveal', |
| 93 |
'', |
| 94 |
'class="button button-secondary cell medium-6 large-shrink" data-reload="true" data-ajax="false"' |
| 95 |
); |
| 96 |
|
| 97 |
$otherContent .= acym_modal( |
| 98 |
'<i class="acymicon-add"></i>'.acym_translation('ACYM_CREATE'), |
| 99 |
'<div class="cell grid-x grid-margin-x"> |
| 100 |
<button type="button" data-task="edit" data-editor="html" class="acym__create__template button cell large-auto small-6 margin-top-1 button-secondary">'.acym_translation( |
| 101 |
'ACYM_HTML_EDITOR' |
| 102 |
).'</button> |
| 103 |
<button type="button" data-task="edit" data-editor="acyEditor" class="acym__create__template button cell medium-auto margin-top-1">'.acym_translation( |
| 104 |
'ACYM_DD_EDITOR' |
| 105 |
).'</button> |
| 106 |
</div>', |
| 107 |
'', |
| 108 |
'', |
| 109 |
'class="acym_vcenter button cell medium-6 large-shrink"', |
| 110 |
true, |
| 111 |
false |
| 112 |
); |
| 113 |
$toolbarHelper->addOtherContent($otherContent); |
| 114 |
|
| 115 |
$data['toolbar'] = $toolbarHelper; |
| 116 |
} |
| 117 |
|
| 118 |
public function doUploadTemplate(): void |
| 119 |
{ |
| 120 |
acym_checkToken(); |
| 121 |
|
| 122 |
if (!acym_isAdmin() || !acym_isAllowed('mails')) { |
| 123 |
die('Access denied'); |
| 124 |
} |
| 125 |
|
| 126 |
$mailClass = new MailClass(); |
| 127 |
$mailClass->doupload(); |
| 128 |
|
| 129 |
$this->listing(); |
| 130 |
} |
| 131 |
|
| 132 |
public function export(): void |
| 133 |
{ |
| 134 |
acym_checkToken(); |
| 135 |
|
| 136 |
$templateId = acym_getVar('int', 'templateId', 0); |
| 137 |
|
| 138 |
if (empty($templateId)) { |
| 139 |
exit; |
| 140 |
} |
| 141 |
|
| 142 |
$mailClass = new MailClass(); |
| 143 |
$template = $mailClass->getOneById($templateId); |
| 144 |
|
| 145 |
$exportHelper = new ExportHelper(); |
| 146 |
$exportHelper->exportTemplate($template); |
| 147 |
|
| 148 |
exit; |
| 149 |
} |
| 150 |
|
| 151 |
public function installDefaultTmpl(): void |
| 152 |
{ |
| 153 |
$updateHelper = new UpdateHelper(); |
| 154 |
$updateHelper->installTemplates(); |
| 155 |
|
| 156 |
$this->listing(); |
| 157 |
} |
| 158 |
|
| 159 |
public function favorite(): void |
| 160 |
{ |
| 161 |
$templateId = acym_getVar('int', 'templateId', 0); |
| 162 |
|
| 163 |
if (empty($templateId)) { |
| 164 |
acym_enqueueMessage(acym_translationSprintf('ACYM_NOT_FOUND', acym_translation('ACYM_TEMPLATE')), 'error'); |
| 165 |
$this->listing(); |
| 166 |
|
| 167 |
return; |
| 168 |
} |
| 169 |
|
| 170 |
$favoriteTemplateId = $this->config->get('favorite_template', 0); |
| 171 |
$this->config->save(['favorite_template' => (int)$favoriteTemplateId === $templateId ? 0 : $templateId]); |
| 172 |
|
| 173 |
$this->listing(); |
| 174 |
} |
| 175 |
|
| 176 |
public function massDuplicate(): void |
| 177 |
{ |
| 178 |
$ids = acym_getVar('array', 'elements_checked', []); |
| 179 |
if (!empty($ids)) { |
| 180 |
$this->duplicate($ids); |
| 181 |
} |
| 182 |
$this->listing(); |
| 183 |
} |
| 184 |
|
| 185 |
public function oneDuplicate(): void |
| 186 |
{ |
| 187 |
$templateId = acym_getVar('int', 'templateId', 0); |
| 188 |
|
| 189 |
if (empty($templateId)) { |
| 190 |
acym_enqueueMessage(acym_translation('ACYM_TEMPLATE_DUPLICATE_ERROR'), 'error'); |
| 191 |
$this->listing(); |
| 192 |
|
| 193 |
return; |
| 194 |
} |
| 195 |
|
| 196 |
$this->duplicate([$templateId]); |
| 197 |
$this->listing(); |
| 198 |
} |
| 199 |
|
| 200 |
public function duplicate(array $templates = []): void |
| 201 |
{ |
| 202 |
$mailClass = new MailClass(); |
| 203 |
$tmplError = []; |
| 204 |
foreach ($templates as $templateId) { |
| 205 |
$oldTemplate = $mailClass->getOneById($templateId); |
| 206 |
|
| 207 |
if (empty($oldTemplate)) { |
| 208 |
$tmplError[] = $templateId; |
| 209 |
continue; |
| 210 |
} |
| 211 |
|
| 212 |
$newTemplate = $oldTemplate; |
| 213 |
$newTemplate->id = 0; |
| 214 |
$newTemplate->name = $oldTemplate->name.'_copy'; |
| 215 |
unset($newTemplate->thumbnail); |
| 216 |
|
| 217 |
$mailClass->save($newTemplate); |
| 218 |
} |
| 219 |
if (!empty($tmplError)) { |
| 220 |
acym_enqueueMessage(acym_translationSprintf('ACYM_TEMPLATE_X_DUPLICATE_ERROR', implode(', ', $tmplError)), 'error'); |
| 221 |
} |
| 222 |
} |
| 223 |
|
| 224 |
public function delete(): void |
| 225 |
{ |
| 226 |
parent::delete(); |
| 227 |
|
| 228 |
$returnListing = acym_getVar('string', 'return_listing', ''); |
| 229 |
if (!empty($returnListing)) { |
| 230 |
if (acym_isAdmin()) { |
| 231 |
acym_redirect(acym_completeLink($returnListing, false, true)); |
| 232 |
} else { |
| 233 |
$itemId = acym_getVar('int', 'acym_itemid'); |
| 234 |
$itemId = empty($itemId) ? '' : '&Itemid='.$itemId; |
| 235 |
$urlRedirect = acym_completeLink($returnListing.$itemId, false, true); |
| 236 |
acym_redirect($urlRedirect); |
| 237 |
} |
| 238 |
} |
| 239 |
} |
| 240 |
|
| 241 |
public function getMailByIdAjax(): void |
| 242 |
{ |
| 243 |
acym_checkToken(); |
| 244 |
$mailId = acym_getVar('int', 'id', 0); |
| 245 |
if (empty($mailId)) acym_sendAjaxResponse(acym_translation('ACYM_COULD_NOT_FIND_MAIL'), [], false); |
| 246 |
|
| 247 |
$mailClass = new MailClass(); |
| 248 |
$mail = $mailClass->getOneById($mailId); |
| 249 |
if (empty($mail)) acym_sendAjaxResponse(acym_translation('ACYM_COULD_NOT_FIND_MAIL'), [], false); |
| 250 |
|
| 251 |
if (!$mailClass->hasUserAccess($mailId)) { |
| 252 |
die('Access denied for this mail'); |
| 253 |
} |
| 254 |
|
| 255 |
acym_sendAjaxResponse('', $mail); |
| 256 |
} |
| 257 |
} |
| 258 |
|