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
acymailing / back / dynamics / subscriber / SubscriberAutomationActions.php

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

384 lines 14.4 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 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 }
384