PluginProbe
AcyMailing – An Ultimate Newsletter Plugin and Marketing Automation Solution for WordPress / 11.1.0
AcyMailing – An Ultimate Newsletter Plugin and Marketing Automation Solution for WordPress v11.1.0
11.1.1 11.1.0 11.0.5 11.0.4 11.0.3 11.0.2 11.0.1 11.0.0 10.11.1 10.11.0 10.10.2 10.10.1 10.10.0 10.9.1 trunk 10.0.0 10.0.1 10.1.0 10.1.1 10.1.2 10.1.3 10.1.4 10.2.0 10.2.1 10.2.2 All 62 releases
← All changes | back/dynamics/subscriber/SubscriberAutomationActions.php +383 -0 10.0.0 → 11.1.0 View file →
@@ -1,0 +1,383 @@
1 +<?php
2 +
3 +use AcyMailing\Classes\UserClass;
4 +use AcyMailing\Classes\MailClass;
5 +use AcyMailing\Classes\FieldClass;
6 +use AcyMailing\Helpers\MailerHelper;
7 +
8 +trait SubscriberAutomationActions
9 +{
10 + /**
11 + * Function called with ajax to search email to remove from the queue
12 + */
13 + public function searchEmails()
14 + {
15 + $id = acym_getVar('int', 'id');
16 + if (!empty($id)) {
17 + if ($id == -1) {
18 + $name = acym_translation('ACYM_ALL_MAILS');
19 + } else {
20 + $name = acym_loadResult(
21 + 'SELECT name
22 + FROM #__acym_mail
23 + WHERE id = '.intval($id)
24 + );
25 + $name = empty($name) ? '' : acym_utf8Decode($name);
26 + }
27 + echo json_encode(['value' => $name]);
28 + exit;
29 + }
30 +
31 + $return = [];
32 + $return[] = [-1, acym_translation('ACYM_ALL_MAILS')];
33 + $search = acym_utf8Encode(acym_getVar('string', 'search', ''));
34 + $elements = acym_loadObjectList(
35 + 'SELECT `id`, `subject`, `name`
36 + FROM #__acym_mail
37 + WHERE (`subject` LIKE '.acym_escapeDB('%'.$search.'%').'
38 + OR `name` LIKE '.acym_escapeDB('%'.$search.'%').')
39 + AND `type` != '.acym_escapeDB(MailClass::TYPE_NOTIFICATION).'
40 + ORDER BY `subject` ASC
41 + LIMIT 20'
42 + );
43 +
44 + foreach ($elements as $oneElement) {
45 + $return[] = [$oneElement->id, $oneElement->name];
46 + }
47 +
48 + echo json_encode($return);
49 + exit;
50 + }
51 +
52 + protected function initAutomationActions(): void
53 + {
54 + $this->automationActions = [
55 + 'acy_user' => acym_translation('ACYM_ACTION_ON_USERS'),
56 + 'acy_user_value' => acym_translation('ACYM_SET_USER_VALUE'),
57 + 'acy_add_queue' => acym_translation('ACYM_ADD_EMAIL_QUEUE'),
58 + 'acy_send_email' => acym_translation('ACYM_SEND_EMAIL'),
59 + 'acy_remove_queue' => acym_translation('ACYM_REMOVE_EMAIL_QUEUE'),
60 + ];
61 +
62 + if ($this->config->get('require_confirmation', '1') === '1') {
63 + $this->automationActions['resend_confirmation'] = acym_translation('ACYM_RESEND_CONFIRMATION');
64 + }
65 + }
66 +
67 + public function onAcymDeclareActionsScenario(array &$actions): void
68 + {
69 + $this->onAcymDeclareActions($actions);
70 +
71 + unset($actions['acy_add_queue']);
72 + }
73 +
74 + public function displayActionOptions_acy_user(): void
75 + {
76 + $userActions = [
77 + 'confirm' => acym_translation('ACYM_CONFIRM_USER'),
78 + 'unconfirm' => acym_translation('ACYM_UNCONFIRM_USER'),
79 + 'active' => acym_translation('ACYM_ACTIVE_USER'),
80 + 'block' => acym_translation('ACYM_BLOCK_USER'),
81 + 'delete' => acym_translation('ACYM_DELETE_USER'),
82 + ];
83 +
84 + include acym_getPartial('actions', 'acy_user');
85 + }
86 +
87 + public function displayActionOptions_acy_user_value(): void
88 + {
89 + $userClass = new UserClass();
90 + $userFields = $userClass->getAllColumnsUserAndCustomField(true);
91 + unset($userFields['id']);
92 + unset($userFields['cms_id']);
93 + unset($userFields['key']);
94 + unset($userFields['active']);
95 + unset($userFields['source']);
96 + unset($userFields['confirmed']);
97 + unset($userFields['automation']);
98 + unset($userFields['creation_date']);
99 +
100 + $userOperator = [
101 + '=' => '=',
102 + '-' => '-',
103 + '+' => '+',
104 + 'add_end' => acym_translation('ACYM_ADD_AT_END'),
105 + 'add_begin' => acym_translation('ACYM_ADD_AT_BEGINNING'),
106 + ];
107 +
108 + $fieldClass = new FieldClass();
109 + $customFields = $fieldClass->getAllFieldsForUser();
110 +
111 + include acym_getPartial('actions', 'acy_user_value');
112 + }
113 +
114 + public function displayActionOptions_acy_add_queue(): void
115 + {
116 + include acym_getPartial('actions', 'acy_add_queue');
117 + }
118 +
119 + public function displayActionOptions_acy_send_email(): void
120 + {
121 + include acym_getPartial('actions', 'acy_send_email');
122 + }
123 +
124 + public function displayActionOptions_acy_remove_queue(): void
125 + {
126 + $ajaxParams = [
127 + 'plugin' => __CLASS__,
128 + 'trigger' => 'searchEmails',
129 + ];
130 +
131 + include acym_getPartial('actions', 'acy_remove_queue');
132 + }
133 +
134 + public function displayActionOptions_resend_confirmation(): void
135 + {
136 + // The action doesn't save if there are no options
137 + echo '<input type="hidden" name="acym_action[actions][__and__][resend_confirmation][save]" />';
138 + }
139 +
140 + public function onAcymProcessAction_acy_user(&$query, $action)
141 + {
142 + if ($action['action'] == 'delete') {
143 + $userClass = new UserClass();
144 + $usersToDelete = acym_loadResultArray($query->getQuery(['user.id']));
145 + if (!empty($usersToDelete)) $userClass->delete($usersToDelete, true);
146 + } else {
147 + $fieldToUpdate = '';
148 + if ($action['action'] === 'confirm') $fieldToUpdate = 'confirmed = 1';
149 + if ($action['action'] === 'unconfirm') $fieldToUpdate = 'confirmed = 0';
150 + if ($action['action'] === 'active') $fieldToUpdate = 'active = 1, deactivation_date = NULL';
151 + if ($action['action'] === 'block') $fieldToUpdate = 'active = 0, deactivation_date = UTC_TIMESTAMP()';
152 +
153 +
154 + $queryToProcess = 'UPDATE #__acym_user AS `user` SET '.$fieldToUpdate.' WHERE ('.implode(') AND (', $query->where).')';
155 + $nbRows = acym_query($queryToProcess);
156 +
157 + return acym_translationSprintf('ACYM_X_USERS_X', $nbRows, acym_translation('ACYM_ACTION_'.strtoupper($action['action'])));
158 + }
159 + }
160 +
161 + public function onAcymProcessAction_acy_user_value(&$query, $action)
162 + {
163 + $value = $action['value'];
164 + $value = acym_replaceDateTags($value);
165 +
166 + if (empty($action['operator'])) $action['operator'] = '=';
167 +
168 + $usersColumns = acym_getColumns('user');
169 +
170 + if (in_array($action['field'], $usersColumns)) {
171 + $execute = 'UPDATE #__acym_user AS user';
172 +
173 + $column = 'user.`'.acym_secureDBColumn($action['field']).'`';
174 + } else {
175 + $fieldClass = new FieldClass();
176 + $field = $fieldClass->getOneById($action['field']);
177 + if (empty($field)) {
178 + return 'Unknown field: '.$action['field'];
179 + }
180 +
181 + $allColumn = '`user_id`, `field_id`, `value`';
182 + $column = '`value`';
183 + }
184 +
185 + if ($action['operator'] === '=') {
186 + $newValue = acym_escapeDB($value);
187 + } elseif (in_array($action['operator'], ['+', '-'])) {
188 + $newValue = $column.' '.$action['operator'].' '.intval($value);
189 + } elseif ($action['operator'] === 'add_end') {
190 + $newValue = 'CONCAT('.$column.', '.acym_escapeDB($value).')';
191 + } elseif ($action['operator'] === 'add_begin') {
192 + $newValue = 'CONCAT('.acym_escapeDB($value).', '.$column.')';
193 + } else {
194 + return 'Unknown operator: '.esc_attr($action['operator']);
195 + }
196 +
197 + if (in_array($action['field'], $usersColumns)) {
198 + $execute .= ' SET '.$column.' = '.$newValue;
199 + if (!empty($query->where)) $execute .= ' WHERE ('.implode(') AND (', $query->where).')';
200 + } else {
201 + $customFieldAlreadyExists = acym_loadResult('SELECT COUNT(user_id) FROM #__acym_user_has_field WHERE field_id = '.intval($action['field']));
202 + $execute = 'INSERT INTO #__acym_user_has_field ('.$allColumn.') SELECT id AS user_id, '.intval(
203 + $action['field']
204 + ).' AS field_id, '.$newValue.' AS value FROM #__acym_user AS user WHERE ('.implode(
205 + ') AND (',
206 + $query->where
207 + ).') ON DUPLICATE KEY UPDATE '.$column.' = VALUES('.$column.')';
208 + }
209 +
210 + $nbAffected = acym_query($execute);
211 +
212 + if (!empty($customFieldAlreadyExists)) {
213 + $nbAffected -= $customFieldAlreadyExists;
214 + }
215 +
216 + return acym_translationSprintf('ACYM_UPDATED_USERS', $nbAffected);
217 + }
218 +
219 + public function onAcymProcessAction_acy_send_email(&$query, &$action)
220 + {
221 + if (empty($action['mail_id'])) {
222 + return acym_translation('ACYM_NO_MAIL_SET');
223 + }
224 +
225 + $mailerHelper = new MailerHelper();
226 +
227 + $userIds = acym_loadResultArray($query->getQuery(['user.id']));
228 + if (empty($userIds)) {
229 + return acym_translation('ACYM_NO_USER_FOUND');
230 + }
231 +
232 + $errors = [];
233 +
234 + foreach ($userIds as $userId) {
235 + try {
236 + $mailSent = $mailerHelper->sendOne($action['mail_id'], $userId);
237 +
238 + if (!$mailSent) {
239 + $errors[] = acym_translationSprintf('ACYM_COULD_NOT_SEND_EMAIL_TO_USER_X', $userId);
240 + acym_logError('Error while sending email', 'action_acy_send_email');
241 + }
242 + } catch (Exception $e) {
243 + $errors[] = acym_translationSprintf('ACYM_COULD_NOT_SEND_EMAIL_TO_USER_X_ERROR_X', $userId, $e->getMessage());
244 + }
245 + }
246 +
247 + return empty($errors) ? acym_translation('ACYM_EMAILS_SENT') : implode('<br>', $errors);
248 + }
249 +
250 + public function onAcymProcessAction_acy_add_queue(&$query, &$action, $automationAdmin)
251 + {
252 + if (empty($action['time']) || empty($action['mail_id'])) return '';
253 +
254 + $sendDate = acym_replaceDate($action['time']);
255 + $sendDate = acym_date($sendDate, 'Y-m-d H:i:s', false);
256 + $mailClass = new MailClass();
257 +
258 + //We generate the new mail if it's a template
259 + $mail = $mailClass->getOneById($action['mail_id']);
260 +
261 + if (empty($mail)) return '';
262 +
263 + if (MailClass::TYPE_AUTOMATION !== $mail->type) {
264 + unset($mail->id);
265 + $mail->type = MailClass::TYPE_AUTOMATION;
266 + $mail->id = $mailClass->save($mail);
267 + }
268 +
269 + $userIds = acym_loadResultArray($query->getQuery(['user.id']));
270 + if (empty($userIds)) {
271 + $result = 0;
272 + } else {
273 + $result = $mailClass->sendAutomation($mail->id, $userIds, $sendDate, $automationAdmin);
274 + }
275 +
276 + if (is_numeric($result)) {
277 + return acym_translationSprintf('ACYM_EMAILS_ADDED_QUEUE', $result);
278 + } else {
279 + return $result;
280 + }
281 + }
282 +
283 + public function onAcymProcessAction_acy_remove_queue(&$query, $action)
284 + {
285 + if (empty($action['mail_id'])) return '';
286 +
287 + $mailCondition = '';
288 + if ($action['mail_id'] != -1) {
289 + $mailCondition = ' AND `mail_id` = '.intval($action['mail_id']);
290 + }
291 + $nbRows = acym_query('DELETE FROM #__acym_queue WHERE `user_id` IN ('.$query->getQuery(['user.id']).')'.$mailCondition);
292 +
293 + return acym_translationSprintf('ACYM_EMAILS_REMOVED_QUEUE', $nbRows);
294 + }
295 +
296 + public function onAcymProcessAction_resend_confirmation(&$query, &$action)
297 + {
298 + $mailClass = new MailClass();
299 + $confirmationMail = $mailClass->getOneByName('acy_confirm');
300 + $sendDate = acym_date('now', 'Y-m-d H:i:s', false);
301 +
302 + $queryInsert = 'INSERT IGNORE INTO #__acym_queue (`mail_id`, `user_id`, `sending_date`, `priority`, `try`) ';
303 + $queryInsert .= '('.$query->getQuery(
304 + [
305 + intval($confirmationMail->id),
306 + 'user.id',
307 + acym_escapeDB($sendDate),
308 + '1',
309 + '0',
310 + ]
311 + ).')';
312 + $nbInserted = acym_query($queryInsert);
313 +
314 + if (is_numeric($nbInserted)) {
315 + return acym_translationSprintf('ACYM_EMAILS_ADDED_QUEUE', $nbInserted);
316 + } else {
317 + return $nbInserted;
318 + }
319 + }
320 +
321 + public function onAcymDeclareSummary_actions(&$automationAction)
322 + {
323 + if (!empty($automationAction['acy_user'])) {
324 + $userActions = [
325 + 'confirm' => acym_translation('ACYM_WILL_CONFIRM'),
326 + 'unconfirm' => acym_translation('ACYM_WILL_UNCONFIRM'),
327 + 'active' => acym_translation('ACYM_WILL_ACTIVE'),
328 + 'block' => acym_translation('ACYM_WILL_BLOCK'),
329 + 'delete' => acym_translation('ACYM_WILL_DELETE'),
330 + ];
331 + $automationAction = $userActions[$automationAction['acy_user']['action']];
332 + }
333 +
334 + if (!empty($automationAction['acy_user_value'])) {
335 + $usersColumns = acym_getColumns('user');
336 +
337 + if (!in_array($automationAction['acy_user_value']['field'], $usersColumns)) {
338 + $fieldClass = new FieldClass();
339 + $field = $fieldClass->getOneById($automationAction['acy_user_value']['field']);
340 + $automationAction['acy_user_value']['field'] = $field->name;
341 + }
342 + $automationAction = acym_translationSprintf(
343 + 'ACYM_ACTION_USER_VALUE_SUMMARY',
344 + $automationAction['acy_user_value']['field'],
345 + $automationAction['acy_user_value']['operator'],
346 + $automationAction['acy_user_value']['value']
347 + );
348 + }
349 +
350 + if (!empty($automationAction['acy_add_queue'])) {
351 + $mailClass = new MailClass();
352 + $mail = $mailClass->getOneById($automationAction['acy_add_queue']['mail_id']);
353 + if (empty($mail)) {
354 + $automationAction = '<span class="acym__color__red">'.acym_translation('ACYM_SELECT_AN_EMAIL').'</span>';
355 + } else {
356 + $queueTime = empty($automationAction['acy_add_queue']['time']) ? '[time]' : $automationAction['acy_add_queue']['time'];
357 + $automationAction = acym_translationSprintf(
358 + 'ACYM_ACTION_ADD_QUEUE_SUMMARY',
359 + $mail->name,
360 + acym_date(acym_replaceDate($queueTime), 'd M Y H:i')
361 + );
362 + }
363 + }
364 +
365 + if (!empty($automationAction['acy_remove_queue'])) {
366 + $mailClass = new MailClass();
367 + $mail = $mailClass->getOneById($automationAction['acy_remove_queue']['mail_id']);
368 + if (empty($mail)) {
369 + if ($automationAction['acy_remove_queue']['mail_id'] == -1) {
370 + $automationAction = acym_translation('ACYM_EMPTY_QUEUE_USER');
371 + } else {
372 + $automationAction = '<span class="acym__color__red">'.acym_translation('ACYM_SELECT_AN_EMAIL').'</span>';
373 + }
374 + } else {
375 + $automationAction = acym_translationSprintf('ACYM_ACTION_REMOVE_QUEUE_SUMMARY', $mail->name);
376 + }
377 + }
378 +
379 + if (!empty($automationAction['resend_confirmation'])) {
380 + $automationAction = acym_translation('ACYM_RESEND_CONFIRMATION_SUMMARY');
381 + }
382 + }
383 +}