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 / Helpers / HeaderHelper.php

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

451 lines 17.7 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 namespace AcyMailing\Helpers;
4
5 use AcyMailing\Core\AcymObject;
6
7 class HeaderHelper extends AcymObject
8 {
9 public function display(array $breadcrumb): void
10 {
11 $this->displayLastNews();
12
13 echo '<div id="acym_header" class="grid-x margin-bottom-1">';
14 echo '<div class="cell large-6 xlarge-7 xxlarge-8 grid-x acym_vcenter">';
15 $this->displayBreadcrumb($breadcrumb);
16 echo '</div>';
17
18 echo '<div class="cell large-6 xlarge-5 xxlarge-4 grid-x">';
19
20 echo '<div id="checkVersionArea" class="cell auto grid-x align-right acym_vcenter">';
21 $this->displayVersionArea();
22 echo '</div>';
23
24 echo '<div class="cell shrink grid-x align-right acym_vcenter">';
25 $this->displayCheckVersionButton();
26 $this->displayHelpWedButton();
27 $this->displayDocumentationButton();
28 $this->displayNotificationCenter();
29 echo '</div>';
30
31 echo '</div>';
32 echo '</div>';
33 }
34
35 public function displayVersionArea(bool $reloading = false): void
36 {
37 $currentLevel = $this->config->get('level', '');
38 $currentVersion = $this->config->get('version', '');
39 $latestVersion = $this->config->get('latestversion', '');
40
41 echo '<div id="acym_level_version_area" class="text-right">';
42 echo '<div id="acym_level">'.esc_html(ACYM_NAME.' '.$currentLevel.' ');
43
44 if (version_compare($currentVersion, $latestVersion, '>=')) {
45 acym_tooltip(
46 [
47 'hoveredText' => '<span class="acym__color__green">'.esc_html($currentVersion).'</span>',
48 'textShownInTooltip' => acym_translation('ACYM_UP_TO_DATE'),
49 ]
50 );
51 } elseif (!empty($latestVersion)) {
52 if ('wordpress' === ACYM_CMS) {
53 $downloadLink = admin_url().'update-core.php';
54 } else {
55 $downloadLink = ACYM_ACYMAILING_WEBSITE.'account/license/" target="_blank';
56 }
57 acym_tooltip(
58 [
59 'hoveredText' => '<span class="acy_updateversion acym__color__red">'.esc_html($currentVersion).'</span>',
60 'textShownInTooltip' => acym_translationSprintf('ACYM_CLICK_UPDATE', $latestVersion),
61 'titleShownInTooltip' => acym_translation('ACYM_OLD_VERSION'),
62 'link' => $downloadLink,
63 ]
64 );
65 }
66
67 echo '</div></div>';
68
69 $expirationDate = $this->config->get('expirationdate', 0);
70 if ((empty($expirationDate) || $expirationDate == -1) && empty($this->config->get('acymailer_apikey', ''))) {
71 return;
72 }
73
74 echo '<div id="acym_expiration" class="cell">';
75 if (acym_level(ACYM_ESSENTIAL) && ACYM_PRODUCTION) {
76 if ($expirationDate == -2) {
77 echo '<div class="acylicence_expired">
78 <a class="acy_attachlicence acymbuttons acym__color__red acym_link_license_tab"
79 href="'.esc_url(acym_completeLink('configuration', false, false, true)).'">'.esc_html(acym_translation('ACYM_ATTACH_LICENCE')).'</a>
80 </div>';
81 } elseif ($expirationDate < time()) {
82 //TODO redirect to the subscription page directly instead of the subscriptions listing
83 // We'll need to return the subscription id when calling the API
84 acym_tooltip(
85 [
86 'hoveredText' => '<span class="acy_subscriptionexpired acym__color__red">'.esc_html(acym_translation('ACYM_SUBSCRIPTION_EXPIRED')).'</span>',
87 'textShownInTooltip' => acym_translation('ACYM_SUBSCRIPTION_EXPIRED_LINK'),
88 'link' => ACYM_ACYMAILING_WEBSITE.'account/license/',
89 ]
90 );
91 } else {
92 echo '<div class="acylicence_valid">
93 <span class="acy_subscriptionok acym__color__green">'.esc_html(
94 acym_translationSprintf(
95 'ACYM_VALID_UNTIL',
96 acym_getDate($expirationDate, acym_translation('ACYM_DATE_FORMAT_LC4'))
97 )
98 ).'</span>
99 </div>';
100 }
101 }
102
103 $creditRemainingSendingMethod = '';
104 acym_trigger('onAcymGetCreditRemainingSendingMethod', [&$creditRemainingSendingMethod, $reloading]);
105 if (!empty($creditRemainingSendingMethod)) {
106 echo '<div class="acy_sending_method_credits">
107 <span>'.wp_kses($creditRemainingSendingMethod, [
108 'span' => [
109 'class' => true,
110 ],
111 'a' => [
112 'href' => true,
113 'class' => true,
114 'title' => true,
115 'target' => true,
116 ],
117 ]).'</span>
118 </div>';
119 }
120
121 echo '</div>';
122 }
123
124 public function displayNotificationCenter(): void
125 {
126 $notifications = json_decode($this->config->get('notifications', '{}'), true);
127 if (!is_array($notifications) || empty($notifications)) {
128 $notifications = [];
129 }
130 $message = '';
131 //if we have a notifications for success
132 $notificationLevel = 0;
133 $successMessage = acym_getVar('string', 'acym_success', '', 'SESSION');
134 if (!empty($successMessage)) {
135 $message = $successMessage;
136 acym_setSession('acym_success', '');
137 $notificationLevel = 1;
138 }
139
140 if (!empty($notifications)) {
141 foreach ($notifications as $notification) {
142 if ($notification['read']) continue;
143 if ($notification['level'] === 'info' && $notificationLevel < 2) $notificationLevel = 2;
144 if ($notification['level'] === 'warning' && $notificationLevel < 3) $notificationLevel = 3;
145 if ($notification['level'] === 'error' && $notificationLevel < 4) $notificationLevel = 4;
146 }
147 }
148
149 $iconToDisplay = '';
150 $tooltip = false;
151
152 switch ($notificationLevel) {
153 case 0:
154 // default icon
155 $iconToDisplay = 'acymicon-bell';
156 $notificationLevel = '';
157 break;
158 case 1:
159 // success
160 $iconToDisplay = 'acymicon-check-circle acym__color__green';
161 $notificationLevel = 'acym__header__notification__button__success acym__header__notification__pulse';
162 $tooltip = true;
163 break;
164 case 2:
165 // info
166 $iconToDisplay = 'acymicon-bell acym__color__blue';
167 $notificationLevel = 'acym__header__notification__button__info';
168 break;
169 case 3:
170 // warning
171 $iconToDisplay = 'acymicon-exclamation-triangle acym__color__orange';
172 $notificationLevel = 'acym__header__notification__button__warning';
173 break;
174 case 4:
175 // error
176 $iconToDisplay = 'acymicon-exclamation-circle acym__color__red';
177 $notificationLevel = 'acym__header__notification__button__error';
178 break;
179 }
180
181 echo '<div class="cell grid-x align-center acym_vcenter medium-shrink acym__header__notification '.esc_attr($notificationLevel).' button_header cursor-pointer"';
182 if ($tooltip) {
183 echo ' data-acym-tooltip="'.esc_attr($message).'" data-acym-tooltip-position="left"';
184 }
185 echo '>';
186 echo '<i class="'.esc_attr($iconToDisplay).'"></i>';
187 echo '<div class="cell grid-x acym__header__notification__center align-center">';
188 $this->displayNotificationCenterInner($notifications);
189 echo '</div>';
190 echo '</div>';
191 }
192
193 public function displayNotificationCenterInner(array $notifications): void
194 {
195 if (empty($notifications)) {
196 echo '<div class="cell grid-x acym__header__notification__one acym__header__notification__one__empty acym_vcenter">';
197 echo '<h2 class="cell text-center">'.esc_html(acym_translation('ACYM_YOU_DONT_HAVE_NOTIFICATIONS')).'</h2>';
198 echo '</div>';
199
200 return;
201 }
202
203 echo '<div class="cell grid-x acym__header__notification__toolbox"><p class="cell auto">';
204 echo esc_html(acym_translation('ACYM_NOTIFICATIONS'));
205 echo '</p><div class="cell shrink cursor-pointer acym__header__notification__toolbox__remove text-right" data-id="all">';
206 echo esc_html(acym_translation('ACYM_DELETE_ALL'));
207 echo '</div></div>';
208
209 foreach ($notifications as $key => $notif) {
210 $fullMessageHover = $notif['message'];
211
212 if (strlen($notif['message']) > 150) {
213 $tag = new \stdClass();
214 $tag->wrap = 150;
215
216 $pluginHelper = new PluginHelper();
217 $notif['message'] = $pluginHelper->wrapText($notif['message'], $tag);
218 }
219
220 $logo = $notif['level'] === 'info' ? 'acymicon-bell' : ($notif['level'] === 'warning' ? 'acymicon-exclamation-triangle' : 'acymicon-exclamation-circle');
221 $read = $notif['read'] ? 'acym__header__notification__one__read' : '';
222 echo '<div class="'.esc_attr($read).' cell grid-x acym__header__notification__one acym_vcenter acym_vcenter acym__header__notification__one__'.esc_attr(
223 $notif['level']
224 ).'">';
225 echo '<div class="cell small-3 align-center grid-x acym__header__notification__one__icon"><i class="cell '.esc_attr($logo).'"></i></div>';
226 echo '<div class="cell grid-x small-8">';
227 echo '<p class="cell acym__header__notification__message"';
228 if ($fullMessageHover !== $notif['message']) {
229 echo ' data-acym-full="'.esc_attr($fullMessageHover).'"';
230 }
231 echo '>';
232 echo wp_kses($notif['message'], SecurityHelper::ALLOWED_HTML_NOTIFICATION);
233 echo '<div class="cell acym__header__notification__one__date">'.esc_html(acym_date($notif['date'])).'</div></div>';
234 echo '<i class="cell small-1 acym__header__notification__one__delete acymicon-close" data-id="'.esc_attr($key).'"></i>';
235 echo '</div>';
236 }
237 }
238
239 public function addNotification(object $notif): string
240 {
241 if ($notif->level === 'success') {
242 acym_setSession('acym_success', $notif->message);
243
244 return '';
245 }
246
247 $notifications = json_decode($this->config->get('notifications', '[]'), true);
248 if (!is_array($notifications)) {
249 $notifications = [];
250 }
251
252 $notif->message = str_replace('<br />', "\r\n", $notif->message);
253 $notif->message = wp_kses(
254 $notif->message,
255 [
256 'a' => [
257 'href' => true,
258 'class' => true,
259 'id' => true,
260 'target' => true,
261 ],
262 ]
263 );
264
265 // Prevent duplicated notifications
266 foreach ($notifications as $key => $oneNotif) {
267 if ($oneNotif['message'] === $notif->message && $oneNotif['level'] === $notif->level) unset($notifications[$key]);
268 }
269 $notifications = array_values($notifications);
270
271 $notif->id = uniqid();
272 array_unshift($notifications, $notif);
273
274 if (count($notifications) > 10) unset($notifications[10]);
275
276 $this->config->saveConfig(['notifications' => json_encode($notifications)]);
277
278 return $notif->id;
279 }
280
281 private function displayLastNews(): void
282 {
283 $lastNewsCheck = $this->config->get('last_news_check', 0);
284 if ($lastNewsCheck < time() - 7200) {
285 $context = stream_context_create(['http' => ['timeout' => 1]]);
286 $news = @file_get_contents(ACYM_ACYMAILING_WEBSITE.'acymnews.xml', false, $context);
287 $this->config->saveConfig(
288 [
289 'last_news_check' => time(),
290 'last_news' => base64_encode($news),
291 ],
292 false
293 );
294 } else {
295 $news = $this->config->get('last_news', '');
296 if (!empty($news)) $news = base64_decode($news);
297 }
298 if (empty($news)) {
299 return;
300 }
301
302 $news = @simplexml_load_string($news);
303 if (empty($news->news)) {
304 return;
305 }
306
307 $currentLanguage = acym_getLanguageTag();
308 $latestNews = null;
309 $doNotRemind = json_decode($this->config->get('remindme', '[]'));
310
311 foreach ($news->news as $oneNews) {
312 // If we found a news more recent, it means we found the latest available one
313 if (!empty($latestNews) && strtotime($latestNews->date) > strtotime($oneNews->date)) break;
314
315 // If the news isn't published or that the language isn't correct, leave
316 $language = strtolower($oneNews->language);
317 if (empty($oneNews->published) || ($language != strtolower($currentLanguage) && ($language != 'default' || !empty($latestNews)))) {
318 continue;
319 }
320
321 // If the extension isn't correct, leave
322 if (!empty($oneNews->extension) && strtolower($oneNews->extension) !== 'acymailing') continue;
323
324 // If the CMS isn't correct, leave
325 if (!empty($oneNews->cms) && strtolower($oneNews->cms) != strtolower('WordPress')) continue;
326
327 // If the level of the extension isn't correct, leave
328 if (!empty($oneNews->level) && strtolower($oneNews->level) != strtolower($this->config->get('level'))) continue;
329
330 // If the version of the extension isn't correct, leave
331 if (!empty($oneNews->version)) {
332 [$version, $operator] = explode('_', $oneNews->version);
333 if (!version_compare($this->config->get('version'), $version, $operator)) continue;
334 }
335
336 if (!empty($oneNews->mailermethod)) {
337 $sendMethod = $this->config->get('mailer_method', '');
338 if ($oneNews->mailermethod !== $sendMethod) continue;
339 }
340
341 if (in_array($oneNews->name, $doNotRemind)) continue;
342
343 $latestNews = $oneNews;
344 }
345
346 if (empty($latestNews)) {
347 return;
348 }
349
350 echo '<div id="acym__header__banner__news" data-news="'.esc_attr($latestNews->name).'">';
351 echo wp_kses(
352 $latestNews->content,
353 [
354 'style' => [
355 'type' => true,
356 ],
357 'div' => [
358 'class' => true,
359 'title' => true,
360 ],
361 'b' => [],
362 'a' => [
363 'href' => true,
364 'target' => true,
365 ],
366 ]
367 );
368 echo '</div>';
369 }
370
371 private function displayBreadcrumb(array $breadcrumb): void
372 {
373 echo '<i class="cell shrink acym-logo"></i>';
374 echo '<div id="acym_global_navigation" class="cell auto">
375 <nav aria-label="You are here:" role="navigation">
376 <ul class="breadcrumbs grid-x">';
377 $i = 0;
378 foreach ($breadcrumb as $oneLevel => $link) {
379 if ($i !== 0) {
380 echo '<li class="breadcrumbs__separator"><i class="acymicon-keyboard-arrow-right"></i></li>';
381 }
382
383 if (count($breadcrumb) > 1 && $i === count($breadcrumb) - 1) {
384 echo '<li class="last_link cell shrink"><span class="show-for-sr">Current: </span>';
385 } else {
386 echo '<li>';
387 }
388
389 if (!empty($link)) {
390 echo '<a href="'.esc_url($link).'">';
391 }
392 echo esc_html($oneLevel);
393 if (!empty($link)) {
394 echo '</a>';
395 }
396 echo '</li>';
397
398 $i++;
399 }
400 echo '</ul>
401 </nav>
402 </div>';
403 }
404
405 private function displayCheckVersionButton(): void
406 {
407 if (ACYM_CMS == 'wordpress' && !acym_level(ACYM_ESSENTIAL)) {
408 return;
409 }
410
411 $lastLicenseCheck = $this->config->get('lastlicensecheck', 0);
412 if (empty($lastLicenseCheck)) {
413 $lastLicenseCheck = time();
414 }
415
416 $lastDateFormatted = acym_date($lastLicenseCheck, 'ACYM_DATE_FORMAT_LC2');
417
418 acym_tooltip(
419 [
420 'hoveredText' => '<a id="checkVersionButton" type="button" class="grid-x align-center button_header medium-shrink acym_vcenter"><i class="cell shrink acymicon-autorenew"></i></a>',
421 'textShownInTooltip' => esc_html(acym_translation('ACYM_LAST_CHECK')).' <span id="acym__check__version__last__check">'.esc_html(
422 $lastDateFormatted
423 ).'</span>',
424 ]
425 );
426 }
427
428 private function displayHelpWedButton(): void
429 {
430 if (ACYM_CMS !== 'wordpress' || acym_level(ACYM_ESSENTIAL)) {
431 return;
432 }
433
434 echo '<a type="button" class="grid-x align-center button_header medium-shrink acym_vcenter" target="_blank" href="https://wordpress.org/support/plugin/acymailing/">
435 <i class="cell shrink acymicon-wordpress"></i>
436 </a>';
437 }
438
439 private function displayDocumentationButton(): void
440 {
441 acym_tooltip(
442 [
443 'hoveredText' => '<a type="button" class="grid-x align-center button_header medium-shrink acym_vcenter" target="_blank" href="'.esc_url(
444 ACYM_DOCUMENTATION
445 ).'"><i class="cell shrink acymicon-book"></i></a>',
446 'textShownInTooltip' => acym_translation('ACYM_DOCUMENTATION'),
447 ]
448 );
449 }
450 }
451