PluginProbe
AcyMailing – An Ultimate Newsletter Plugin and Marketing Automation Solution for WordPress / 10.11.1
AcyMailing – An Ultimate Newsletter Plugin and Marketing Automation Solution for WordPress v10.11.1
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 10.11.1, at back/dynamics/subscriber/SubscriberAutomationActions.php

409 lines 16.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 public function searchEmails()
11 {
12 $id = acym_getVar('int', 'id');
13 if (!empty($id)) {
14 if ($id == -1) {
15 $name = acym_translation('ACYM_ALL_MAILS');
16 } else {
17 $name = acym_loadResult(
18 'SELECT name
19 FROM #__acym_mail
20 WHERE id = '.intval($id)
21 );
22 $name = empty($name) ? '' : acym_utf8Decode($name);
23 }
24 echo json_encode(['value' => $name]);
25 exit;
26 }
27
28 $return = [];
29 $return[] = [-1, acym_translation('ACYM_ALL_MAILS')];
30 $search = acym_utf8Encode(acym_getVar('string', 'search', ''));
31 $elements = acym_loadObjectList(
32 'SELECT `id`, `subject`, `name`
33 FROM #__acym_mail
34 WHERE (`subject` LIKE '.acym_escapeDB('%'.$search.'%').'
35 OR `name` LIKE '.acym_escapeDB('%'.$search.'%').')
36 AND `type` != '.acym_escapeDB(MailClass::TYPE_NOTIFICATION).'
37 ORDER BY `subject` ASC
38 LIMIT 20'
39 );
40
41 foreach ($elements as $oneElement) {
42 $return[] = [$oneElement->id, $oneElement->name];
43 }
44
45 echo json_encode($return);
46 exit;
47 }
48
49 public function onAcymDeclareActions(array &$actions): void
50 {
51 $userActions = [
52 'confirm' => acym_translation('ACYM_CONFIRM_USER'),
53 'unconfirm' => acym_translation('ACYM_UNCONFIRM_USER'),
54 'active' => acym_translation('ACYM_ACTIVE_USER'),
55 'block' => acym_translation('ACYM_BLOCK_USER'),
56 'delete' => acym_translation('ACYM_DELETE_USER'),
57 ];
58
59 $actions['acy_user'] = new stdClass();
60 $actions['acy_user']->name = acym_translation('ACYM_ACTION_ON_USERS');
61
62 ob_start();
63 include acym_getPartial('actions', 'acy_user');
64 $actions['acy_user']->option = ob_get_clean();
65
66 $userClass = new UserClass();
67 $userFields = $userClass->getAllColumnsUserAndCustomField(true);
68 unset($userFields['id']);
69 unset($userFields['cms_id']);
70 unset($userFields['key']);
71 unset($userFields['active']);
72 unset($userFields['source']);
73 unset($userFields['confirmed']);
74 unset($userFields['automation']);
75 unset($userFields['creation_date']);
76
77 $userOperator = [
78 '=' => '=',
79 '-' => '-',
80 '+' => '+',
81 'add_end' => acym_translation('ACYM_ADD_AT_END'),
82 'add_begin' => acym_translation('ACYM_ADD_AT_BEGINNING'),
83 ];
84
85 $fieldClass = new FieldClass();
86 $customFields = $fieldClass->getAllFieldsForUser();
87 $customFieldValues = [];
88 foreach ($customFields as $field) {
89 if (in_array($field->type, ['single_dropdown', 'radio', 'checkbox', 'multiple_dropdown']) && !empty($field->value)) {
90 $values = [];
91 $field->value = json_decode($field->value, true);
92 foreach ($field->value as $value) {
93 $valueTmp = new stdClass();
94 $valueTmp->text = $value['title'];
95 $valueTmp->value = $value['value'];
96 if ($value['disabled'] == 'y') $valueTmp->disable = true;
97 $values[$value['value']] = $valueTmp;
98 }
99 $customFieldValues[$field->id] = '<div class="acym__automation__one-field intext_select_automation cell" style="display: none">';
100 $customFieldValues[$field->id] .= acym_select(
101 $values,
102 '[actions][__and__][acy_user_value][value]',
103 null,
104 [
105 'class' => 'acym__select acym__automation__actions__fields__select',
106 'data-action-field' => $field->id,
107 ]
108 );
109 $customFieldValues[$field->id] .= '</div>';
110 } elseif ('date' == $field->type) {
111 $customFieldValues[$field->id] = acym_tooltip(
112 [
113 'hoveredText' => '<input class="acym__automation__one-field acym__automation__actions__fields__select intext_input_automation cell"
114 type="text"
115 name="[actions][__and__][acy_user_value][value]"
116 style="display: none"
117 data-action-field="'.intval($field->id).'">',
118 'textShownInTooltip' => acym_translation('ACYM_DATE_FORMAT_FILTER'),
119 'classContainer' => 'intext_select_automation cell',
120 ]
121 );
122 }
123 }
124
125 $actions['acy_user_value'] = new stdClass();
126 $actions['acy_user_value']->name = acym_translation('ACYM_SET_USER_VALUE');
127 ob_start();
128 include acym_getPartial('actions', 'acy_user_value');
129 $actions['acy_user_value']->option = ob_get_clean();
130
131 $actions['acy_add_queue'] = new stdClass();
132 $actions['acy_add_queue']->name = acym_translation('ACYM_ADD_EMAIL_QUEUE');
133 ob_start();
134 include acym_getPartial('actions', 'acy_add_queue');
135 $actions['acy_add_queue']->option = ob_get_clean();
136
137 $actions['acy_send_email'] = new stdClass();
138 $actions['acy_send_email']->name = acym_translation('ACYM_SEND_EMAIL');
139 ob_start();
140 include acym_getPartial('actions', 'acy_send_email');
141 $actions['acy_send_email']->option = ob_get_clean();
142
143 $actions['acy_remove_queue'] = new stdClass();
144 $actions['acy_remove_queue']->name = acym_translation('ACYM_REMOVE_EMAIL_QUEUE');
145 $ajaxParams = [
146 'plugin' => __CLASS__,
147 'trigger' => 'searchEmails',
148 ];
149 ob_start();
150 include acym_getPartial('actions', 'acy_remove_queue');
151 $actions['acy_remove_queue']->option = ob_get_clean();
152
153 if ($this->config->get('require_confirmation', '1') === '1') {
154 $actions['resend_confirmation'] = new stdClass();
155 $actions['resend_confirmation']->name = acym_translation('ACYM_RESEND_CONFIRMATION');
156 $actions['resend_confirmation']->option = '<input type="hidden" name="acym_action[actions][__and__][resend_confirmation][save]" />';
157 }
158 }
159
160 public function onAcymDeclareActionsScenario(array &$actions): void
161 {
162 $this->onAcymDeclareActions($actions);
163
164 unset($actions['acy_add_queue']);
165 }
166
167 public function onAcymProcessAction_acy_user(&$query, $action)
168 {
169 if ($action['action'] == 'delete') {
170 $userClass = new UserClass();
171 $usersToDelete = acym_loadResultArray($query->getQuery(['user.id']));
172 if (!empty($usersToDelete)) $userClass->delete($usersToDelete, true);
173 } else {
174 $fieldToUpdate = '';
175 if ($action['action'] === 'confirm') $fieldToUpdate = 'confirmed = 1';
176 if ($action['action'] === 'unconfirm') $fieldToUpdate = 'confirmed = 0';
177 if ($action['action'] === 'active') $fieldToUpdate = 'active = 1, deactivation_date = NULL';
178 if ($action['action'] === 'block') $fieldToUpdate = 'active = 0, deactivation_date = UTC_TIMESTAMP()';
179
180
181 $queryToProcess = 'UPDATE #__acym_user AS `user` SET '.$fieldToUpdate.' WHERE ('.implode(') AND (', $query->where).')';
182 $nbRows = acym_query($queryToProcess);
183
184 return acym_translationSprintf('ACYM_X_USERS_X', $nbRows, acym_translation('ACYM_ACTION_'.strtoupper($action['action'])));
185 }
186 }
187
188 public function onAcymProcessAction_acy_user_value(&$query, $action)
189 {
190 $value = $action['value'];
191 $value = acym_replaceDateTags($value);
192
193 if (empty($action['operator'])) $action['operator'] = '=';
194
195 $usersColumns = acym_getColumns('user');
196
197 if (in_array($action['field'], $usersColumns)) {
198 $execute = 'UPDATE #__acym_user AS user';
199
200 $column = 'user.`'.acym_secureDBColumn($action['field']).'`';
201 } else {
202 $fieldClass = new FieldClass();
203 $field = $fieldClass->getOneById($action['field']);
204 if (empty($field)) {
205 return 'Unknown field: '.$action['field'];
206 }
207
208 $allColumn = '`user_id`, `field_id`, `value`';
209 $column = '`value`';
210 }
211
212 if ($action['operator'] === '=') {
213 $newValue = acym_escapeDB($value);
214 } elseif (in_array($action['operator'], ['+', '-'])) {
215 $newValue = $column.' '.$action['operator'].' '.intval($value);
216 } elseif ($action['operator'] === 'add_end') {
217 $newValue = 'CONCAT('.$column.', '.acym_escapeDB($value).')';
218 } elseif ($action['operator'] === 'add_begin') {
219 $newValue = 'CONCAT('.acym_escapeDB($value).', '.$column.')';
220 } else {
221 return 'Unknown operator: '.acym_escape($action['operator']);
222 }
223
224 if (in_array($action['field'], $usersColumns)) {
225 $execute .= ' SET '.$column.' = '.$newValue;
226 if (!empty($query->where)) $execute .= ' WHERE ('.implode(') AND (', $query->where).')';
227 } else {
228 $customFieldAlreadyExists = acym_loadResult('SELECT COUNT(user_id) FROM #__acym_user_has_field WHERE field_id = '.intval($action['field']));
229 $execute = 'INSERT INTO #__acym_user_has_field ('.$allColumn.') SELECT id AS user_id, '.intval(
230 $action['field']
231 ).' AS field_id, '.$newValue.' AS value FROM #__acym_user AS user WHERE ('.implode(
232 ') AND (',
233 $query->where
234 ).') ON DUPLICATE KEY UPDATE '.$column.' = VALUES('.$column.')';
235 }
236
237 $nbAffected = acym_query($execute);
238
239 if (!empty($customFieldAlreadyExists)) {
240 $nbAffected -= $customFieldAlreadyExists;
241 }
242
243 return acym_translationSprintf('ACYM_UPDATED_USERS', $nbAffected);
244 }
245
246 public function onAcymProcessAction_acy_send_email(&$query, &$action)
247 {
248 if (empty($action['mail_id'])) {
249 return acym_translation('ACYM_NO_MAIL_SET');
250 }
251
252 $mailerHelper = new MailerHelper();
253
254 $userIds = acym_loadResultArray($query->getQuery(['user.id']));
255 if (empty($userIds)) {
256 return acym_translation('ACYM_NO_USER_FOUND');
257 }
258
259 $errors = [];
260
261 foreach ($userIds as $userId) {
262 try {
263 $mailSent = $mailerHelper->sendOne($action['mail_id'], $userId);
264
265 if (!$mailSent) {
266 $errors[] = acym_translationSprintf('ACYM_COULD_NOT_SEND_EMAIL_TO_USER_X', $userId);
267 acym_logError('Error while sending email', 'action_acy_send_email');
268 }
269 } catch (Exception $e) {
270 $errors[] = acym_translationSprintf('ACYM_COULD_NOT_SEND_EMAIL_TO_USER_X_ERROR_X', $userId, $e->getMessage());
271 }
272 }
273
274 return empty($errors) ? acym_translation('ACYM_EMAILS_SENT') : implode('<br>', $errors);
275 }
276
277 public function onAcymProcessAction_acy_add_queue(&$query, &$action, $automationAdmin)
278 {
279 if (empty($action['time']) || empty($action['mail_id'])) return '';
280
281 $sendDate = acym_replaceDate($action['time']);
282 $sendDate = acym_date($sendDate, 'Y-m-d H:i:s', false);
283 $mailClass = new MailClass();
284
285 $mail = $mailClass->getOneById($action['mail_id']);
286
287 if (empty($mail)) return '';
288
289 if (MailClass::TYPE_AUTOMATION !== $mail->type) {
290 unset($mail->id);
291 $mail->type = MailClass::TYPE_AUTOMATION;
292 $mail->id = $mailClass->save($mail);
293 }
294
295 $userIds = acym_loadResultArray($query->getQuery(['user.id']));
296 if (empty($userIds)) {
297 $result = 0;
298 } else {
299 $result = $mailClass->sendAutomation($mail->id, $userIds, $sendDate, $automationAdmin);
300 }
301
302 if (is_numeric($result)) {
303 return acym_translationSprintf('ACYM_EMAILS_ADDED_QUEUE', $result);
304 } else {
305 return $result;
306 }
307 }
308
309 public function onAcymProcessAction_acy_remove_queue(&$query, $action)
310 {
311 if (empty($action['mail_id'])) return '';
312
313 $mailCondition = '';
314 if ($action['mail_id'] != -1) {
315 $mailCondition = ' AND `mail_id` = '.intval($action['mail_id']);
316 }
317 $nbRows = acym_query('DELETE FROM #__acym_queue WHERE `user_id` IN ('.$query->getQuery(['user.id']).')'.$mailCondition);
318
319 return acym_translationSprintf('ACYM_EMAILS_REMOVED_QUEUE', $nbRows);
320 }
321
322 public function onAcymProcessAction_resend_confirmation(&$query, &$action)
323 {
324 $mailClass = new MailClass();
325 $confirmationMail = $mailClass->getOneByName('acy_confirm');
326 $sendDate = acym_date('now', 'Y-m-d H:i:s', false);
327
328 $queryInsert = 'INSERT IGNORE INTO #__acym_queue (`mail_id`, `user_id`, `sending_date`, `priority`, `try`) ';
329 $queryInsert .= '('.$query->getQuery(
330 [
331 intval($confirmationMail->id),
332 'user.id',
333 acym_escapeDB($sendDate),
334 '1',
335 '0',
336 ]
337 ).')';
338 $nbInserted = acym_query($queryInsert);
339
340 if (is_numeric($nbInserted)) {
341 return acym_translationSprintf('ACYM_EMAILS_ADDED_QUEUE', $nbInserted);
342 } else {
343 return $nbInserted;
344 }
345 }
346
347 public function onAcymDeclareSummary_actions(&$automationAction)
348 {
349 if (!empty($automationAction['acy_user'])) {
350 $userActions = [
351 'confirm' => acym_translation('ACYM_WILL_CONFIRM'),
352 'unconfirm' => acym_translation('ACYM_WILL_UNCONFIRM'),
353 'active' => acym_translation('ACYM_WILL_ACTIVE'),
354 'block' => acym_translation('ACYM_WILL_BLOCK'),
355 'delete' => acym_translation('ACYM_WILL_DELETE'),
356 ];
357 $automationAction = $userActions[$automationAction['acy_user']['action']];
358 }
359
360 if (!empty($automationAction['acy_user_value'])) {
361 $usersColumns = acym_getColumns('user');
362
363 if (!in_array($automationAction['acy_user_value']['field'], $usersColumns)) {
364 $fieldClass = new FieldClass();
365 $field = $fieldClass->getOneById($automationAction['acy_user_value']['field']);
366 $automationAction['acy_user_value']['field'] = $field->name;
367 }
368 $automationAction = acym_translationSprintf(
369 'ACYM_ACTION_USER_VALUE_SUMMARY',
370 $automationAction['acy_user_value']['field'],
371 $automationAction['acy_user_value']['operator'],
372 $automationAction['acy_user_value']['value']
373 );
374 }
375
376 if (!empty($automationAction['acy_add_queue'])) {
377 $mailClass = new MailClass();
378 $mail = $mailClass->getOneById($automationAction['acy_add_queue']['mail_id']);
379 if (empty($mail)) {
380 $automationAction = '<span class="acym__color__red">'.acym_translation('ACYM_SELECT_AN_EMAIL').'</span>';
381 } else {
382 $automationAction = acym_translationSprintf(
383 'ACYM_ACTION_ADD_QUEUE_SUMMARY',
384 $mail->name,
385 acym_date(acym_replaceDate($automationAction['acy_add_queue']['time']), 'd M Y H:i')
386 );
387 }
388 }
389
390 if (!empty($automationAction['acy_remove_queue'])) {
391 $mailClass = new MailClass();
392 $mail = $mailClass->getOneById($automationAction['acy_remove_queue']['mail_id']);
393 if (empty($mail)) {
394 if ($automationAction['acy_remove_queue']['mail_id'] == -1) {
395 $automationAction = acym_translation('ACYM_EMPTY_QUEUE_USER');
396 } else {
397 $automationAction = '<span class="acym__color__red">'.acym_translation('ACYM_SELECT_AN_EMAIL').'</span>';
398 }
399 } else {
400 $automationAction = acym_translationSprintf('ACYM_ACTION_REMOVE_QUEUE_SUMMARY', $mail->name);
401 }
402 }
403
404 if (!empty($automationAction['resend_confirmation'])) {
405 $automationAction = acym_translation('ACYM_RESEND_CONFIRMATION_SUMMARY');
406 }
407 }
408 }
409