PluginProbe
AcyMailing – An Ultimate Newsletter Plugin and Marketing Automation Solution for WordPress / 11.1.1
AcyMailing – An Ultimate Newsletter Plugin and Marketing Automation Solution for WordPress v11.1.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
← All changes | back/Helpers/PluginHelper.php +0 -1374 10.0.1 → 11.1.1 View file →
@@ -1,1374 +1,0 @@
1 -<?php
2 -
3 -namespace AcyMailing\Helpers;
4 -
5 -use AcyMailing\Classes\MailClass;
6 -use AcyMailing\Core\AcymObject;
7 -
8 -class PluginHelper extends AcymObject
9 -{
10 - public $wraped = false;
11 - public $name = 'content';
12 - public $mailerHelper;
13 - public $wrappedText = '';
14 - public string $contextLanguage;
15 -
16 - public function getFormattedResult($elements, $parameter)
17 - {
18 - if (count($elements) < 2) {
19 - return implode('', $elements);
20 - }
21 -
22 - $beforeAll = [];
23 - $beforeAll['table'] = '<table cellspacing="0" cellpadding="0" border="0" width="100%" class="elementstable">'."\n";
24 - $beforeAll['ul'] = '<ul class="elementsul">'."\n";
25 - $beforeAll['br'] = '';
26 -
27 - $beforeBlock = [];
28 - $beforeBlock['table'] = '<tr class="elementstable_tr numrow{rownum}">'."\n";
29 - $beforeBlock['ul'] = '';
30 - $beforeBlock['br'] = '';
31 -
32 - $beforeOne = [];
33 - $beforeOne['table'] = '<td valign="top" width="{equalwidth}" style="{padding}" class="elementstable_td numcol{numcol}" >'."\n";
34 - $beforeOne['ul'] = '<li class="elementsul_li numrow{rownum}">'."\n";
35 - $beforeOne['br'] = '';
36 -
37 - $afterOne = [];
38 - $afterOne['table'] = '</td>'."\n";
39 - $afterOne['ul'] = '</li>'."\n";
40 - $afterOne['br'] = '<br />'."\n";
41 -
42 - $afterBlock = [];
43 - $afterBlock['table'] = '</tr>'."\n";
44 - $afterBlock['ul'] = '';
45 - $afterBlock['br'] = '';
46 -
47 - $afterAll = [];
48 - $afterAll['table'] = '</table>'."\n";
49 - $afterAll['ul'] = '</ul>'."\n";
50 - $afterAll['br'] = '';
51 -
52 -
53 - $type = 'table';
54 - $cols = 1;
55 - if (!empty($parameter->displaytype)) {
56 - $type = $parameter->displaytype;
57 - }
58 - if ($type == 'none') {
59 - return implode('', $elements);
60 - }
61 - if (!empty($parameter->cols)) {
62 - $cols = $parameter->cols;
63 - }
64 -
65 - $parameter->hpadding = !isset($parameter->hpadding) || is_null($parameter->hpadding) ? 10 : $parameter->hpadding;
66 - $parameter->vpadding = !isset($parameter->vpadding) || is_null($parameter->vpadding) ? 10 : $parameter->vpadding;
67 -
68 - $horizontalPadding = round($parameter->hpadding / 2);
69 - $verticalPadding = round($parameter->vpadding / 2);
70 -
71 - $string = $beforeAll[$type];
72 - $a = 0;
73 - $numrow = 1;
74 - foreach ($elements as $key => $oneElement) {
75 - $topPadding = $verticalPadding.'px';
76 - $rightPadding = $horizontalPadding.'px';
77 - $bottomPadding = $verticalPadding.'px';
78 - $leftPadding = $horizontalPadding.'px';
79 -
80 - if ($a == $cols) {
81 - $string .= $afterBlock[$type];
82 - $a = 0;
83 - $numrow++;
84 - }
85 -
86 - if ($a == 0) {
87 - $string .= str_replace('{rownum}', $numrow, $beforeBlock[$type]);
88 - $leftPadding = '0px';
89 - }
90 -
91 - if ($a + 1 == $cols) $rightPadding = '0px';
92 - if ($numrow == 1) $topPadding = '0px';
93 - if (round(count($elements) / $cols) == $numrow) $bottomPadding = '0px';
94 -
95 - $padding = 'padding: '.$topPadding.' '.$rightPadding.' '.$bottomPadding.' '.$leftPadding.' !important;';
96 -
97 - $string .= str_replace('{numcol}', $a + 1, $beforeOne[$type]).$oneElement.$afterOne[$type];
98 - $string = str_replace('{padding}', $padding, $string);
99 - $a++;
100 - }
101 - while ($cols > $a) {
102 - $string .= str_replace('{numcol}', $a + 1, $beforeOne[$type]).$afterOne[$type];
103 - $a++;
104 - }
105 -
106 - $string .= $afterBlock[$type];
107 - $string .= $afterAll[$type];
108 -
109 - $equalwidth = intval(100 / $cols).'%';
110 -
111 - $string = str_replace(['{equalwidth}'], [$equalwidth], $string);
112 -
113 - return $string;
114 - }
115 -
116 - public function formatString(&$replaceme, $mytag)
117 - {
118 - if (!empty($mytag->part)) {
119 - $parts = explode(' ', $replaceme);
120 - if ($mytag->part == 'last') {
121 - $replaceme = count($parts) > 1 ? end($parts) : '';
122 - } else {
123 - if (is_numeric($mytag->part) && count($parts) >= $mytag->part) {
124 - $replaceme = $parts[$mytag->part - 1];
125 - } else {
126 - $replaceme = reset($parts);
127 - }
128 - }
129 - }
130 -
131 - if (!empty($mytag->type)) {
132 - if (empty($mytag->format)) {
133 - $mytag->format = acym_translation('ACYM_DATE_FORMAT_LC3');
134 - }
135 - if ($mytag->type == 'date') {
136 - $replaceme = acym_getDate(acym_getTime($replaceme), $mytag->format);
137 - } elseif ($mytag->type == 'time') {
138 - $replaceme = acym_getDate($replaceme, $mytag->format);
139 - } elseif ($mytag->type == 'diff') {
140 - try {
141 - $date = $replaceme;
142 - if (is_numeric($date)) {
143 - $date = acym_getDate($replaceme, '%Y-%m-%d %H:%M:%S');
144 - }
145 - $dateObj = new \DateTime($date);
146 - $nowObj = new \DateTime();
147 - $diff = $dateObj->diff($nowObj);
148 - $replaceme = $diff->format($mytag->format);
149 - } catch (\Exception $e) {
150 - $replaceme = 'Error using the "diff" parameter in your tag. Please make sure the DateTime() and diff() functions are available on your server.';
151 - }
152 - }
153 - }
154 -
155 - if (!empty($mytag->lower) || !empty($mytag->lowercase)) {
156 - $replaceme = function_exists('mb_strtolower') ? mb_strtolower($replaceme, 'UTF-8') : strtolower($replaceme);
157 - }
158 - if (!empty($mytag->upper) || !empty($mytag->uppercase)) {
159 - $replaceme = function_exists('mb_strtoupper') ? mb_strtoupper($replaceme, 'UTF-8') : strtoupper($replaceme);
160 - }
161 - if (!empty($mytag->ucwords)) {
162 - $replaceme = ucwords($replaceme);
163 - }
164 - if (!empty($mytag->ucfirst)) {
165 - $replaceme = ucfirst($replaceme);
166 - }
167 - if (isset($mytag->rtrim)) {
168 - $replaceme = empty($mytag->rtrim) ? rtrim($replaceme) : rtrim($replaceme, $mytag->rtrim);
169 - }
170 - if (!empty($mytag->urlencode)) {
171 - $replaceme = urlencode($replaceme);
172 - }
173 - if (!empty($mytag->substr)) {
174 - $args = explode(',', $mytag->substr);
175 - if (isset($args[1])) {
176 - $replaceme = substr($replaceme, intval($args[0]), intval($args[1]));
177 - } else {
178 - $replaceme = substr($replaceme, intval($args[0]));
179 - }
180 - }
181 -
182 -
183 - if (!empty($mytag->maxheight) || !empty($mytag->maxwidth)) {
184 - $imageHelper = new ImageHelper();
185 - $imageHelper->maxHeight = empty($mytag->maxheight) ? 999 : $mytag->maxheight;
186 - $imageHelper->maxWidth = empty($mytag->maxwidth) ? 999 : $mytag->maxwidth;
187 - $replaceme = $imageHelper->resizePictures($replaceme);
188 - }
189 - }
190 -
191 - public function replaceVideos(&$text)
192 - {
193 - $text = preg_replace(
194 - '#\[embed=videolink][^}]*youtube[^=]*=([^"/}]*)[^}]*}\[/embed]#i',
195 - '<a target="_blank" href="https://www.youtube.com/watch?v=$1"><img src="https://img.youtube.com/vi/$1/0.jpg"/></a>',
196 - $text
197 - );
198 - $text = preg_replace(
199 - '#<video[^>]*youtube\.com/embed/([^"/]*)[^>]*>[^>]*</video>#i',
200 - '<a target="_blank" href="https://www.youtube.com/watch?v=$1"><img src="https://img.youtube.com/vi/$1/0.jpg"/></a>',
201 - $text
202 - );
203 - $text = preg_replace(
204 - '#{JoooidContent[^}]*youtube[^}]*id"[^"]*"([^}"]*)"[^}]*}#i',
205 - '<a target="_blank" href="https://www.youtube.com/watch?v=$1"><img src="https://img.youtube.com/vi/$1/0.jpg"/></a>',
206 - $text
207 - );
208 - $text = preg_replace(
209 - '#<iframe[^>]*src="[^"]*youtube[^"]*embed/([^"?]*)(\?[^"]*)?"[^>]*>[^<]*</iframe>#Uis',
210 - '<a target="_blank" href="https://www.youtube.com/watch?v=$1"><img src="https://img.youtube.com/vi/$1/0.jpg"/></a>',
211 - $text
212 - );
213 -
214 - $text = preg_replace(
215 - '#{youtube}[^{]+v=([^{&]+)(&[^{]*)?{/youtube}#Uis',
216 - '<a target="_blank" href="https://www.youtube.com/watch?v=$1"><img src="https://img.youtube.com/vi/$1/0.jpg"/></a>',
217 - $text
218 - );
219 -
220 - $text = preg_replace('#{vimeo}(https://vimeo.com/[^{]+){/vimeo}#Uis', '<iframe src="$1"></iframe>', $text);
221 - $text = preg_replace('#{vimeo}([^{]+){/vimeo}#Uis', '<iframe src="https://player.vimeo.com/video/$1"></iframe>', $text);
222 -
223 - if (preg_match_all('#<iframe[^>]*src="[^"]*vimeo[^"]*/(\d+)([&/\?][^"]*)?"[^>]*>[^<]*</iframe>#Uis', $text, $matches)) {
224 - foreach ($matches[1] as $key => $match) {
225 - $hash = acym_fileGetContent('https://vimeo.com/api/v2/video/'.$match.'.php');
226 - $hash = @unserialize($hash);
227 - if (empty($hash)) continue;
228 -
229 - if (strpos($matches[0][$key], ' width="') !== false) {
230 - $extension = substr($hash[0]['thumbnail_large'], strrpos($hash[0]['thumbnail_large'], '.'));
231 - preg_match('#width="([^"]*)"#Uis', $matches[0][$key], $width);
232 -
233 - $replace = strpos($hash[0]['thumbnail_large'], '_') === false ? '.' : '_';
234 - $hash[0]['thumbnail_large'] = substr($hash[0]['thumbnail_large'], 0, strrpos($hash[0]['thumbnail_large'], $replace)).'_'.$width[1].$extension;
235 - }
236 - $thumbnail = 'https://i.vimeocdn.com/filter/overlay?src='.urlencode($hash[0]['thumbnail_large']);
237 - $thumbnail .= '&src='.urlencode('https://f.vimeocdn.com/p/images/crawler_play.png');
238 -
239 - $text = str_replace(
240 - $matches[0][$key],
241 - '<a target="_blank" href="'.acym_escape($hash[0]['url']).'"><img class="donotresize" alt="" src="'.acym_escape($thumbnail).'" /></a>',
242 - $text
243 - );
244 - }
245 - }
246 -
247 - $text = preg_replace('#\[embed=videolink][^}]*video":"([^"]*)[^}]*}\[/embed]#i', '<a target="_blank" href="$1"><img src="'.ACYM_IMAGES.'/video.png"/></a>', $text);
248 - $text = preg_replace('#<video[^>]*src="([^"]*)"[^>]*>[^>]*</video>#i', '<a target="_blank" href="$1"><img src="'.ACYM_IMAGES.'/video.png"/></a>', $text);
249 - }
250 -
251 - private function _convertbase64pictures(&$html)
252 - {
253 - if (!preg_match_all('#<img[^>]*src=("data:image/([^;]{1,5});base64[^"]*")([^>]*)>#Uis', $html, $resultspictures)) {
254 - return;
255 - }
256 -
257 -
258 -
259 - $dest = ACYM_MEDIA.'resized'.DS;
260 - acym_createDir($dest);
261 - foreach ($resultspictures[2] as $i => $extension) {
262 - $pictname = md5($resultspictures[1][$i]).'.'.$extension;
263 - $picturl = ACYM_LIVE.str_replace(DS, '/', ACYM_MEDIA_FOLDER).'resized/'.$pictname;
264 - $pictPath = $dest.$pictname;
265 - $pictCode = trim($resultspictures[1][$i], '"');
266 - if (file_exists($pictPath)) {
267 - $html = str_replace($pictCode, $picturl, $html);
268 - continue;
269 - }
270 -
271 - if (!ini_get('allow_url_fopen')) {
272 - continue;
273 - }
274 -
275 - $getfunction = '';
276 - switch ($extension) {
277 - case 'gif':
278 - $getfunction = 'ImageCreateFromGIF';
279 - break;
280 - case 'jpg':
281 - case 'jpeg':
282 - $getfunction = 'ImageCreateFromJPEG';
283 - break;
284 - case 'png':
285 - $getfunction = 'ImageCreateFromPNG';
286 - break;
287 - }
288 -
289 - if (empty($getfunction) || !function_exists($getfunction)) {
290 - continue;
291 - }
292 -
293 - $img = $getfunction($pictCode);
294 -
295 - if (in_array($extension, ['gif', 'png'])) {
296 - imagealphablending($img, false);
297 - imagesavealpha($img, false);
298 - }
299 -
300 - ob_start();
301 - switch ($extension) {
302 - case 'gif':
303 - $status = imagegif($img);
304 - break;
305 - case 'jpg':
306 - case 'jpeg':
307 - $status = imagejpeg($img, null, 100);
308 - break;
309 - case 'png':
310 - $status = imagepng($img, null, 1);
311 - break;
312 - }
313 - $imageContent = ob_get_clean();
314 - $status = $status && acym_writeFile($pictPath, $imageContent);
315 -
316 - if (!$status) {
317 - continue;
318 - }
319 - $html = str_replace($pictCode, $picturl, $html);
320 - }
321 - }
322 -
323 - public function cleanHtml(&$html)
324 - {
325 - $this->_convertbase64pictures($html);
326 -
327 - $pregreplace = [];
328 - $pregreplace['#<tr([^>"]*>([^<]*<td[^>]*>[ \n\s]*<img[^>]*>[ \n\s]*</ *td[^>]*>[ \n\s]*)*</ *tr)#Uis'] = '<tr style="line-height: 0px;" $1';
329 - $pregreplace['#<td(((?!style|>).)*>[ \n\s]*(<a[^>]*>)?[ \n\s]*<img[^>]*>[ \n\s]*(</a[^>]*>)?[ \n\s]*</ *td)#Uis'] = '<td style="line-height: 0px;" $1';
330 -
331 - $pregreplace['#{tab[ =][^}]*}#is'] = '';
332 - $pregreplace['#{/tabs}#is'] = '';
333 - $pregreplace['#{jcomments\s+(on|off|lock)}#is'] = '';
334 -
335 - $pregreplace["#(onmouseout|onmouseover|onclick|onfocus|onload|onblur) *= *\"(?:(?!\").)*\"#Ui"] = '';
336 - $pregreplace["#< *script(?:(?!< */ *script *>).)*< */ *script *>#Uis"] = '';
337 - $pregreplace["#< *iframe(?:(?!< */ *iframe *>).)*< */ *iframe *>#Uis"] = '';
338 -
339 - $pregreplace['#(<p style=")([^>]*>\s*<img *[^>]*margin-left: auto; margin-right: auto;[^>]*>\s*</p>)#Uis'] = '$1text-align: center;$2';
340 - $pregreplace['#(<img [^>]*src="[^"]+\.webp"[^>]*>)#Uis'] = '<!--[if !mso]><!-->$1<!--<![endif]-->';
341 -
342 - $newbody = preg_replace(array_keys($pregreplace), $pregreplace, $html);
343 - if (!empty($newbody)) {
344 - $html = $newbody;
345 - }
346 -
347 - $body = preg_replace_callback('/src="([^"]* [^"]*)"/Ui', [$this, '_convertSpaces'], $html);
348 - if (!empty($body)) $html = $body;
349 -
350 - $html = acym_cmsCleanHtml($html);
351 - }
352 -
353 - public function _convertSpaces($matches)
354 - {
355 - return "src='".str_replace(' ', '%20', $matches[1])."'";
356 - }
357 -
358 - public function replaceTags(&$email, $tags, $html = false)
359 - {
360 - if (empty($tags)) return;
361 -
362 - $htmlVars = ['body'];
363 - $textVars = [
364 - 'subject',
365 - 'AltBody',
366 - 'From',
367 - 'FromName',
368 - 'ReplyTo',
369 - 'ReplyName',
370 - 'bcc',
371 - 'cc',
372 - 'fromname',
373 - 'fromemail',
374 - 'replyname',
375 - 'replyemail',
376 - 'params',
377 - 'preheader',
378 - ];
379 -
380 - $variables = array_merge($htmlVars, $textVars);
381 -
382 - if ($html) {
383 - if (empty($this->mailerHelper)) {
384 - $this->mailerHelper = new MailerHelper();
385 - }
386 -
387 - $textreplace = [];
388 - foreach ($tags as $i => $replacement) {
389 - if (isset($textreplace[$i])) continue;
390 - $textreplace[$i] = $this->mailerHelper->textVersion($replacement, true);
391 - }
392 - } else {
393 - $textreplace = $tags;
394 - }
395 -
396 - foreach ($variables as $var) {
397 - if (empty($email->$var)) continue;
398 - $email->$var = $this->replaceDText($email->$var, in_array($var, $htmlVars) ? $tags : $textreplace);
399 - }
400 - }
401 -
402 - public function replaceDText($text, $replacement)
403 - {
404 - if (is_array($text)) {
405 - foreach ($text as $i => &$oneCell) {
406 - if (empty($oneCell)) continue;
407 - $oneCell = $this->replaceDText($oneCell, $replacement);
408 - }
409 - } elseif (is_string($text) && !empty($text)) {
410 - foreach ($replacement as $code => $value) {
411 - $codes = [$code, urlencode($code)];
412 - if (is_null($value)) {
413 - $value = '';
414 - }
415 - $safePregValue = str_replace('$', '\$', $value);
416 -
417 - foreach ($codes as $oneCode) {
418 - $text = preg_replace(
419 - '#<span[^>]+'.preg_quote($oneCode, '#').'.+</em>[^<]*</span>#Uis',
420 - $safePregValue,
421 - $text
422 - );
423 -
424 - $text = preg_replace(
425 - '#(<tr[^>]+)data-dynamic="'.preg_quote($oneCode, '#').'"([^>]+>[^<]*<td[^>]*>).+</i>[^<]*</td>[^<]*</tr>#Uis',
426 - '${1}${2}'.$safePregValue.'</td></tr>',
427 - $text
428 - );
429 -
430 - $text = str_replace($oneCode, $value, $text);
431 - }
432 - }
433 - }
434 -
435 - return $text;
436 - }
437 -
438 - public function extractTags($email, $tagfamily)
439 - {
440 - $results = [];
441 -
442 - $match = '#(?:{|%7B)'.$tagfamily.'(?:%3A|\\:)(.*)(?:}|%7D)#Ui';
443 - $variables = [
444 - 'subject',
445 - 'AltBody',
446 - 'body',
447 - 'From',
448 - 'FromName',
449 - 'ReplyTo',
450 - 'ReplyName',
451 - 'bcc',
452 - 'cc',
453 - 'fromname',
454 - 'fromemail',
455 - 'replyname',
456 - 'replyemail',
457 - 'params',
458 - 'preheader',
459 - ];
460 - $found = false;
461 - foreach ($variables as $var) {
462 - if (empty($email->$var)) continue;
463 -
464 - if (is_array($email->$var)) {
465 - foreach ($email->$var as $i => $arrayField) {
466 - if (empty($arrayField)) continue;
467 -
468 - if (is_array($arrayField)) {
469 - foreach ($arrayField as $a => $oneval) {
470 - $found = preg_match_all($match, $oneval, $results[$var.$i.'-'.$a]) || $found;
471 - if (empty($results[$var.$i.'-'.$a][0])) unset($results[$var.$i.'-'.$a]);
472 - }
473 - } else {
474 - $found = preg_match_all($match, $arrayField, $results[$var.$i]) || $found;
475 - if (empty($results[$var.$i][0])) unset($results[$var.$i]);
476 - }
477 - }
478 - } else {
479 - $found = preg_match_all($match, $email->$var, $results[$var]) || $found;
480 - if (empty($results[$var][0])) unset($results[$var]);
481 - }
482 - }
483 -
484 - if (!$found) {
485 - return [];
486 - }
487 -
488 - $tags = [];
489 - foreach ($results as $var => $allresults) {
490 - foreach ($allresults[0] as $i => $oneTag) {
491 - if (isset($tags[$oneTag])) {
492 - continue;
493 - }
494 - $tags[$oneTag] = $this->extractTag($allresults[1][$i]);
495 - }
496 - }
497 -
498 - return $tags;
499 - }
500 -
501 - public function extractTag($oneTag)
502 - {
503 - $oneTag = str_replace(['[time]+', '[time]-'], [urlencode('[time]+'), urlencode('[time]-')], $oneTag);
504 - $arguments = explode('|', strip_tags(urldecode($oneTag)));
505 - $tag = new \stdClass();
506 - $tag->id = $arguments[0];
507 - $tag->default = '';
508 - for ($i = 1, $a = count($arguments) ; $i < $a ; $i++) {
509 - $args = explode(':', $arguments[$i], 2);
510 - $arg0 = trim($args[0]);
511 - if (empty($arg0)) continue;
512 -
513 - if (isset($args[1])) {
514 - $tag->$arg0 = $args[1];
515 - if (isset($args[2])) {
516 - $tag->{$args[0]} .= ':'.$args[2];
517 - }
518 - } else {
519 - $tag->$arg0 = true;
520 - }
521 - }
522 -
523 - return $tag;
524 - }
525 -
526 - public function wrapText($text, $tag)
527 - {
528 - $this->wraped = false;
529 -
530 - if (!empty($tag->wrap)) $tag->wrap = intval($tag->wrap);
531 - if (empty($tag->wrap)) return $text;
532 -
533 - $allowedTags = [
534 - 'b',
535 - 'strong',
536 - 'i',
537 - 'em',
538 - 'a',
539 - 'p',
540 - 'div',
541 - 'h2',
542 - 'h3',
543 - 'h4',
544 - 'h5',
545 - 'h6',
546 - ];
547 -
548 - $aloneAllowedTags = [
549 - 'br',
550 - 'img',
551 - ];
552 -
553 - $newText = strip_tags($text, '<'.implode('><', array_merge($allowedTags, $aloneAllowedTags)).'>');
554 -
555 - $newText = preg_replace('/^(\s|\n|(<br[^>]*>))+/i', '', trim($newText));
556 - $newText = preg_replace('/(\s|\n|(<br[^>]*>))+$/i', '', trim($newText));
557 -
558 - $newText = str_replace(['&lt', '&gt'], ['<', '>'], $newText);
559 -
560 - $numChar = strlen($newText);
561 -
562 - $numCharStrip = strlen(strip_tags($newText));
563 -
564 - if ($numCharStrip <= $tag->wrap) {
565 - return $newText;
566 - }
567 -
568 - $this->wraped = true;
569 -
570 - $open = [];
571 -
572 - $write = true;
573 -
574 - $countStripChar = 0;
575 -
576 - for ($i = 0 ; $i < $numChar ; $i++) {
577 - if ($newText[$i] == '<') {
578 - foreach ($allowedTags as $oneAllowedTag) {
579 - if ($numChar >= ($i + strlen($oneAllowedTag) + 1) && substr($newText, $i, strlen($oneAllowedTag) + 1) == '<'.$oneAllowedTag && (in_array(
580 - $newText[$i + strlen($oneAllowedTag) + 1],
581 - [' ', '>']
582 - ))) {
583 - $write = false;
584 - $open[] = '</'.$oneAllowedTag.'>';
585 - }
586 -
587 - if ($numChar >= ($i + strlen($oneAllowedTag) + 2) && substr($newText, $i, strlen($oneAllowedTag) + 2) == '</'.$oneAllowedTag) {
588 - if (end($open) == '</'.$oneAllowedTag.'>') {
589 - array_pop($open);
590 - }
591 - }
592 - }
593 -
594 - foreach ($aloneAllowedTags as $oneAllowedTag) {
595 - if ($numChar >= ($i + strlen($oneAllowedTag) + 1) && substr($newText, $i, strlen($oneAllowedTag) + 1) == '<'.$oneAllowedTag && (in_array(
596 - $newText[$i + strlen($oneAllowedTag) + 1],
597 - [' ', '/', '>']
598 - ))) {
599 - $write = false;
600 - }
601 - }
602 - }
603 -
604 - if ($write) {
605 - $countStripChar++;
606 - }
607 -
608 - if ($newText[$i] == ">") {
609 - $write = true;
610 - }
611 -
612 - if ($newText[$i] == " " && $countStripChar >= $tag->wrap && $write) {
613 - $newText = substr($newText, 0, $i).'...';
614 -
615 - $open = array_reverse($open);
616 - $newText = $newText.implode('', $open);
617 -
618 - break;
619 - }
620 - }
621 -
622 - $newText = preg_replace('/^(\s|\n|(<br[^>]*>))+/i', '', trim($newText));
623 - $newText = preg_replace('/(\s|\n|(<br[^>]*>))+$/i', '', trim($newText));
624 -
625 - return $newText;
626 - }
627 -
628 - public function getStandardDisplay($format)
629 - {
630 - if (empty($format->tag->format)) $format->tag->format = 'TOP_LEFT';
631 - if (!in_array($format->tag->format, ['TOP_LEFT', 'TOP_RIGHT', 'TITLE_IMG', 'TITLE_IMG_RIGHT', 'CENTER_IMG', 'TOP_IMG', 'COL_LEFT', 'COL_RIGHT'])) {
632 - $format->tag->format = 'TOP_LEFT';
633 - }
634 -
635 - $invertValues = [
636 - 'TOP_LEFT' => 'TOP_RIGHT',
637 - 'TITLE_IMG' => 'TITLE_IMG_RIGHT',
638 - 'COL_LEFT' => 'COL_RIGHT',
639 - 'TOP_RIGHT' => 'TOP_LEFT',
640 - 'TITLE_IMG_RIGHT' => 'TITLE_IMG',
641 - 'COL_RIGHT' => 'COL_LEFT',
642 - ];
643 - if (!empty($format->tag->invert) && !empty($invertValues[$format->tag->format])) {
644 - $format->tag->format = $invertValues[$format->tag->format];
645 - }
646 -
647 - $image = '';
648 - if (!empty($format->imagePath)) {
649 - $style = '';
650 - $linkStyle = '';
651 -
652 - if (in_array($format->tag->format, ['TOP_LEFT', 'TITLE_IMG'])) {
653 - $style = 'left';
654 - } elseif (in_array($format->tag->format, ['TOP_RIGHT', 'TITLE_IMG_RIGHT'])) {
655 - $style = 'right';
656 - }
657 -
658 - if (!empty($style)) {
659 - $linkStyle = 'style="float:'.$style.';"';
660 -
661 - if ($style === 'left') {
662 - $style = 'style="float:left; margin-right: 7px; margin-bottom: 7px;"';
663 - } else {
664 - $style = 'style="float:right; margin-left: 7px; margin-bottom: 7px;"';
665 - }
666 - }
667 -
668 - preg_match('#src="([^"]+)"#Uis', $format->imagePath, $matches);
669 - if (!empty($matches[1])) $format->imagePath = $matches[1];
670 - $altImage = !empty($format->altImage) ? $format->altImage : '';
671 - $image = '<img class="content_main_image" alt="'.acym_escape($altImage).'" src="'.$format->imagePath.'" '.$style.' />';
672 -
673 - if (!empty($format->imageCaption) && !in_array($format->tag->format, ['TITLE_IMG', 'TITLE_IMG_RIGHT'])) {
674 - $image .= '<p class="content_main_image_caption">'.acym_escape($format->imageCaption).'</p>';
675 - }
676 - }
677 -
678 - $result = '';
679 - if (in_array($format->tag->format, ['TITLE_IMG', 'TITLE_IMG_RIGHT'])) {
680 - $format->title = $image.$format->title;
681 - $image = '';
682 - }
683 -
684 - if (!empty($format->link) && !empty($image) && !empty($format->tag->clickableimg)) {
685 - $image = '<a target="_blank" href="'.$format->link.'" '.$linkStyle.'>'.$image.'</a>';
686 - }
687 -
688 - if ($format->tag->format === 'TOP_IMG' && !empty($image)) {
689 - $result = $image;
690 - $image = '';
691 - }
692 -
693 - if (in_array($format->tag->format, ['COL_LEFT', 'COL_RIGHT'])) {
694 - $maxWidth = empty($format->tag->maxwidth) ? '' : ' width: '.$format->tag->maxwidth.'px;';
695 - if (empty($image)) {
696 - $format->tag->format = 'TOP_LEFT';
697 - } else {
698 - $result = '<table><tr><td valign="middle" style="vertical-align: middle; padding-right: 7px;" class="acyleftcol">';
699 - if ($format->tag->format === 'COL_LEFT') {
700 - $result = '<table><tr><td valign="middle" style="vertical-align: middle; padding-right: 7px; '.$maxWidth.'" class="acyleftcol">';
701 - $result .= $image.'</td><td valign="top" class="acyrightcol">';
702 - }
703 - }
704 - }
705 -
706 - if (!empty($format->title)) {
707 - if (!empty($format->link) && !empty($format->tag->clickable)) {
708 - if (empty($format->tag->type) || $format->tag->type !== 'title') {
709 - $format->title = '<h2 class="acym_title">'.$format->title.'</h2>';
710 - }
711 -
712 - $title = '<a';
713 - if (!empty($format->tag->type) && $format->tag->type === 'title') $title .= ' class="acym_title"';
714 - $title .= ' href="'.$format->link.'" target="_blank" name="'.$this->name.'-'.$format->tag->id.'">';
715 - $title .= $format->title;
716 - $title .= '</a>';
717 - $format->title = $title;
718 - } else {
719 - if (empty($format->tag->type) || $format->tag->type != 'title') {
720 - $format->title = '<h2 class="acym_title">'.$format->title.'</h2>';
721 - }
722 - }
723 -
724 - $result .= $format->title;
725 - }
726 -
727 - if (!empty($format->afterTitle)) {
728 - $result .= $format->afterTitle;
729 - }
730 -
731 - if (!empty($format->description)) {
732 - $format->description = $this->wrapText($format->description, $format->tag);
733 - }
734 - $this->wrappedText = $format->description;
735 -
736 -
737 - $rowText = '<div class="acydescription">';
738 - $endRow = '</div><br />';
739 - if (in_array($format->tag->format, ['TOP_LEFT', 'TOP_RIGHT', 'TITLE_IMG', 'TITLE_IMG_RIGHT', 'TOP_IMG'])) {
740 - if (!empty($image) || !empty($format->description)) {
741 - $result .= $rowText.$image.$format->description.$endRow;
742 - }
743 - } elseif ($format->tag->format == 'CENTER_IMG') {
744 - if (!empty($image)) {
745 - $result .= '<div class="acymainimage">'.$image.$endRow;
746 - }
747 -
748 - if (!empty($format->description)) {
749 - $result .= $rowText.$format->description.$endRow;
750 - }
751 - } elseif (in_array($format->tag->format, ['COL_LEFT', 'COL_RIGHT'])) {
752 - if (!empty($format->description)) {
753 - $result .= $rowText.$format->description.$endRow;
754 - }
755 -
756 - if ($format->tag->format === 'COL_RIGHT') {
757 - $result .= '</td><td valign="middle" style="vertical-align: middle; padding-left: 7px; '.$maxWidth.'" class="acyrightcol">'.$image;
758 - }
759 - $result .= '</td></tr></table>';
760 - }
761 -
762 - if (!empty($format->customFields)) {
763 - $result .= '<table style="width:100%;" class="customfieldsarea"><tr>';
764 -
765 - $format->cols = empty($format->tag->nbcols) ? 1 : intval($format->tag->nbcols);
766 - if (empty($format->cols)) $format->cols = 1;
767 -
768 - $i = 0;
769 - foreach ($format->customFields as $oneField) {
770 - if ($i != 0 && $i % $format->cols == 0) $result .= '</tr><tr>';
771 -
772 - $result .= '<td nowrap="nowrap" class="cf';
773 -
774 - if (empty($oneField[1])) {
775 - $result .= 'value" colspan="2">';
776 - } else {
777 - $result .= 'label">'.$oneField[1].'</td><td class="cfvalue">';
778 - }
779 -
780 - $result .= $oneField[0].'</td>';
781 - $i++;
782 - }
783 -
784 - while ($i % $format->cols != 0) {
785 - $result .= '<td colspan="2"></td>';
786 - $i++;
787 - }
788 -
789 - $result .= '</tr></table>';
790 - }
791 -
792 - if (!empty($format->afterArticle)) {
793 - $result .= $format->afterArticle;
794 - }
795 -
796 - return $result;
797 - }
798 -
799 - public function managePicts($tag, $result)
800 - {
801 - if (!isset($tag->pict)) {
802 - return $result;
803 - }
804 -
805 - $imageHelper = new ImageHelper();
806 - if ($tag->pict === 'resized') {
807 - $imageHelper->maxHeight = empty($tag->maxheight) ? 150 : $tag->maxheight;
808 - $imageHelper->maxWidth = empty($tag->maxwidth) ? 150 : $tag->maxwidth;
809 - if ($imageHelper->available()) {
810 - $result = $imageHelper->resizePictures($result);
811 - } elseif (acym_isAdmin()) {
812 - acym_enqueueMessage($imageHelper->error, 'notice');
813 - }
814 - } elseif ($tag->pict == '0') {
815 - $result = $imageHelper->removePictures($result);
816 - }
817 -
818 - return acym_absoluteURL($result);
819 - }
820 -
821 - public function displayOptions(array $options, string $dynamicIdentifier, string $type = 'individual', $defaultValues = null): string
822 - {
823 - $suffix = preg_replace('[^a-zA-Z0-9]', '_', $dynamicIdentifier);
824 - $updateFunction = 'updateDynamic'.$suffix;
825 -
826 - $outputStructure = [
827 - 'topOptions' => [],
828 - 'options' => [],
829 - ];
830 - $jsOptionsMerge = [];
831 -
832 - foreach ($options as $option) {
833 - $currentLabel = $option['title'];
834 - $currentOption = '';
835 -
836 - if (isset($defaultValues->{$option['name']})) {
837 - $option['default'] = $defaultValues->{$option['name']};
838 - }
839 -
840 - if ($option['type'] === 'pictures') {
841 - $displayedPictures = $option['default'] ?? 'resized';
842 - if (isset($defaultValues->pict)) $displayedPictures = $defaultValues->pict;
843 - $resizeDisplay = 'resized' === $displayedPictures ? '' : 'style="display: none;"';
844 - $maxWidth = $defaultValues->maxwidth ?? 150;
845 - $maxHeight = $defaultValues->maxheight ?? 150;
846 -
847 - $valImages = [];
848 - $valImages[] = acym_selectOption('1', 'ACYM_YES');
849 - $valImages[] = acym_selectOption('resized', 'ACYM_RESIZED');
850 - $valImages[] = acym_selectOption('0', 'ACYM_NO');
851 - $currentOption .= '<div class="cell large-5 acym_plugin_field">'.acym_translation('ACYM_DISPLAY').'</div>';
852 - $currentOption .= '<div class="cell large-7">'.acym_radio(
853 - $valImages,
854 - 'pict'.$suffix,
855 - $displayedPictures,
856 - ['onclick' => $updateFunction.'();'],
857 - ['containerClass' => 'dcontent_pictures'],
858 - !acym_isAdmin()
859 - ).'</div>';
860 - $currentOption .= '<div id="pictsize'.$suffix.'" class="cell grid-x margin-y margin-top-1" '.$resizeDisplay.'>
861 - <div class="cell large-5 acym_plugin_field">'.acym_translation('ACYM_MAX_WIDTH').'</div>
862 - <div class="cell large-7">
863 - <input class="intext_input" name="pictwidth'.$suffix.'" type="number" onchange="'.$updateFunction.'();" value="'.intval($maxWidth).'"/>
864 - </div>
865 - <div class="cell large-5 acym_plugin_field">'.acym_translation('ACYM_MAX_HEIGHT').'</div>
866 - <div class="cell large-7">
867 - <input class="intext_input" name="pictheight'.$suffix.'" type="number" onchange="'.$updateFunction.'();" value="'.intval($maxHeight).'"/>
868 - </div>
869 - </div>';
870 - if (!empty($option['caption'])) {
871 - $currentOption .= '<div class="cell grid-x margin-top-1">';
872 - $currentOption .= '<label class="cell large-5 acym_plugin_field">'.acym_translation('ACYM_CAPTION').'</label>';
873 - $currentOption .= acym_radio(
874 - [
875 - acym_selectOption('1', 'ACYM_YES'),
876 - acym_selectOption('0', 'ACYM_NO'),
877 - ],
878 - 'caption'.$suffix,
879 - $defaultValues->caption ?? '0',
880 - ['onclick' => $updateFunction.'();'],
881 - ['containerClass' => 'cell large-7']
882 - );
883 - $currentOption .= '</div>';
884 -
885 - $jsOptionsMerge[] = 'otherinfo += "| caption:" + jQuery(\'input[name="caption'.$suffix.'"]:checked\').val();';
886 - }
887 -
888 - $jsOptionsMerge[] = '
889 - var _pictVal'.$suffix.' = jQuery(\'input[name="pict'.$suffix.'"]:checked\').val();
890 - otherinfo += "| pict:" + _pictVal'.$suffix.';
891 -
892 - if(_pictVal'.$suffix.' == "resized"){
893 - jQuery("#pictsize'.$suffix.'").show();
894 - otherinfo += "| maxwidth:" + jQuery(\'input[name="pictwidth'.$suffix.'"]\').val();
895 - otherinfo += "| maxheight:" + jQuery(\'input[name="pictheight'.$suffix.'"]\').val();
896 - }else{
897 - jQuery("#pictsize'.$suffix.'").hide();
898 - }';
899 - } elseif ($option['type'] === 'checkbox') {
900 - if (!empty($option['default'])) {
901 - $checkedValues = explode(',', $option['default']);
902 - foreach ($option['options'] as $key => $oneOption) {
903 - $oneOption[1] = in_array($key, $checkedValues);
904 - $option['options'][$key] = $oneOption;
905 - }
906 - }
907 -
908 - $currentOption .= '<div class="cell grid-x">';
909 - foreach ($option['options'] as $value => $title) {
910 - $currentOption .= '<div class="cell medium-6" '.(empty($title[2]) ? '' : $title[2]).'>
911 - <input type="checkbox" name="'.acym_escape($option['name'].$suffix).'" value="'.acym_escape($value).'" id="'.acym_escape(
912 - $value.$suffix
913 - ).'" onclick="'.$updateFunction.'();" '.($title[1] ? 'checked="checked"' : '').'/>
914 - <label style="margin-left:5px" for="'.acym_escape($value.$suffix).'">'.acym_translation($title[0]).'</label>
915 - </div>';
916 - }
917 - $currentOption .= '</div>';
918 -
919 - if (empty($option['separator'])) $option['separator'] = ',';
920 -
921 - $jsOptionsMerge[] = 'var _checked'.$option['name'].$suffix.' = [];
922 - jQuery("input:checkbox[name='.$option['name'].$suffix.']:checked").each(function(){
923 - _checked'.$option['name'].$suffix.'.push(jQuery(this).val());
924 - });
925 - if(_checked'.$option['name'].$suffix.'.length) otherinfo += "| '.$option['name'].':" + _checked'.$option['name'].$suffix.'.join("'.$option['separator'].'");';
926 - } elseif ($option['type'] === 'boolean') {
927 - if ($option['name'] === 'autologin' && $this->config->get('autologin_urls', 0) != 1) {
928 - continue;
929 - }
930 -
931 - $currentOption .= acym_boolean(
932 - $option['name'].$suffix,
933 - $option['default'],
934 - $option['name'].$suffix,
935 - ['onclick' => $updateFunction.'();']
936 - );
937 -
938 - $jsOptionsMerge[] = 'otherinfo += "| '.$option['name'].':" + jQuery(\'input[name="'.$option['name'].$suffix.'"]:checked\').val();';
939 - } elseif ($option['type'] === 'radio') {
940 - $radioOptions = [];
941 - foreach ($option['options'] as $value => $title) {
942 - $radioOptions[] = acym_selectOption($value, $title);
943 - }
944 -
945 - $currentOption .= acym_radio(
946 - $radioOptions,
947 - $option['name'].$suffix,
948 - $option['default'],
949 - ['onclick' => $updateFunction.'();'],
950 - ['pluginMode' => true],
951 - !acym_isAdmin()
952 - );
953 - $jsOptionsMerge[] = 'otherinfo += "| '.$option['name'].':" + jQuery(\'input[name="'.$option['name'].$suffix.'"]:checked\').val();';
954 - } elseif ($option['type'] === 'select') {
955 - $selectOptions = [];
956 - foreach ($option['options'] as $value => $title) {
957 - if (is_object($title)) {
958 - $selectOptions[] = acym_selectOption($title->value, $title->text);
959 - } else {
960 - $selectOptions[] = acym_selectOption($value, $title);
961 - }
962 - }
963 -
964 - $default = empty($option['default']) ? null : $option['default'];
965 - if (!empty($default) && strpos($default, ',')) [$default, $defaultOrder] = explode(',', $default);
966 -
967 - $attributes = [
968 - 'onchange' => $updateFunction.'();',
969 - 'id' => $option['name'].$suffix,
970 - ];
971 - if ($option['name'] === 'order') {
972 - $attributes['class'] = 'acym__dynamics__ordering__select';
973 - }
974 - $currentOption .= acym_select(
975 - $selectOptions,
976 - $option['name'].$suffix,
977 - $default,
978 - $attributes
979 - );
980 -
981 - if ($option['name'] === 'order') {
982 - $dirs = [
983 - 'desc' => acym_translation('ACYM_DESC'),
984 - 'asc' => acym_translation('ACYM_ASC'),
985 - ];
986 - if (empty($defaultOrder)) $defaultOrder = empty($option['defaultdir']) ? null : $option['defaultdir'];
987 - $currentOption .= ' '.acym_select(
988 - $dirs,
989 - 'orderdir'.$suffix,
990 - $defaultOrder,
991 - [
992 - 'onchange' => $updateFunction.'();',
993 - 'style' => 'width: 115px;',
994 - 'class' => 'acym__dynamics__ordering__select',
995 - ]
996 - );
997 -
998 - $jsOptionsMerge[] = 'otherinfo += "| '.$option['name'].':" + jQuery(\'[name="'.$option['name'].$suffix.'"]\').val() + "," + jQuery(\'[name="orderdir'.$suffix.'"]\').val();';
999 - } else {
1000 - $jsOptionsMerge[] = 'otherinfo += "| '.$option['name'].':" + jQuery(\'[name="'.$option['name'].$suffix.'"]\').val();';
1001 - }
1002 - } elseif ($option['type'] === 'multiselect') {
1003 - $selectOptions = [];
1004 - foreach ($option['options'] as $value => $title) {
1005 - $selectOptions[] = acym_selectOption($value, $title);
1006 - }
1007 -
1008 -
1009 - if (!isset($option['default'])) $option['default'] = [];
1010 - if (!is_array($option['default'])) $option['default'] = explode(',', $option['default']);
1011 -
1012 - $currentOption .= acym_selectMultiple(
1013 - $selectOptions,
1014 - $option['name'].$suffix,
1015 - $option['default'],
1016 - ['onchange' => $updateFunction.'();', 'id' => $option['name'].$suffix]
1017 - );
1018 -
1019 - $jsOptionsMerge[] = '
1020 - var theMultiSelect = document.querySelector(\'[name="'.$option['name'].$suffix.'[]"]\');
1021 - var selectedOptions = [];
1022 - for(var i = 0 ; i < theMultiSelect.length ; i++){
1023 - if(theMultiSelect[i].selected){
1024 - selectedOptions.push(theMultiSelect[i].value);
1025 - }
1026 - }
1027 - otherinfo += "| '.$option['name'].':" + selectedOptions.join(",");';
1028 - } elseif ($option['type'] === 'text') {
1029 - if (!isset($option['default'])) $option['default'] = '';
1030 - $class = empty($option['class']) ? 'acym_plugin_text_field' : $option['class'];
1031 - $placeholder = empty($option['placeholder']) ? '' : ' placeholder="'.acym_escape($option['placeholder']).'"';
1032 - $currentOption .= '<input
1033 - type="text"
1034 - name="'.$option['name'].$suffix.'"
1035 - id="'.$option['name'].$suffix.'"
1036 - onchange="'.$updateFunction.'();"
1037 - value="'.acym_escape($option['default']).'"
1038 - class="'.acym_escape($class).'" '.$placeholder.'/>';
1039 - $jsOptionsMerge[] = 'otherinfo += "| '.$option['name'].':" + jQuery(\'input[name="'.$option['name'].$suffix.'"]\').val();';
1040 - } elseif ($option['type'] === 'number') {
1041 - $min = empty($option['min']) ? ' min="0"' : ' min="'.$option['min'].'"';
1042 - $max = empty($option['max']) ? '' : ' max="'.$option['max'].'"';
1043 - $class = empty($option['class']) ? 'acym_plugin_text_field' : $option['class'];
1044 - $currentOption .= '<input type="number"'.$min.$max.' name="'.$option['name'].$suffix.'" id="'.$option['name'].$suffix.'" onchange="'.$updateFunction.'();" value="'.intval(
1045 - $option['default']
1046 - ).'" class="'.acym_escape($class).'" />';
1047 - $jsOptionsMerge[] = 'otherinfo += "| '.$option['name'].':" + jQuery(\'input[name="'.$option['name'].$suffix.'"]\').val();';
1048 - } elseif ($option['type'] === 'intextfield') {
1049 - $inputType = 'text';
1050 - if (!empty($option['isNumber']) && $option['isNumber'] === 1) $inputType = 'number';
1051 - $currentOption .= acym_translationSprintf(
1052 - $option['text'],
1053 - '<input type="'.$inputType.'" name="'.$option['name'].$suffix.'" id="'.$option['name'].$suffix.'" class="intext_input" value="'.acym_escape(
1054 - $option['default']
1055 - ).'" onchange="'.$updateFunction.'();"/>'
1056 - );
1057 - $jsOptionsMerge[] = 'otherinfo += "| '.$option['name'].':" + jQuery(\'input[name="'.$option['name'].$suffix.'"]\').val();';
1058 - } elseif ($option['type'] === 'date') {
1059 - $relativeTime = '-';
1060 - if (!empty($option['relativeDate'])) $relativeTime = $option['relativeDate'];
1061 - if (!empty($option['default']) && !is_numeric($option['default']) && false === strpos($option['default'], '[time]')) {
1062 - $option['default'] = strtotime($option['default']);
1063 - }
1064 - $currentOption .= acym_dateField($option['name'].$suffix, $option['default'], '', ' onchange="'.$updateFunction.'();"', $relativeTime);
1065 - $jsOptionsMerge[] = 'otherinfo += "| '.$option['name'].':" + jQuery(\'input[name="'.$option['name'].$suffix.'"]\').val();';
1066 - } elseif ($option['type'] === 'language') {
1067 - $languageOptions = [];
1068 - $languageOptions['any'] = acym_translation('ACYM_ANY');
1069 -
1070 - $languages = acym_getLanguages(true);
1071 - foreach ($languages as $language) {
1072 - $languageOptions[$language->language] = $language->name;
1073 - }
1074 -
1075 - if (empty($option['default'])) {
1076 - $option['default'] = acym_getVar('string', 'language');
1077 - if (acym_isMultilingual() && (empty($option['default']) || $option['default'] === 'main')) {
1078 - $option['default'] = $this->config->get('multilingual_default');
1079 - }
1080 - }
1081 -
1082 - $currentOption .= acym_select(
1083 - $languageOptions,
1084 - $option['name'].$suffix,
1085 - empty($option['default']) ? null : $option['default'],
1086 - [
1087 - 'onchange' => $updateFunction.'();',
1088 - 'id' => $option['name'].$suffix,
1089 - ]
1090 - );
1091 -
1092 - $jsOptionsMerge[] = 'otherinfo += "| '.$option['name'].':" + jQuery(\'[name="'.$option['name'].$suffix.'"]\').val();';
1093 - } elseif ($option['type'] == 'custom') {
1094 - $currentOption .= $option['output'];
1095 - $jsOptionsMerge[] = $option['js'];
1096 - }
1097 -
1098 - if (!empty($option['main']) || in_array($option['type'], ['pictures', 'checkbox'])) {
1099 - $outputStructure['topOptions'][$currentLabel] = $currentOption;
1100 -
1101 - if ($option['type'] === 'checkbox' && $currentLabel === 'ACYM_DISPLAY' && (!isset($option['format']) || $option['format'])) {
1102 - $formatOption = '<div class="grid-x">';
1103 - $formatOption .= '<div class="cell large-3">'.acym_translation('ACYM_FORMAT').'</div>';
1104 - $formatOption .= '<div class="cell large-9 dcontentFormatContainer">';
1105 -
1106 - $default = empty($defaultValues->format) ? 'TOP_LEFT' : $defaultValues->format;
1107 - $formats = ['TOP_LEFT', 'TOP_RIGHT', 'TITLE_IMG', 'TITLE_IMG_RIGHT', 'CENTER_IMG', 'TOP_IMG', 'COL_LEFT', 'COL_RIGHT'];
1108 - foreach ($formats as $oneFormat) {
1109 - $class = 'button-radio';
1110 - if ($default === $oneFormat) $class .= ' button-radio-selected';
1111 -
1112 - $formatOption .= '<button
1113 - class="'.$class.'"
1114 - acym-button-radio-group="dcontentFormat'.$suffix.'"
1115 - acym-data-type="'.$oneFormat.'"
1116 - acym-callback="'.$updateFunction.'">
1117 - <img alt="'.$oneFormat.'" src="'.ACYM_IMAGES.'editor/dcontent_formats/'.strtolower($oneFormat).'.png"/>
1118 - </button>';
1119 - }
1120 - $formatOption .= '</div>';
1121 -
1122 - if ($type === 'grouped') {
1123 - $formatOption .= '<div class="cell large-3">'.acym_translation('ACYM_ALTERNATE').acym_info('ACYM_ALTERNATE_DESC').'</div>';
1124 - $formatOption .= '<div class="cell large-9">';
1125 - $formatOption .= acym_boolean(
1126 - 'alternate'.$suffix,
1127 - !empty($defaultValues->alternate),
1128 - 'alternate'.$suffix,
1129 - ['onclick' => $updateFunction.'();']
1130 - );
1131 - $formatOption .= '</div>';
1132 -
1133 - $jsOptionsMerge[] = 'var alternate = jQuery(\'input[name="alternate'.$suffix.'"]:checked\').val();';
1134 - $jsOptionsMerge[] = 'if (!acym_helper.empty(alternate)) otherinfo += "| alternate";';
1135 - }
1136 -
1137 - $formatOption .= '</div>';
1138 -
1139 - $jsOptionsMerge[] = 'var selectedFormatOption = jQuery(\'.button-radio-selected[acym-button-radio-group="dcontentFormat'.$suffix.'"]\')';
1140 - $jsOptionsMerge[] = 'if (!acym_helper.empty(selectedFormatOption)) otherinfo += "| format:" + selectedFormatOption.attr("acym-data-type");';
1141 -
1142 - $outputStructure['topOptions']['ACYM_FORMAT'] = $formatOption;
1143 - }
1144 - continue;
1145 - }
1146 -
1147 - if (empty($option['section'])) {
1148 - $option['section'] = 'ACYM_OTHER_OPTIONS';
1149 - }
1150 -
1151 - $currentLabel = acym_translation($currentLabel);
1152 - if (!empty($option['tooltip'])) {
1153 - $currentLabel .= '&nbsp;'.acym_info($option['tooltip'], 'acym_plugin_field_'.$option['name']);
1154 - }
1155 - $currentLabel = '<label class="cell large-5 acym_plugin_field acym_plugin_field_'.$option['type'].'" for="'.acym_escape(
1156 - $option['name'].$suffix
1157 - ).'">'.$currentLabel.'</label>';
1158 -
1159 - $outputStructure['options'][$option['section']][$currentLabel] = $currentOption;
1160 - }
1161 -
1162 - if (!empty($outputStructure['options'])) {
1163 - foreach ($outputStructure['options'] as $section => $options) {
1164 - $formattedOptions = '';
1165 - foreach ($options as $label => $option) {
1166 - $formattedOptions .= '<div class="cell grid-x margin-bottom-1">'.$label;
1167 - $formattedOptions .= '<div class="cell large-7">'.$option.'</div>';
1168 - $formattedOptions .= '</div>';
1169 - }
1170 - $outputStructure['topOptions'][$section] = $formattedOptions;
1171 - }
1172 - }
1173 -
1174 - $output = '';
1175 - if (!empty($outputStructure['topOptions'])) {
1176 - foreach ($outputStructure['topOptions'] as $label => $oneOption) {
1177 - $output .= '<p class="acym__wysid__right__toolbar__p acym__wysid__right__toolbar__p__open acym__title">';
1178 - $output .= acym_translation($label).'<i class="acymicon-keyboard-arrow-up"></i>';
1179 - $output .= '</p>';
1180 - $output .= '<div class="acym__wysid__right__toolbar__design--show acym__wysid__right__toolbar__design acym__wysid__context__modal__container grid-x">';
1181 - $output .= $oneOption;
1182 - $output .= '</div>';
1183 - }
1184 - }
1185 -
1186 - $output .= '
1187 - <script type="text/javascript">
1188 - var _selectedRows'.$suffix.' = [];
1189 - var _selectedRows = [];
1190 - if("undefined" === typeof _additionalInfo'.$suffix.') {
1191 - var _additionalInfo'.$suffix.' = {};
1192 - }
1193 - ';
1194 - if (!empty($defaultValues->id) && (empty($defaultValues->defaultPluginTab) || $dynamicIdentifier === $defaultValues->defaultPluginTab)) {
1195 - $delimiter = strpos($defaultValues->id, '-') ? '-' : ',';
1196 - $selected = explode($delimiter, $defaultValues->id);
1197 -
1198 - foreach ($selected as $value) {
1199 - if (empty($value)) continue;
1200 - $output .= '_selectedRows'.$suffix.'['.intval($value).'] = true;
1201 - ';
1202 - }
1203 - }
1204 -
1205 - $output .= '
1206 - function applyContent'.$suffix.'(contentid, row){
1207 - if(_selectedRows'.$suffix.'[contentid]){
1208 - jQuery(row).removeClass("selected_row");
1209 - delete _selectedRows'.$suffix.'[contentid];
1210 - }else{
1211 - ';
1212 -
1213 - if ('individual' === $type) {
1214 - $output .= '
1215 - for(let elementKey in _selectedRows'.$suffix.') {
1216 - if(!_selectedRows'.$suffix.'.hasOwnProperty(elementKey)) continue;
1217 -
1218 - jQuery(\'[data-id="\' + elementKey + \'"]\').removeClass("selected_row");
1219 - delete _selectedRows'.$suffix.'[elementKey];
1220 - }
1221 - ';
1222 - }
1223 -
1224 - $output .= '
1225 - jQuery(row).addClass("selected_row");
1226 - _selectedRows'.$suffix.'[contentid] = true;
1227 - }
1228 - '.$updateFunction.'();
1229 -
1230 - if(typeof _selectedRows !== "undefined"){
1231 - _selectedRows = _selectedRows'.$suffix.';
1232 - }
1233 - }
1234 -
1235 - function '.$updateFunction.'(){
1236 - var tag = "";
1237 - var otherinfo = "";
1238 -
1239 - '.implode("\r\n\r\n", $jsOptionsMerge).'
1240 -
1241 - for (let [index, info] of Object.entries(_additionalInfo'.$suffix.')){
1242 - otherinfo += "| "+index+":"+info;
1243 - }
1244 - ';
1245 -
1246 - if ($type == 'individual') {
1247 - $output .= '
1248 - for(var i in _selectedRows'.$suffix.'){
1249 - if(!_selectedRows'.$suffix.'.hasOwnProperty(i)) continue;
1250 -
1251 - tag = tag + "{'.$dynamicIdentifier.':" + i + otherinfo + "}";
1252 - }';
1253 - } elseif ($type == 'grouped') {
1254 - $output .= '
1255 - tag = "{'.$dynamicIdentifier.':";
1256 - for(var icat in _selectedRows'.$suffix.'){
1257 - if(!_selectedRows'.$suffix.'.hasOwnProperty(icat)) continue;
1258 - tag += icat + "-";
1259 - }
1260 - tag += otherinfo + "}";';
1261 - } elseif ($type == 'simple') {
1262 - $output .= '
1263 - tag = "{'.$dynamicIdentifier.':" + otherinfo + "}";';
1264 - }
1265 -
1266 - $output .= '
1267 - acym_editorWysidDynamic.insertDContent(tag);
1268 - }
1269 -
1270 - function addAdditionalInfo'.$suffix.'(index, value){
1271 - _additionalInfo'.$suffix.'[index] = value;
1272 - '.$updateFunction.'();
1273 - }
1274 - </script>';
1275 -
1276 - if ($type == 'individual') {
1277 - acym_trigger('displayCustomViewEditor', [&$output], 'plgAcym'.ucfirst($dynamicIdentifier));
1278 - $output .= '<input type="hidden" id="acym__dynamic__update__function" value="'.$updateFunction.'">';
1279 - }
1280 -
1281 - return $output;
1282 - }
1283 -
1284 - public function translateItem(object &$item, object &$tag, string $referenceTable, int $referenceId = 0): void
1285 - {
1286 - if (!acym_isExtensionActive('com_falang')) {
1287 - return;
1288 - }
1289 -
1290 - if (!empty($tag->falang)) {
1291 - $langId = $tag->falang;
1292 - } elseif (!empty($tag->lang)) {
1293 - $langId = intval(substr($tag->lang, strpos($tag->lang, ',') + 1));
1294 - } elseif (!empty($this->contextLanguage)) {
1295 - $languages = acym_loadObjectList('SELECT `lang_id`, `lang_code` FROM #__languages', 'lang_code');
1296 - if (!empty($languages[$this->contextLanguage])) {
1297 - $langId = $languages[$this->contextLanguage]->lang_id;
1298 - }
1299 - }
1300 -
1301 - if (empty($langId)) {
1302 - return;
1303 - }
1304 -
1305 - if (empty($referenceId)) {
1306 - $referenceId = $tag->id;
1307 - }
1308 -
1309 - $translations = acym_loadObjectList(
1310 - 'SELECT `reference_field`, `value`
1311 - FROM `#__falang_content`
1312 - WHERE `published` = 1
1313 - AND `reference_table` = '.acym_escapeDB($referenceTable).'
1314 - AND `language_id` = '.intval($langId).'
1315 - AND `reference_id` = '.intval($referenceId)
1316 - );
1317 -
1318 - if (empty($translations)) {
1319 - return;
1320 - }
1321 -
1322 - foreach ($translations as $oneTranslation) {
1323 - if (empty($oneTranslation->value)) {
1324 - continue;
1325 - }
1326 -
1327 - $translatedField = $oneTranslation->reference_field;
1328 - $item->$translatedField = $oneTranslation->value;
1329 - }
1330 - }
1331 -
1332 - public function createDummyEmailObject(int $mailId, string $code, string $previewBody)
1333 - {
1334 - if (!empty($mailId)) {
1335 - $mailClass = new MailClass();
1336 - $email = $mailClass->getOneById($mailId);
1337 - }
1338 -
1339 - if (empty($email)) {
1340 - $email = new \stdClass();
1341 - $email->id = 0;
1342 - $email->name = '';
1343 - $email->subject = '';
1344 - $email->from_name = '';
1345 - $email->from_email = '';
1346 - $email->reply_to_name = '';
1347 - $email->reply_to_email = '';
1348 - $email->bcc = '';
1349 - $email->links_language = '';
1350 - }
1351 -
1352 - $language = acym_getVar('string', 'language', 'main');
1353 - if (!empty($language)) {
1354 - if ($language === 'main') {
1355 - $language = $this->config->get('multilingual_default', ACYM_DEFAULT_LANGUAGE);
1356 - }
1357 - $email->links_language = $language;
1358 - }
1359 -
1360 - $email->creation_date = acym_date('now', 'Y-m-d H:i:s', false);
1361 - $email->creator_id = acym_currentUserId();
1362 - $email->thumbnail = '';
1363 - $email->drag_editor = '1';
1364 - $email->type = MailClass::TYPE_STANDARD;
1365 - $email->settings = '';
1366 - $email->stylesheet = '';
1367 - $email->attachments = '';
1368 -
1369 - $email->body = $code;
1370 - $email->previewBody = $previewBody;
1371 -
1372 - return $email;
1373 - }
1374 -}