PluginProbe
AcyMailing – An Ultimate Newsletter Plugin and Marketing Automation Solution for WordPress / trunk
AcyMailing – An Ultimate Newsletter Plugin and Marketing Automation Solution for WordPress vtrunk
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 10.3.0 10.4.0 All 60 releases
acymailing / back / dynamics / statistics / StatisticsAutomationFilters.php

StatisticsAutomationFilters.php in AcyMailing – An Ultimate Newsletter Plugin and Marketing Automation Solution for WordPress trunk, at back/dynamics/statistics/StatisticsAutomationFilters.php

347 lines 15.8 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\MailClass;
4 use AcyMailing\Types\DelayType;
5
6 trait StatisticsAutomationFilters
7 {
8 public function searchMail()
9 {
10 $mailClass = new MailClass();
11 $id = acym_getVar('int', 'id');
12 if (!empty($id)) {
13 $mail = acym_loadObject(
14 'SELECT mail.`name`, campaign.`id` AS campaignId, mail.`id`
15 FROM #__acym_mail AS mail
16 LEFT JOIN #__acym_campaign AS campaign ON mail.`id` = campaign.`mail_id`
17 WHERE mail.`id` = '.intval($id)
18 );
19 if (empty($mail)) {
20 $name = '';
21 $id = 0;
22 } else {
23 $mail = $mailClass->decode($mail);
24 $name = $mail->name;
25 if (!empty($mail->campaignId)) {
26 $name .= ' ['.acym_translation('ACYM_ID').' '.$mail->campaignId.']';
27 }
28 $id = $mail->id;
29 }
30
31 echo json_encode(['text' => $name, 'value' => $id]);
32 exit;
33 }
34
35 $return = [];
36 $search = acym_getVar('string', 'search', '');
37 $search = acym_utf8Encode($search);
38
39 $mails = acym_loadObjectList(
40 'SELECT mail.`id`, mail.`name`, mail.`subject`, mail.`type`, campaign.`id` AS campaignId
41 FROM #__acym_mail AS mail
42 LEFT JOIN #__acym_campaign AS campaign ON mail.`id` = campaign.`mail_id`
43 WHERE (mail.`subject` LIKE '.acym_escapeDB('%'.$search.'%').' OR mail.`name` LIKE '.acym_escapeDB('%'.$search.'%').')
44 AND mail.`type` != '.acym_escapeDB(MailClass::TYPE_TEMPLATE).'
45 ORDER BY mail.`name` ASC'
46 );
47
48 $mails = $mailClass->decode($mails);
49
50 foreach ($mails as $oneMail) {
51 $name = in_array($oneMail->type, MailClass::TYPES_NO_NAME) ? $oneMail->subject : $oneMail->name;
52 $campaignId = empty($oneMail->campaignId) ? '' : ' ['.acym_translation('ACYM_ID').' '.$oneMail->campaignId.']';
53 $return[] = [$oneMail->id, $name.$campaignId];
54 }
55
56 echo json_encode($return);
57 exit;
58 }
59
60 public function searchUrl()
61 {
62 $idMail = acym_getVar('int', 'mailId');
63
64 if (!empty($idMail)) {
65 $urls = acym_loadObjectList(
66 'SELECT DISTINCT(`urlClick`.`url_id`),`url`.`name` FROM #__acym_url AS url
67 JOIN #__acym_url_click AS `urlClick` ON `url`.`id` = `urlClick`.`url_id`
68 WHERE `urlClick`.`mail_id` = '.intval($idMail)
69 );
70
71 $oneUrl = new stdClass();
72 $oneUrl->name = acym_translation('ACYM_ANY_URL');
73 $oneUrl->url_id = -1;
74
75 //to set ACYM_ANY_URL first
76 $urls = array_merge([$oneUrl], $urls);
77
78 echo json_encode($urls);
79 exit;
80 }
81 }
82
83 public function onAcymDeclareFilters(array &$filters): void
84 {
85 $status = [
86 acym_selectOption('opened', 'ACYM_OPENED'),
87 acym_selectOption('notopen', 'ACYM_NOTOPEN'),
88 acym_selectOption('failed', 'ACYM_FAILED'),
89 acym_selectOption('sent', 'ACYM_SENT'),
90 acym_selectOption('notsent', 'ACYM_NOTSENT'),
91 acym_selectOption('bounced', 'ACYM_BOUNCED'),
92 acym_selectOption('click_on_url', 'ACYM_CLICKED_ON_LINK'),
93 acym_selectOption('no_click_on_url', 'ACYM_NOT_CLICKED_ON_LINK'),
94 acym_selectOption('neveropen', 'ACYM_NEVER_OPEN'),
95 acym_selectOption('neverclicked', 'ACYM_NEVER_CLICKED'),
96 acym_selectOption('neversent', 'ACYM_NEVER_SENT'),
97 ];
98
99 $filters['statistics'] = new stdClass();
100 $filters['statistics']->name = acym_translation('ACYM_STATISTICS');
101 $filters['statistics']->option = '<div class="intext_select_automation cell">';
102 $filters['statistics']->option .= acym_select(
103 $status,
104 'acym_action[filters][__numor__][__numand__][statistics][status]',
105 'open',
106 [
107 'class' => 'intext_select_automation acym__select',
108 'data-acym-toggle-filter' => json_encode(
109 [
110 [
111 'class' => 'acym__filter__stats_time',
112 'values' => ['opened', 'notopen'],
113 ],
114 [
115 'class' => 'acym__filter__stats_url',
116 'values' => ['click_on_url', 'no_click_on_url'],
117 ],
118 [
119 'class' => 'acym__filter__stats_mail',
120 'values' => ['opened', 'notopen', 'failed', 'sent', 'notsent', 'bounced', 'click_on_url', 'no_click_on_url'],
121 ],
122 ]
123 ),
124 ]
125 );
126 $filters['statistics']->option .= '</div>';
127
128 $onchange = "
129 if (this.options[this.selectedIndex] !== undefined) {
130 let mailId = this.options[this.selectedIndex].value;
131 let ajaxUrl = ACYM_AJAX_URL + '&ctrl=dynamics&task=trigger&plugin=plgAcymStatistics&trigger=searchUrl&mailId=' + mailId;
132 let urlSelect = jQuery(this).parent().parent().find('.acym__select_url');
133
134 let filters;
135 let or;
136 let and;
137 let urlId = null;
138 if (jQuery('#acym__segments__filters').val() !== undefined && jQuery('#acym__segments__filters').val() !== '') {
139 filters = JSON.parse(jQuery('#acym__segments__filters').val());
140 and = jQuery(this).closest('.acym__segments__inserted__filter').attr('data-and');
141 or = jQuery(this).closest('[data-filter-number]').attr('data-filter-number');
142 } else if (jQuery('#filters').val() !== undefined) {
143 filters = JSON.parse(jQuery('#filters').val());
144 or = urlSelect.closest('.acym__automation__group__filter').attr('data-filter-number');
145 and = urlSelect.closest('.acym__automation__inserted__filter').attr('data-and');
146 }
147 if (filters !== undefined && filters[or] !== undefined && filters[or][and] !== undefined) urlId = filters[or][and].statistics.urlId;
148
149 urlSelect.empty();
150 jQuery.get(ajaxUrl, function (response) {
151 response = acym_helper.parseJson(response);
152 if (response.length === undefined) return;
153 response.forEach(url => {
154 let option = document.createElement('option');
155 option.value = url.url_id;
156 option.text = url.name;
157 option.selected = url.url_id == urlId;
158 urlSelect.append(option);
159 });
160 urlSelect.trigger('change');
161 });
162 }";
163
164 $filters['statistics']->option .= '<div class="intext_select_automation cell acym__filter__stats_mail">';
165 $filters['statistics']->option .= acym_select(
166 [],
167 'acym_action[filters][__numor__][__numand__][statistics][mail]',
168 null,
169 [
170 'class' => 'acym__select acym_select2_ajax',
171 'data-placeholder' => acym_translation('ACYM_SELECT_AN_EMAIL'),
172 'data-params' => [
173 'plugin' => __CLASS__,
174 'trigger' => 'searchMail',
175 ],
176 'onchange' => $onchange,
177 ]
178 );
179 $filters['statistics']->option .= '</div>';
180
181 $filters['statistics']->option .= '<div class="intext_select_automation cell acym__filter__stats_url">';
182 $filters['statistics']->option .= acym_select(
183 [],
184 'acym_action[filters][__numor__][__numand__][statistics][urlId]',
185 null,
186 [
187 'class' => 'intext_select_automation acym__select acym__select_url',
188 'data-placeholder' => acym_translation('ACYM_ANY_URL'),
189 ]
190 );
191 $filters['statistics']->option .= '</div>';
192
193 $delayType = new DelayType();
194 ob_start();
195 $delayType->display(
196 '[filters][__numor__][__numand__][statistics][time]',
197 1,
198 DelayType::TYPE_HOURS_DAYS_WEEKS_MONTHS
199 );
200 $delay = ob_get_clean();
201 ob_start();
202 acym_info(['textShownInTooltip' => 'ACYM_IF_SET_0_NO_CONDITION_ON_TIME']);
203 $tooltip = ob_get_clean();
204
205 $filters['statistics']->option .= '<div style="display: none" class="cell grid-x acym__filter__stats_time acym_vcenter">
206 <p class="cell margin-bottom-1">'.esc_html(acym_translation('ACYM_ADVANCED_OPTIONS')).':'.$tooltip.' </p>
207 '.acym_translationSprintf('ACYM_X_AFTER_MAIL_SENT', $delay).'</div>';
208 }
209
210 public function onAcymProcessFilterCount_statistics(&$query, $options, $num)
211 {
212 $this->onAcymProcessFilter_statistics($query, $options, $num);
213
214 return acym_translationSprintf('ACYM_SELECTED_USERS', $query->count());
215 }
216
217 public function onAcymProcessFilter_statistics(&$query, $options, $num)
218 {
219 $alias = '`stats'.$num.'`';
220 $urlClickAlias = '`urlClick'.$num.'`';
221 $userStats = '`userStats'.$num.'`';
222
223 if (empty($options['mail'])) {
224 if (!empty($options['status'])) {
225 switch ($options['status']) {
226 case 'neveropen':
227 $query->join[] = '(SELECT user_id , SUM(open) AS sumOpen FROM #__acym_user_stat GROUP BY user_id) AS '.$alias.' ON user.id = '.$alias.'.user_id AND '.$alias.'.sumOpen = 0';
228 break;
229 case 'neverclicked':
230 $query->leftjoin[] = '#__acym_url_click AS '.$urlClickAlias.' ON user.id = '.$urlClickAlias.'.user_id';
231 $query->where[] = $urlClickAlias.'.user_id IS NULL';
232 break;
233 case 'neversent':
234 $query->leftjoin[] = '#__acym_user_stat AS '.$alias.' ON user.id = '.$alias.'.user_id';
235 $query->where[] = $alias.'.user_id IS NULL';
236 break;
237 }
238 } else {
239 acym_enqueueMessage(acym_translation('ACYM_EMAIL_NOT_FOUND'), 'warning');
240 }
241
242 return;
243 }
244
245 if (empty($options['status']) || !in_array($options['status'], ['opened', 'notopen', 'failed', 'bounced', 'notsent', 'sent', 'click_on_url', 'no_click_on_url'])) {
246 acym_enqueueMessage(acym_translationSprintf('ACYM_UNKNOWN_OPERATOR', $options['status']), 'warning');
247
248 return;
249 }
250
251 if ($options['status'] == 'click_on_url') {
252 $query->join[] = '#__acym_url_click AS '.$urlClickAlias.' ON `user`.`id` = '.$urlClickAlias.'.`user_id` AND '.$urlClickAlias.'.`mail_id` = '.intval($options['mail']);
253 } elseif ($options['status'] == 'no_click_on_url') {
254 $query->join[] = '#__acym_user_stat AS '.$userStats.' ON user.id = '.$userStats.'.`user_id` AND '.$userStats.'.`mail_id` = '.intval($options['mail']);
255 $leftjoin = '#__acym_url_click AS '.$urlClickAlias.' ON `user`.`id` = '.$urlClickAlias.'.`user_id` AND '.$urlClickAlias.'.`mail_id` = '.intval($options['mail']);
256 if ($options['urlId'] != '-1') {
257 $leftjoin .= ' AND '.$urlClickAlias.'.`url_id` = '.intval($options['urlId']);
258 }
259 $query->leftjoin[] = $leftjoin;
260 } else {
261 $query->leftjoin[] = '#__acym_user_stat AS '.$alias.' ON '.$alias.'.`user_id` = `user`.`id` AND '.$alias.'.`mail_id` = '.intval($options['mail']);
262 }
263
264 if ($options['status'] == 'opened') {
265 $where = $alias.'.`open` > 0';
266 } elseif ($options['status'] == 'notopen' && !empty($options['time'])) {
267 $where = $alias.'.`open` = 0 OR '.$alias.'.`user_id` IS NULL';
268 } elseif ($options['status'] == 'failed') {
269 $where = $alias.'.`fail` > 0';
270 } elseif ($options['status'] == 'bounced') {
271 $where = $alias.'.`bounce` > 0';
272 } elseif ($options['status'] == 'notsent') {
273 $where = $alias.'.`user_id` IS NULL';
274 } elseif ($options['status'] == 'sent') {
275 $where = $alias.'.`user_id` IS NOT NULL';
276 } elseif ($options['status'] == 'click_on_url' && !empty($options['urlId']) && $options['urlId'] != -1) {
277 $where = $urlClickAlias.'.`url_id` = '.intval($options['urlId']);
278 } elseif ($options['status'] == 'no_click_on_url') {
279 $where = $urlClickAlias.'.`url_id` IS NULL';
280 }
281
282 if (!empty($where)) $query->where[] = $where;
283
284 if (!empty($options['time']) && in_array($options['status'], ['opened', 'notopen'])) {
285 if ($options['status'] === 'notopen') {
286 $query->where[] = $alias.'.open_date IS NULL OR '.$alias.'.open_date >= DATE_ADD('.$alias.'.send_date, INTERVAL '.intval($options['time']).' SECOND)';
287 } else {
288 $query->where[] = $alias.'.open_date <= DATE_ADD('.$alias.'.send_date, INTERVAL '.intval($options['time']).' SECOND)';
289 }
290 $query->where[] = $alias.'.`user_id` IS NOT NULL';
291 }
292 }
293
294 public function onAcymDeclareSummary_filters(&$automationFilter)
295 {
296 foreach (['statistics'] as $filterName) {
297 if (empty($automationFilter[$filterName])) continue;
298 $status = acym_translation('ACYM_'.strtoupper($automationFilter[$filterName]['status']));
299
300 if ($status == 'ACYM_NEVEROPEN') {
301 $automationFilter = acym_translation('ACYM_NEVER_OPEN_SUMMARY');
302 } elseif ($status == 'ACYM_NEVERCLICKED') {
303 $automationFilter = acym_translation('ACYM_NEVER_CLICKED_SUMMARY');
304 } elseif ($status == 'ACYM_NEVERSENT') {
305 $automationFilter = acym_translation('ACYM_NEVER_SENT_SUMMARY');
306 } else {
307 $delayType = new DelayType();
308 $time = empty($automationFilter[$filterName]['time']) ? '' : $delayType->get($automationFilter[$filterName]['time'], DelayType::TYPE_HOURS_DAYS_WEEKS_MONTHS);
309
310 $mailClass = new MailClass();
311 $mail = $mailClass->getOneById(empty($automationFilter[$filterName]['mail']) ? 0 : $automationFilter[$filterName]['mail']);
312 if (empty($mail)) {
313 $automationFilter = acym_translationSprintf('ACYM_NOT_FOUND', acym_translation('ACYM_MAIL'));
314 } elseif ($time) {
315 $automationFilter = acym_translationSprintf(
316 'ACYM_FILTER_STATISTICS_OPEN_TIME_SUMMARY',
317 $status,
318 $mail->subject,
319 $mail->id,
320 $time->value.' '.strtolower($time->typeText)
321 );
322 } else {
323 $action = acym_translation('ACYM_STATUS');
324 if (!empty($automationFilter[$filterName]['urlId'])) {
325 if ($status == 'ACYM_NO_CLICK_ON_URL') {
326 $action = strtolower(acym_translation('ACYM_NOT_CLICKED'));
327 } else {
328 $action = strtolower(acym_translation('ACYM_CLICKED'));
329 }
330 if ($automationFilter[$filterName]['urlId'] != -1) {
331 $url = acym_loadObject(
332 'SELECT `url`.`name`
333 FROM #__acym_url AS `url`
334 WHERE `url`.`id` = '.intval($automationFilter[$filterName]['urlId'])
335 );
336 $status = $url->name;
337 } else {
338 $status = strtolower(acym_translation('ACYM_ANY_URL'));
339 }
340 }
341 $automationFilter = acym_translationSprintf('ACYM_FILTER_STATISTICS_SUMMARY', $action, $status, $mail->subject, $mail->id);
342 }
343 }
344 }
345 }
346 }
347