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
← All changes | back/Helpers/HeaderHelper.php +306 -226 10.2.2 → 11.1.0 View file →
@@ -5,141 +5,47 @@
5 5 use AcyMailing\Core\AcymObject;
6 6
7 7 class HeaderHelper extends AcymObject
8 8 {
9 - public function display(array $breadcrumb): string
9 + public function display(array $breadcrumb): void
10 10 {
11 - $header = '<div class="cell large-6 xlarge-7 xxlarge-8 grid-x acym_vcenter">';
12 - $header .= $this->getBreadcrumb($breadcrumb);
13 - $header .= '</div>';
11 + $this->displayLastNews();
14 12
15 - $header .= '<div class="cell large-6 xlarge-5 xxlarge-4 grid-x">';
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>';
16 17
17 - $header .= '<div id="checkVersionArea" class="cell auto grid-x align-right check-version-area acym_vcenter padding-right-1">';
18 - $header .= $this->checkVersionArea();
19 - $header .= '</div>';
18 + echo '<div class="cell large-6 xlarge-5 xxlarge-4 grid-x">';
20 19
21 - $header .= '<div class="cell shrink grid-x align-right acym_vcenter">';
22 - $header .= $this->getCheckVersionButton();
23 - $header .= $this->getHelpWedButton();
24 - $header .= $this->getDocumentationButton();
25 - $header .= $this->getNotificationCenter();
26 - $header .= '</div>';
20 + echo '<div id="checkVersionArea" class="cell auto grid-x align-right acym_vcenter">';
21 + $this->displayVersionArea();
22 + echo '</div>';
27 23
28 - $header .= '</div>';
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>';
29 30
30 - $header = '<div id="acym_header" class="grid-x margin-bottom-1">'.$header.'</div>';
31 -
32 - return $this->getLastNews().$header;
31 + echo '</div>';
32 + echo '</div>';
33 33 }
34 34
35 - private function getLastNews(): string
35 + public function displayVersionArea(bool $reloading = false): void
36 36 {
37 - $lastNewsCheck = $this->config->get('last_news_check', 0);
38 - if ($lastNewsCheck < time() - 7200) {
39 - $context = stream_context_create(['http' => ['timeout' => 1]]);
40 - $news = @file_get_contents(ACYM_ACYMAILING_WEBSITE.'acymnews.xml', false, $context);
41 - $this->config->save(
42 - [
43 - 'last_news_check' => time(),
44 - 'last_news' => base64_encode($news),
45 - ],
46 - false
47 - );
48 - } else {
49 - $news = $this->config->get('last_news', '');
50 - if (!empty($news)) $news = base64_decode($news);
51 - }
52 - if (empty($news)) {
53 - return '';
54 - }
55 -
56 - $news = @simplexml_load_string($news);
57 - if (empty($news->news)) {
58 - return '';
59 - }
60 -
61 - $currentLanguage = acym_getLanguageTag();
62 - $latestNews = null;
63 - $doNotRemind = json_decode($this->config->get('remindme', '[]'));
64 -
65 - foreach ($news->news as $oneNews) {
66 - if (!empty($latestNews) && strtotime($latestNews->date) > strtotime($oneNews->date)) break;
67 -
68 - $language = strtolower($oneNews->language);
69 - if (empty($oneNews->published) || ($language != strtolower($currentLanguage) && ($language != 'default' || !empty($latestNews)))) {
70 - continue;
71 - }
72 -
73 - if (!empty($oneNews->extension) && strtolower($oneNews->extension) !== 'acymailing') continue;
74 -
75 - if (!empty($oneNews->cms) && strtolower($oneNews->cms) != strtolower('WordPress')) continue;
76 -
77 - if (!empty($oneNews->level) && strtolower($oneNews->level) != strtolower($this->config->get('level'))) continue;
78 -
79 - if (!empty($oneNews->version)) {
80 - [$version, $operator] = explode('_', $oneNews->version);
81 - if (!version_compare($this->config->get('version'), $version, $operator)) continue;
82 - }
83 -
84 - if (!empty($oneNews->mailermethod)) {
85 - $sendMethod = $this->config->get('mailer_method', '');
86 - if ($oneNews->mailermethod !== $sendMethod) continue;
87 - }
88 -
89 - if (in_array($oneNews->name, $doNotRemind)) continue;
90 -
91 - $latestNews = $oneNews;
92 - }
93 -
94 - if (empty($latestNews)) {
95 - return '';
96 - }
97 -
98 - $newsDisplay = '<div id="acym__header__banner__news" data-news="'.acym_escape($latestNews->name).'">';
99 - $newsDisplay .= $latestNews->content;
100 - $newsDisplay .= '</div>';
101 -
102 - return $newsDisplay;
103 - }
104 -
105 - private function getBreadcrumb(array $breadcrumb): string
106 - {
107 - $links = [];
108 - foreach ($breadcrumb as $oneLevel => $link) {
109 - if (!empty($link)) {
110 - $oneLevel = '<a href="'.$link.'">'.$oneLevel.'</a>';
111 - }
112 - $links[] = '<li>'.$oneLevel.'</li>';
113 - }
114 -
115 - if (count($links) > 1) {
116 - $links[count($links) - 1] = str_replace('<li>', '<li class="last_link cell shrink"><span class="show-for-sr">Current: </span>', $links[count($links) - 1]);
117 - }
118 -
119 - $header = '<i class="cell shrink acym-logo"></i>';
120 - $header .= '<div id="acym_global_navigation" class="cell auto">
121 - <nav aria-label="You are here:" role="navigation">
122 - <ul class="breadcrumbs grid-x">'.implode('<li class="breadcrumbs__separator"><i class="acymicon-keyboard-arrow-right"></i></li>', $links).'</ul>
123 - </nav>
124 - </div>';
125 -
126 - return $header;
127 - }
128 -
129 - public function checkVersionArea(bool $reloading = false): string
130 - {
131 37 $currentLevel = $this->config->get('level', '');
132 38 $currentVersion = $this->config->get('version', '');
133 39 $latestVersion = $this->config->get('latestversion', '');
134 40
135 - $version = '<div id="acym_level_version_area" class="text-right">';
136 - $version .= '<div id="acym_level">'.ACYM_NAME.' '.$currentLevel.' ';
41 + echo '<div id="acym_level_version_area" class="text-right">';
42 + echo '<div id="acym_level">'.esc_html(ACYM_NAME.' '.$currentLevel.' ');
137 43
138 44 if (version_compare($currentVersion, $latestVersion, '>=')) {
139 - $version .= acym_tooltip(
45 + acym_tooltip(
140 46 [
141 - 'hoveredText' => '<span class="acym__color__green">'.$currentVersion.'</span>',
47 + 'hoveredText' => '<span class="acym__color__green">'.esc_html($currentVersion).'</span>',
142 48 'textShownInTooltip' => acym_translation('ACYM_UP_TO_DATE'),
143 49 ]
144 50 );
145 51 } elseif (!empty($latestVersion)) {
@@ -147,11 +53,11 @@
147 53 $downloadLink = admin_url().'update-core.php';
148 54 } else {
149 55 $downloadLink = ACYM_ACYMAILING_WEBSITE.'account/license/" target="_blank';
150 56 }
151 - $version .= acym_tooltip(
57 + acym_tooltip(
152 58 [
153 - 'hoveredText' => '<span class="acy_updateversion acym__color__red">'.$currentVersion.'</span>',
59 + 'hoveredText' => '<span class="acy_updateversion acym__color__red">'.esc_html($currentVersion).'</span>',
154 60 'textShownInTooltip' => acym_translationSprintf('ACYM_CLICK_UPDATE', $latestVersion),
155 61 'titleShownInTooltip' => acym_translation('ACYM_OLD_VERSION'),
156 62 'link' => $downloadLink,
157 63 ]
@@ -157,33 +63,39 @@
157 63 ]
158 64 );
159 65 }
160 66
161 - $version .= '</div></div>';
67 + echo '</div></div>';
162 68
163 69 $expirationDate = $this->config->get('expirationdate', 0);
164 - if ((empty($expirationDate) || $expirationDate == -1) && empty($this->config->get('acymailer_apikey', ''))) return $version;
70 + if ((empty($expirationDate) || $expirationDate == -1) && empty($this->config->get('acymailer_apikey', ''))) {
71 + return;
72 + }
165 73
166 - $version .= '<div id="acym_expiration" class="text-right cell">';
74 + echo '<div id="acym_expiration" class="cell">';
167 75 if (acym_level(ACYM_ESSENTIAL) && ACYM_PRODUCTION) {
168 76 if ($expirationDate == -2) {
169 - $version .= '<div class="acylicence_expired">
77 + echo '<div class="acylicence_expired">
170 78 <a class="acy_attachlicence acymbuttons acym__color__red acym_link_license_tab"
171 - href="'.acym_completeLink('configuration', false, false, true).'">'.acym_translation('ACYM_ATTACH_LICENCE').'</a>
79 + href="'.esc_url(acym_completeLink('configuration', false, false, true)).'">'.esc_html(acym_translation('ACYM_ATTACH_LICENCE')).'</a>
172 80 </div>';
173 81 } elseif ($expirationDate < time()) {
174 - $version .= acym_tooltip(
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(
175 85 [
176 - 'hoveredText' => '<span class="acy_subscriptionexpired acym__color__red">'.acym_translation('ACYM_SUBSCRIPTION_EXPIRED').'</span>',
86 + 'hoveredText' => '<span class="acy_subscriptionexpired acym__color__red">'.esc_html(acym_translation('ACYM_SUBSCRIPTION_EXPIRED')).'</span>',
177 87 'textShownInTooltip' => acym_translation('ACYM_SUBSCRIPTION_EXPIRED_LINK'),
178 88 'link' => ACYM_ACYMAILING_WEBSITE.'account/license/',
179 89 ]
180 90 );
181 91 } else {
182 - $version .= '<div class="acylicence_valid">
183 - <span class="acy_subscriptionok acym__color__green">'.acym_translationSprintf(
184 - 'ACYM_VALID_UNTIL',
185 - acym_getDate($expirationDate, acym_translation('ACYM_DATE_FORMAT_LC4'))
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 + )
186 98 ).'</span>
187 99 </div>';
188 100 }
189 101 }
@@ -190,68 +102,39 @@
190 102
191 103 $creditRemainingSendingMethod = '';
192 104 acym_trigger('onAcymGetCreditRemainingSendingMethod', [&$creditRemainingSendingMethod, $reloading]);
193 105 if (!empty($creditRemainingSendingMethod)) {
194 - $version .= '<div class="acy_sending_method_credits">
195 - <span>'.$creditRemainingSendingMethod.'</span>
196 - </div>';
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>';
197 119 }
198 120
199 - $version .= '</div>';
200 -
201 - return $version;
121 + echo '</div>';
202 122 }
203 123
204 - private function getCheckVersionButton(): string
124 + public function displayNotificationCenter(): void
205 125 {
206 - if (ACYM_CMS == 'wordpress' && !acym_level(ACYM_ESSENTIAL)) {
207 - return '';
126 + $notifications = json_decode($this->config->get('notifications', '{}'), true);
127 + if (!is_array($notifications) || empty($notifications)) {
128 + $notifications = [];
208 129 }
209 -
210 - $lastLicenseCheck = $this->config->get('lastlicensecheck', 0);
211 - $time = time();
212 - $checking = ($time > $lastLicenseCheck + 604800) ? $checking = '1' : '0';
213 - if (empty($lastLicenseCheck)) $lastLicenseCheck = $time;
214 -
215 - return acym_tooltip(
216 - [
217 - 'hoveredText' => '<a id="checkVersionButton" type="button" class="grid-x align-center button_header medium-shrink acym_vcenter" data-check="'.acym_escape(
218 - $checking
219 - ).'"><i class="cell shrink acymicon-autorenew"></i></a>',
220 - 'textShownInTooltip' => acym_translation('ACYM_LAST_CHECK').' <span id="acym__check__version__last__check">'.acym_date($lastLicenseCheck, 'Y/m/d H:i').'</span>',
221 - ]
222 - );
223 - }
224 -
225 - private function getDocumentationButton(): string
226 - {
227 - return acym_tooltip(
228 - [
229 - 'hoveredText' => '<a type="button" class="grid-x align-center button_header medium-shrink acym_vcenter" target="_blank" href="'.ACYM_DOCUMENTATION.'"><i class="cell shrink acymicon-book"></i></a>',
230 - 'textShownInTooltip' => acym_translation('ACYM_DOCUMENTATION'),
231 - ]
232 - );
233 - }
234 -
235 - private function getHelpWedButton(): string
236 - {
237 - if (ACYM_CMS != 'wordpress' || acym_level(ACYM_ESSENTIAL)) {
238 - return '';
239 - }
240 -
241 - return '<a type="button" class="grid-x align-center button_header medium-shrink acym_vcenter" target="_blank" href="https://wordpress.org/support/plugin/acymailing/">
242 - <i class="cell shrink acymicon-book"></i>
243 - </a>';
244 - }
245 -
246 - public function getNotificationCenter(): string
247 - {
248 - $notifications = json_decode($this->config->get('notifications', '{}'), true);
249 130 $message = '';
131 + //if we have a notifications for success
250 132 $notificationLevel = 0;
251 - if (!empty($_SESSION['acym_success'])) {
252 - $message = $_SESSION['acym_success'];
253 - $_SESSION['acym_success'] = '';
133 + $successMessage = acym_getVar('string', 'acym_success', '', 'SESSION');
134 + if (!empty($successMessage)) {
135 + $message = $successMessage;
136 + acym_setSession('acym_success', '');
254 137 $notificationLevel = 1;
255 138 }
256 139
257 140 if (!empty($notifications)) {
@@ -256,92 +139,108 @@
256 139
257 140 if (!empty($notifications)) {
258 141 foreach ($notifications as $notification) {
259 142 if ($notification['read']) continue;
260 - if ($notification['level'] == 'info' && $notificationLevel < 2) $notificationLevel = 2;
261 - if ($notification['level'] == 'warning' && $notificationLevel < 3) $notificationLevel = 3;
262 - if ($notification['level'] == 'error' && $notificationLevel < 4) $notificationLevel = 4;
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;
263 146 }
264 147 }
265 148
266 149 $iconToDisplay = '';
267 - $tooltip = '';
150 + $tooltip = false;
268 151
269 152 switch ($notificationLevel) {
270 153 case 0:
154 + // default icon
271 155 $iconToDisplay = 'acymicon-bell';
272 156 $notificationLevel = '';
273 157 break;
274 158 case 1:
159 + // success
275 160 $iconToDisplay = 'acymicon-check-circle acym__color__green';
276 161 $notificationLevel = 'acym__header__notification__button__success acym__header__notification__pulse';
277 - $tooltip = 'data-acym-tooltip="'.acym_escape($message).'" data-acym-tooltip-position="left"';
162 + $tooltip = true;
278 163 break;
279 164 case 2:
165 + // info
280 166 $iconToDisplay = 'acymicon-bell acym__color__blue';
281 167 $notificationLevel = 'acym__header__notification__button__info';
282 168 break;
283 169 case 3:
170 + // warning
284 171 $iconToDisplay = 'acymicon-exclamation-triangle acym__color__orange';
285 172 $notificationLevel = 'acym__header__notification__button__warning';
286 173 break;
287 174 case 4:
175 + // error
288 176 $iconToDisplay = 'acymicon-exclamation-circle acym__color__red';
289 177 $notificationLevel = 'acym__header__notification__button__error';
290 178 break;
291 179 }
292 180
293 - $notificationCenter = '<div class="cell grid-x align-center acym_vcenter medium-shrink acym__header__notification '.$notificationLevel.' button_header cursor-pointer" '.$tooltip.'>';
294 - $notificationCenter .= '<i class="'.$iconToDisplay.'"></i>';
295 - $notificationCenter .= '<div class="cell grid-x acym__header__notification__center align-center">';
296 - $notificationCenter .= $this->getNotificationCenterInner($notifications);
297 - $notificationCenter .= '</div>';
298 - $notificationCenter .= '</div>';
299 -
300 - return $notificationCenter;
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>';
301 191 }
302 192
303 - public function getNotificationCenterInner(array $notifications): string
193 + public function displayNotificationCenterInner(array $notifications): void
304 194 {
305 - $notificationCenter = '';
306 195 if (empty($notifications)) {
307 - $notificationCenter .= '<div class="cell grid-x acym__header__notification__one acym__header__notification__one__empty acym_vcenter">';
308 - $notificationCenter .= '<h2 class="cell text-center">'.acym_translation('ACYM_YOU_DONT_HAVE_NOTIFICATIONS').'</h2>';
309 - $notificationCenter .= '</div>';
310 - } else {
311 - $notificationCenter .= '<div class="cell grid-x acym__header__notification__toolbox"><p class="cell auto">'.acym_translation(
312 - 'ACYM_NOTIFICATIONS'
313 - ).'</p><div class="cell shrink cursor-pointer acym__header__notification__toolbox__remove text-right" data-id="all">'.acym_translation('ACYM_DELETE_ALL').'</div></div>';
314 - foreach ($notifications as $key => $notif) {
315 - $fullMessageHover = $notif['message'];
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>';
316 199
317 - if (strlen($notif['message']) > 150) {
318 - $tag = new \stdClass();
319 - $tag->wrap = 150;
200 + return;
201 + }
320 202
321 - $pluginHelper = new PluginHelper();
322 - $notif['message'] = $pluginHelper->wrapText($notif['message'], $tag);
323 - }
324 - $fullMessageHover = $fullMessageHover != $notif['message'] ? 'data-acym-full="'.acym_escape($fullMessageHover).'"' : '';
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>';
325 208
326 - $logo = $notif['level'] === 'info' ? 'acymicon-bell' : ($notif['level'] == 'warning' ? 'acymicon-exclamation-triangle' : 'acymicon-exclamation-circle');
327 - $read = $notif['read'] ? 'acym__header__notification__one__read' : '';
328 - $notificationCenter .= '<div class="'.$read.' cell grid-x acym__header__notification__one acym_vcenter acym_vcenter acym__header__notification__one__'.$notif['level'].'">';
329 - $notificationCenter .= '<div class="cell small-3 align-center grid-x acym__header__notification__one__icon"><i class="cell '.$logo.'"></i></div>';
330 - $notificationCenter .= '<div class="cell grid-x small-8"><p class="cell acym__header__notification__message" '.$fullMessageHover.'>'.$notif['message'];
331 - $notificationCenter .= '<div class="cell acym__header__notification__one__date">'.acym_date($notif['date']).'</div></div>';
332 - $notificationCenter .= '<i class="cell small-1 acym__header__notification__one__delete acymicon-close" data-id="'.acym_escape($key).'"></i>';
333 - $notificationCenter .= '</div>';
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);
334 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>';
335 236 }
336 -
337 - return $notificationCenter;
338 237 }
339 238
340 239 public function addNotification(object $notif): string
341 240 {
342 241 if ($notif->level === 'success') {
343 - $_SESSION['acym_success'] = $notif->message;
242 + acym_setSession('acym_success', $notif->message);
344 243
345 244 return '';
346 245 }
347 246
@@ -350,10 +249,21 @@
350 249 $notifications = [];
351 250 }
352 251
353 252 $notif->message = str_replace('<br />', "\r\n", $notif->message);
354 - $notif->message = strip_tags($notif->message, '<a>');
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 + );
355 264
265 + // Prevent duplicated notifications
356 266 foreach ($notifications as $key => $oneNotif) {
357 267 if ($oneNotif['message'] === $notif->message && $oneNotif['level'] === $notif->level) unset($notifications[$key]);
358 268 }
359 269 $notifications = array_values($notifications);
@@ -362,9 +272,179 @@
362 272 array_unshift($notifications, $notif);
363 273
364 274 if (count($notifications) > 10) unset($notifications[10]);
365 275
366 - $this->config->save(['notifications' => json_encode($notifications)]);
276 + $this->config->saveConfig(['notifications' => json_encode($notifications)]);
367 277
368 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 + );
369 449 }
370 450 }