PluginProbe
AcyMailing – An Ultimate Newsletter Plugin and Marketing Automation Solution for WordPress / 11.0.3
AcyMailing – An Ultimate Newsletter Plugin and Marketing Automation Solution for WordPress v11.0.3
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
acymailing / back / dynamics / subscriber / SubscriberAutomationActions.php

SubscriberAutomationActions.php in AcyMailing – An Ultimate Newsletter Plugin and Marketing Automation Solution for WordPress 11.0.3, at back/dynamics/subscriber/SubscriberAutomationActions.php

379 lines 14.7 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
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 public function onAcymDeclareActions(array &$actions): void
53 {
54 $userActions = [
55 'confirm' => acym_translation('ACYM_CONFIRM_USER'),
56 'unconfirm' => acym_translation('ACYM_UNCONFIRM_USER'),
57 'active' => acym_translation('ACYM_ACTIVE_USER'),
58 'block' => acym_translation('ACYM_BLOCK_USER'),
59 'delete' => acym_translation('ACYM_DELETE_USER'),
60 ];
61
62 $actions['acy_user'] = new stdClass();
63 $actions['acy_user']->name = acym_translation('ACYM_ACTION_ON_USERS');
64
65 ob_start();
66 include acym_getPartial('actions', 'acy_user');
67 $actions['acy_user']->option = ob_get_clean();
68
69 $userClass = new UserClass();
70 $userFields = $userClass->getAllColumnsUserAndCustomField(true);
71 unset($userFields['id']);
72 unset($userFields['cms_id']);
73 unset($userFields['key']);
74 unset($userFields['active']);
75 unset($userFields['source']);
76 unset($userFields['confirmed']);
77 unset($userFields['automation']);
78 unset($userFields['creation_date']);
79
80 $userOperator = [
81 '=' => '=',
82 '-' => '-',
83 '+' => '+',
84 'add_end' => acym_translation('ACYM_ADD_AT_END'),
85 'add_begin' => acym_translation('ACYM_ADD_AT_BEGINNING'),
86 ];
87
88 $fieldClass = new FieldClass();
89 $customFields = $fieldClass->getAllFieldsForUser();
90 $customFieldValues = [];
91
92 $actions['acy_user_value'] = new stdClass();
93 $actions['acy_user_value']->name = acym_translation('ACYM_SET_USER_VALUE');
94 ob_start();
95 include acym_getPartial('actions', 'acy_user_value');
96 $actions['acy_user_value']->option = ob_get_clean();
97
98 $actions['acy_add_queue'] = new stdClass();
99 $actions['acy_add_queue']->name = acym_translation('ACYM_ADD_EMAIL_QUEUE');
100 ob_start();
101 include acym_getPartial('actions', 'acy_add_queue');
102 $actions['acy_add_queue']->option = ob_get_clean();
103
104 $actions['acy_send_email'] = new stdClass();
105 $actions['acy_send_email']->name = acym_translation('ACYM_SEND_EMAIL');
106 ob_start();
107 include acym_getPartial('actions', 'acy_send_email');
108 $actions['acy_send_email']->option = ob_get_clean();
109
110 $actions['acy_remove_queue'] = new stdClass();
111 $actions['acy_remove_queue']->name = acym_translation('ACYM_REMOVE_EMAIL_QUEUE');
112 $ajaxParams = [
113 'plugin' => __CLASS__,
114 'trigger' => 'searchEmails',
115 ];
116 ob_start();
117 include acym_getPartial('actions', 'acy_remove_queue');
118 $actions['acy_remove_queue']->option = ob_get_clean();
119
120 if ($this->config->get('require_confirmation', '1') === '1') {
121 $actions['resend_confirmation'] = new stdClass();
122 $actions['resend_confirmation']->name = acym_translation('ACYM_RESEND_CONFIRMATION');
123 // The action doesn't save if there are no options
124 $actions['resend_confirmation']->option = '<input type="hidden" name="acym_action[actions][__and__][resend_confirmation][save]" />';
125 }
126 }
127
128 public function onAcymDeclareActionsScenario(array &$actions): void
129 {
130 $this->onAcymDeclareActions($actions);
131
132 unset($actions['acy_add_queue']);
133 }
134
135 public function onAcymProcessAction_acy_user(&$query, $action)
136 {
137 if ($action['action'] == 'delete') {
138 $userClass = new UserClass();
139 $usersToDelete = acym_loadResultArray($query->getQuery(['user.id']));
140 if (!empty($usersToDelete)) $userClass->delete($usersToDelete, true);
141 } else {
142 $fieldToUpdate = '';
143 if ($action['action'] === 'confirm') $fieldToUpdate = 'confirmed = 1';
144 if ($action['action'] === 'unconfirm') $fieldToUpdate = 'confirmed = 0';
145 if ($action['action'] === 'active') $fieldToUpdate = 'active = 1, deactivation_date = NULL';
146 if ($action['action'] === 'block') $fieldToUpdate = 'active = 0, deactivation_date = UTC_TIMESTAMP()';
147
148
149 $queryToProcess = 'UPDATE #__acym_user AS `user` SET '.$fieldToUpdate.' WHERE ('.implode(') AND (', $query->where).')';
150 $nbRows = acym_query($queryToProcess);
151
152 return acym_translationSprintf('ACYM_X_USERS_X', $nbRows, acym_translation('ACYM_ACTION_'.strtoupper($action['action'])));
153 }
154 }
155
156 public function onAcymProcessAction_acy_user_value(&$query, $action)
157 {
158 $value = $action['value'];
159 $value = acym_replaceDateTags($value);
160
161 if (empty($action['operator'])) $action['operator'] = '=';
162
163 $usersColumns = acym_getColumns('user');
164
165 if (in_array($action['field'], $usersColumns)) {
166 $execute = 'UPDATE #__acym_user AS user';
167
168 $column = 'user.`'.acym_secureDBColumn($action['field']).'`';
169 } else {
170 $fieldClass = new FieldClass();
171 $field = $fieldClass->getOneById($action['field']);
172 if (empty($field)) {
173 return 'Unknown field: '.$action['field'];
174 }
175
176 $allColumn = '`user_id`, `field_id`, `value`';
177 $column = '`value`';
178 }
179
180 if ($action['operator'] === '=') {
181 $newValue = acym_escapeDB($value);
182 } elseif (in_array($action['operator'], ['+', '-'])) {
183 $newValue = $column.' '.$action['operator'].' '.intval($value);
184 } elseif ($action['operator'] === 'add_end') {
185 $newValue = 'CONCAT('.$column.', '.acym_escapeDB($value).')';
186 } elseif ($action['operator'] === 'add_begin') {
187 $newValue = 'CONCAT('.acym_escapeDB($value).', '.$column.')';
188 } else {
189 return 'Unknown operator: '.esc_attr($action['operator']);
190 }
191
192 if (in_array($action['field'], $usersColumns)) {
193 $execute .= ' SET '.$column.' = '.$newValue;
194 if (!empty($query->where)) $execute .= ' WHERE ('.implode(') AND (', $query->where).')';
195 } else {
196 $customFieldAlreadyExists = acym_loadResult('SELECT COUNT(user_id) FROM #__acym_user_has_field WHERE field_id = '.intval($action['field']));
197 $execute = 'INSERT INTO #__acym_user_has_field ('.$allColumn.') SELECT id AS user_id, '.intval(
198 $action['field']
199 ).' AS field_id, '.$newValue.' AS value FROM #__acym_user AS user WHERE ('.implode(
200 ') AND (',
201 $query->where
202 ).') ON DUPLICATE KEY UPDATE '.$column.' = VALUES('.$column.')';
203 }
204
205 $nbAffected = acym_query($execute);
206
207 if (!empty($customFieldAlreadyExists)) {
208 $nbAffected -= $customFieldAlreadyExists;
209 }
210
211 return acym_translationSprintf('ACYM_UPDATED_USERS', $nbAffected);
212 }
213
214 public function onAcymProcessAction_acy_send_email(&$query, &$action)
215 {
216 if (empty($action['mail_id'])) {
217 return acym_translation('ACYM_NO_MAIL_SET');
218 }
219
220 $mailerHelper = new MailerHelper();
221
222 $userIds = acym_loadResultArray($query->getQuery(['user.id']));
223 if (empty($userIds)) {
224 return acym_translation('ACYM_NO_USER_FOUND');
225 }
226
227 $errors = [];
228
229 foreach ($userIds as $userId) {
230 try {
231 $mailSent = $mailerHelper->sendOne($action['mail_id'], $userId);
232
233 if (!$mailSent) {
234 $errors[] = acym_translationSprintf('ACYM_COULD_NOT_SEND_EMAIL_TO_USER_X', $userId);
235 acym_logError('Error while sending email', 'action_acy_send_email');
236 }
237 } catch (Exception $e) {
238 $errors[] = acym_translationSprintf('ACYM_COULD_NOT_SEND_EMAIL_TO_USER_X_ERROR_X', $userId, $e->getMessage());
239 }
240 }
241
242 return empty($errors) ? acym_translation('ACYM_EMAILS_SENT') : implode('<br>', $errors);
243 }
244
245 public function onAcymProcessAction_acy_add_queue(&$query, &$action, $automationAdmin)
246 {
247 if (empty($action['time']) || empty($action['mail_id'])) return '';
248
249 $sendDate = acym_replaceDate($action['time']);
250 $sendDate = acym_date($sendDate, 'Y-m-d H:i:s', false);
251 $mailClass = new MailClass();
252
253 //We generate the new mail if it's a template
254 $mail = $mailClass->getOneById($action['mail_id']);
255
256 if (empty($mail)) return '';
257
258 if (MailClass::TYPE_AUTOMATION !== $mail->type) {
259 unset($mail->id);
260 $mail->type = MailClass::TYPE_AUTOMATION;
261 $mail->id = $mailClass->save($mail);
262 }
263
264 $userIds = acym_loadResultArray($query->getQuery(['user.id']));
265 if (empty($userIds)) {
266 $result = 0;
267 } else {
268 $result = $mailClass->sendAutomation($mail->id, $userIds, $sendDate, $automationAdmin);
269 }
270
271 if (is_numeric($result)) {
272 return acym_translationSprintf('ACYM_EMAILS_ADDED_QUEUE', $result);
273 } else {
274 return $result;
275 }
276 }
277
278 public function onAcymProcessAction_acy_remove_queue(&$query, $action)
279 {
280 if (empty($action['mail_id'])) return '';
281
282 $mailCondition = '';
283 if ($action['mail_id'] != -1) {
284 $mailCondition = ' AND `mail_id` = '.intval($action['mail_id']);
285 }
286 $nbRows = acym_query('DELETE FROM #__acym_queue WHERE `user_id` IN ('.$query->getQuery(['user.id']).')'.$mailCondition);
287
288 return acym_translationSprintf('ACYM_EMAILS_REMOVED_QUEUE', $nbRows);
289 }
290
291 public function onAcymProcessAction_resend_confirmation(&$query, &$action)
292 {
293 $mailClass = new MailClass();
294 $confirmationMail = $mailClass->getOneByName('acy_confirm');
295 $sendDate = acym_date('now', 'Y-m-d H:i:s', false);
296
297 $queryInsert = 'INSERT IGNORE INTO #__acym_queue (`mail_id`, `user_id`, `sending_date`, `priority`, `try`) ';
298 $queryInsert .= '('.$query->getQuery(
299 [
300 intval($confirmationMail->id),
301 'user.id',
302 acym_escapeDB($sendDate),
303 '1',
304 '0',
305 ]
306 ).')';
307 $nbInserted = acym_query($queryInsert);
308
309 if (is_numeric($nbInserted)) {
310 return acym_translationSprintf('ACYM_EMAILS_ADDED_QUEUE', $nbInserted);
311 } else {
312 return $nbInserted;
313 }
314 }
315
316 public function onAcymDeclareSummary_actions(&$automationAction)
317 {
318 if (!empty($automationAction['acy_user'])) {
319 $userActions = [
320 'confirm' => acym_translation('ACYM_WILL_CONFIRM'),
321 'unconfirm' => acym_translation('ACYM_WILL_UNCONFIRM'),
322 'active' => acym_translation('ACYM_WILL_ACTIVE'),
323 'block' => acym_translation('ACYM_WILL_BLOCK'),
324 'delete' => acym_translation('ACYM_WILL_DELETE'),
325 ];
326 $automationAction = $userActions[$automationAction['acy_user']['action']];
327 }
328
329 if (!empty($automationAction['acy_user_value'])) {
330 $usersColumns = acym_getColumns('user');
331
332 if (!in_array($automationAction['acy_user_value']['field'], $usersColumns)) {
333 $fieldClass = new FieldClass();
334 $field = $fieldClass->getOneById($automationAction['acy_user_value']['field']);
335 $automationAction['acy_user_value']['field'] = $field->name;
336 }
337 $automationAction = acym_translationSprintf(
338 'ACYM_ACTION_USER_VALUE_SUMMARY',
339 $automationAction['acy_user_value']['field'],
340 $automationAction['acy_user_value']['operator'],
341 $automationAction['acy_user_value']['value']
342 );
343 }
344
345 if (!empty($automationAction['acy_add_queue'])) {
346 $mailClass = new MailClass();
347 $mail = $mailClass->getOneById($automationAction['acy_add_queue']['mail_id']);
348 if (empty($mail)) {
349 $automationAction = '<span class="acym__color__red">'.acym_translation('ACYM_SELECT_AN_EMAIL').'</span>';
350 } else {
351 $queueTime = empty($automationAction['acy_add_queue']['time']) ? '[time]' : $automationAction['acy_add_queue']['time'];
352 $automationAction = acym_translationSprintf(
353 'ACYM_ACTION_ADD_QUEUE_SUMMARY',
354 $mail->name,
355 acym_date(acym_replaceDate($queueTime), 'd M Y H:i')
356 );
357 }
358 }
359
360 if (!empty($automationAction['acy_remove_queue'])) {
361 $mailClass = new MailClass();
362 $mail = $mailClass->getOneById($automationAction['acy_remove_queue']['mail_id']);
363 if (empty($mail)) {
364 if ($automationAction['acy_remove_queue']['mail_id'] == -1) {
365 $automationAction = acym_translation('ACYM_EMPTY_QUEUE_USER');
366 } else {
367 $automationAction = '<span class="acym__color__red">'.acym_translation('ACYM_SELECT_AN_EMAIL').'</span>';
368 }
369 } else {
370 $automationAction = acym_translationSprintf('ACYM_ACTION_REMOVE_QUEUE_SUMMARY', $mail->name);
371 }
372 }
373
374 if (!empty($automationAction['resend_confirmation'])) {
375 $automationAction = acym_translation('ACYM_RESEND_CONFIRMATION_SUMMARY');
376 }
377 }
378 }
379