Всего 125 977 комментариев

Сергей Фещуков
18 января 2022, 09:52
0
Со стороны компонента msProductRemains такого сделать нельзя. Я не знаю как реализован импорт остатков в msImportExport, поэтому подсказать как в данном компоненте это сделать также не могу. На какой-то стороне в итоге придётся реализовать поиск товара по артикулу, а не по ID.
Fullstack
18 января 2022, 02:08
0
Короче да. Fenom-шаблон скомпилировался и закэшировался. Меняю значение только в сниппете — шаблон реагирует так же, как и до этого, что в сниппете ни выставляй.

Видимо условие закэшировалось вместе с шаблоном с тем значением, которое попало в кэш первый раз.
Нужен некэшируемый вывод плейсхолдера, как в стандартном MODX: [[!+placeholder]]
Fullstack
18 января 2022, 01:57
0
Более того!

Задаю внутри сниппета плейсхолдер
$modx->setPlaceholder('ttt', 'b');
Вывожу его на странице:
{if $_modx->getPlaceholder('ttt') == 'a'}
    <script>alert('ttt = a');</script>
{else}
    <script>alert('ttt else');</script>
{/if}
И у меня постоянно выводится, что «ttt = a» (вместо «ttt else»),
хотя я задаю значение плейсхолдера «b», а не «a».
Fullstack
18 января 2022, 00:33
0
Блин, из-за вставленного кода в данный топик в самом его начале (в первом посте), не могу изменить этот пост… Верстка modx.pro едет.

Вставлю сюда обновленный код:

fenom.php:
<?php
	header('Content-type: text/html; charset=utf-8');
	$r = '';
	if (isset($_POST['modx'])) {
		/*function process_params($p) {
			$r = preg_replace('/\&([A-Za-z0-9а-яА-ЯёЁ_\-]+)(\r\n\t\s)?\=(\r\n\t\s)?\`(.*?)\`(.*?)/u', '\'\\1\' => \'\\4\',\\5', $p);
			return $r;
		}
		function process_chunk($m) {
			$r = '{include \''.$m[1].'\'';
			if (isset($m[2])) {
				$p = ltrim($m[2]);
				if (isset($p[0]) && $p[0] == '?')
					$r .= ' : ['.process_params(substr($p[0], 1)).']';
			}
			return $r.'}';
		}
		function process_snippet($m) {
			if (empty($m) || !isset($m[1])) return false;
			$r = '{\''.$m[1].'\' | snippet';
			if (isset($m[2])) {
				$p = ltrim($m[2]);
				if (isset($p[0]) && $p[0] == '?')
					$r .= ' : ['.process_params(substr($p[0], 1)).']';
			}
			return $r.'}';
		}
		function process_tv($m) {
			return false;
		}
		function process_link($m) {
			return false;
		}
		function process_lang($m) {
			return false;
		}
		function process_setting($m) {
			return false;
		}
		function process_placeholder($m) {
			return false;
		}
		function convert($matches) {
			$m = $matches[1];
			$r = null;
			if ($m[0] == '-')
				return '{*'.substr($m, 1).'*}';

			$r = preg_replace('/\&([a-zA-Zа-яА-ЯёЁ0-9_\-\.]+)(.*?)\=(.*?)\`(.*?)\`/u', '\'\1\'\2 => \3\'\4\',', $m);

			if ($m[0] == '+') {
				if ($m[1] == '+') $r = preg_replace_callback('/^([a-zA-Zа-яА-ЯёЁ0-9_\-\.]+)(.*?)/u', 'process_setting', substr($m, 2));
				else $r = preg_replace_callback('/^([a-zA-Zа-яА-ЯёЁ0-9_\-\.]+)(.*?)/u', 'process_placeholder', substr($m, 1));
			}
			else if ($m[0] == '*') {
				$r = preg_replace_callback('/^([a-zA-Zа-яА-ЯёЁ0-9_\-\.]+)(.*?)/u', 'process_tv', substr($m, 1));
			}
			else if ($m[0] == '%') {
				$r = preg_replace_callback('/^([a-zA-Zа-яА-ЯёЁ0-9_\-\.]+)(.*?)/u', 'process_lang', substr($m, 1));
			}
			else if ($m[0] == '~') {
				$r = preg_replace_callback('/^([a-zA-Zа-яА-ЯёЁ0-9_\-\.]+)(.*?)/u', 'process_link', substr($m, 1));
			}
			else if ($m[0] == '$') {
				$r = preg_replace_callback('/^([a-zA-Zа-яА-ЯёЁ0-9_\-\.]+)(.*?)/u', 'process_chunk', substr($m, 1));
			}
			else {
				$snippet = preg_replace_callback('/^(\!?[a-zA-Zа-яА-ЯёЁ0-9_\-\.]+)(.*?)/u', 'process_snippet', $m);
				if ($snippet) $r = $snippet;
			}

			return $r ? $r : ($m ? '[['.$m.']]' : $matches[0]);
		}
		$r = preg_replace_callback('/\[\[(.*?)\]\]/u', 'convert', $_POST['modx']);*/

		$r = $_POST['modx'];
		//$r = mb_convert_encoding($_POST['modx'], 'utf-8', mb_detect_encoding($r));

		// [[- Комментарий ]]
		$r = mb_ereg_replace('\[\[\-(.*?)\]\]', '{*\1*}', $r);
		// [[~URL]]
		$r = mb_ereg_replace('\[\[\~([0-9]+)\]\]', '{\1 | url}', $r);
		// [[%язык]]
		$r = mb_ereg_replace('\[\[\%([a-zA-Z0-9\._]+)\]\]', '{$_modx->lexicon(\'\1\')}', $r);
		// [[++системная_настройка]]
		$r = mb_ereg_replace('\[\[\+\+([a-zA-Z0-9\._]+)\]\]', '{\'\1\' | option}', $r);
		// [[+плейс.холдер]]
		$r = mb_ereg_replace('\[\[(\!)?\+([a-zA-Z0-9\._]+\.[a-zA-Z0-9\._]+)\]\]', '{$_pls[\'\2\']}', $r);
		// [[+плейсхолдер]]
		$r = mb_ereg_replace('\[\[(\!)?\+([a-zA-Z0-9\._]+)\]\]', '{$\2}', $r);
		// [[*поле_ресурса]]
		$r = mb_ereg_replace('\[\[\*([a-zA-Z0-9\._]+)\]\]', '{$_modx->resource.\1}', $r);
		// [[$чанк]]
		$r = mb_ereg_replace('\[\[\$([a-zA-Z0-9\._]+)\]\]', '{include \'\1\'}', $r);
		$r = mb_ereg_replace('\[\[\$([a-zA-Z0-9\._]+)\?', '{\'\1\' | chunk : [', $r);
		// [[сниппет]]
		$r = mb_ereg_replace('\[\[(\!)?([a-zA-Z0-9\._]+)\]\]', '{\'\1\2\' | snippet}', $r);
		$r = mb_ereg_replace('\[\[(\!)?([a-zA-Z0-9\._]+)\?', '{\'\1\2\' | snippet : [', $r);
		// &параметр=`значение`
		$r = mb_ereg_replace('\&([a-zA-Z0-9\._]+)=`?([^\[\]\&]+)`', '\'\1\' => \'\2\',', $r);
		$r = str_replace('=> \'`\'', '=> \'\'', $r);
		$r = mb_ereg_replace('\',([\r\n\s\t]+)?\]\]', '\' \1]}', $r);
		//$r = mb_ereg_replace('\=\> \'(.*?)\'\]\}', '=> \'\1\' ]}', $r);

		$r = str_replace('&', '&', $r);
	}
?><!DOCTYPE html>
<html lang="ru">
<head>
	<meta charset="utf-8">
	<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
	<meta name="viewport" content="width=device-width, initial-scale=1.0">
	<title>MODX to Fenom</title>
	<meta name="robots" content="noindex, nofollow">
</head>
<body style="padding: 20px; margin: 0; font: 12px/normal 'SFMono-Regular','Menlo','Consolas','Liberation Mono','Courier New',monospace;">
	<style>
		textarea { width: 100%; height: 500px; font: inherit; }
	</style>
	<form action="" method="post">
		<textarea name="modx"><?php echo ''; echo str_replace('&', '&', isset($_POST['modx']) ? $_POST['modx'] :
'[[$chunk_name]]
[[$asd? ¶m=`value`]]
[[$asd?
	¶m=`Hello`
	&a_s_d=`ыфавыавыа`
]]

[[!+ph]]
[[!+place.holder]]

[[*parent]]
[[*template:is=`3`:then=`a`:else=`b`]]

[[- comment ]]

[[!uncached]]
[[cached]]
[[phpcode? ¶m=`Значение`]]
[[!snipp?
	¶m=`Привет`
	&PARAM=`Здравствуй`
]]

[[~123]]
[[%lang_var]]'); ?></textarea>
		<button type="submit">Конвертировать</button>
	</form>
	<?php
		if ($r) echo '
<hr>
<textarea>' . $r . '</textarea>';
	?>
</body>
</html>


Вместо странного символа должен быть знак & (амперсанда)
Kirill
18 января 2022, 00:22
0
Вопрос. Как его заставить работать по расписанию. У меня каждую ночь грузится с внешнего источника, по крону, n-ое количество картинок и json. Каждый день заходить в админку и руками жать на кнопку не хочется
Fullstack
17 января 2022, 22:49
0
В принципе у меня начало получаться новым путем делать мой конвертер. Еще предстоят работы, но вот это уже неплохо так действует:

$r = $_POST['modx'];
//$r = mb_convert_encoding($_POST['modx'], 'utf-8', mb_detect_encoding($r));

// [[- Комментарий ]]
$r = mb_ereg_replace('\[\[\-(.*?)\]\]', '{*\1*}', $r);
// [[~URL]]
$r = mb_ereg_replace('\[\[\~([0-9]+)\]\]', '{\1 | url}', $r);
// [[++системная_настройка]]
$r = mb_ereg_replace('\[\[\+\+([a-zA-Z0-9\._]+)\]\]', '{\'\1\' | option}', $r);
// [[+плейс.холдер]]
$r = mb_ereg_replace('\[\[(\!)?\+([a-zA-Z0-9\._]+\.[a-zA-Z0-9\._]+)\]\]', '{$_pls[\'\2\']}', $r);
// [[+плейсхолдер]]
$r = mb_ereg_replace('\[\[(\!)?\+([a-zA-Z0-9\._]+)\]\]', '{$\2}', $r);
// [[$чанк]]
$r = mb_ereg_replace('\[\[\$([a-zA-Z0-9\._]+)\]\]', '{include \'\1\'}', $r);
$r = mb_ereg_replace('\[\[\$([a-zA-Z0-9\._]+)\?', '{\'\1\' | chunk : [', $r);
// &параметр=`значение`
$r = mb_ereg_replace('\&([a-zA-Z0-9\._]+)=`?([^\[\]\&]+)`', '\'\1\' => \'\2\',', $r);
$r = str_replace('=> \'`\'', '=> \'\'', $r);
$r = mb_ereg_replace('\',([\r\n\s\t]+)?\]\]', '\'\1]}', $r);
$r = mb_ereg_replace('\=\> \'(.*?)\'\]\}', '=> \'\1\' ]}', $r);

$r = str_replace('&', '&', $r);
Алексей Соин
17 января 2022, 21:42
0
Ссылки вида [[~123]] не конвертируются.
а что же с ними происходит?)) [[~123]] -> {'123' | url}



Параметры [[+modx_setting]] должны преобразовываться в {'modx_setting' | option}.
[[+modx_setting]] — плейсхолдер, с чего вдруг он должен стать опцией? если имелось ввиду [[++modx_setting]] то он преобразуется в {'modx_setting' | config}

Плейсхолдеры надо не {'pholder' | placeholder}, а просто {$pholder}, но если в его имени есть точки, то {$_pls['pholder']}.
В любом случае, сказать точно что понадобится из вариантов вывода плейсхолдеров не получится, это надо уже самому смотреть и по ситуации применять один из выводов.

Также было бы круто, чтобы можно было вставлять целый HTML-шаблон с тегами MODX
Точно нет, не хватало потом выслушивать жалобы, что закинули в конвертер шаблон, а потом сайт не работает, надо смотреть, что именно правишь на сайте, а не бездумно пихать весь шаблон страницы и смотреть что получится.

Если есть: конструкции=`условий`, то просто писать о их наличии (и номерах строк), но не блокировать все конвертирование.
Если имеется ввиду модификаторы, то повторяюсь, тотже :default уже не имеет смысла использовать в fenom заместо него надо использовать {if ...}.



Параметры сниппетов и чанков Fenom было бы лучше конвертировать с одинарными кавычками ' вместо двойных ".
Какой практический смысл в этом? Я пользуюсь всегда двойными кавычками.
Сергей Шлоков
17 января 2022, 21:28
0
Кстати есть ли возможность проверить используется ли на странице где то стандартный парсер?
Он используется всегда.
Fullstack
17 января 2022, 21:03
0
Уже лучше, супер! Нужны маленькие доработочки:

Иногда нужны пустые параметры, они вырезаются:


Ссылки вида [[~123]] не конвертируются.

Параметры сниппетов и чанков Fenom было бы лучше конвертировать с одинарными кавычками ' вместо двойных ".

Параметры [[+modx_setting]] должны преобразовываться в {'modx_setting' | option}.

Плейсхолдеры надо не {'pholder' | placeholder}, а просто {$pholder}, но если в его имени есть точки, то {$_pls['pholder']}.

Также было бы круто, чтобы можно было вставлять целый HTML-шаблон с тегами MODX и чтобы конвертировались только они, а не вставлять каждое по отдельности

Если есть: конструкции=`условий`, то просто писать о их наличии (и номерах строк), но не блокировать все конвертирование.
Fullstack
17 января 2022, 20:24
0
Плейсы в микс-режиме это проблема, да.
Срабатывают только при первой загрузке страницы, а потом пропадают…
Рушан
17 января 2022, 20:12
0
И как же вывести в таком формате [[....]]?
Вот в таком формате всё отлично фильтрует пример: [[+price]]
Alexey
17 января 2022, 20:04
0
tags — это свойство товара, не опция. Если нужно вывести свойство, то msOptions не годится.
Рушан
17 января 2022, 19:44
0
Сори сейчас исправлю!
Alexey
17 января 2022, 19:42
0
Привет! В описании «tegs», в коде «tags». Это так задумано?
Олег
17 января 2022, 18:46
0
Ниже сrриншоты настроек в Modx revo 2.6.4 — pl. У кого есть идеи, посчему не работает компонент, отзовитесь… Буду благодарен!




Futuris
17 января 2022, 15:14
0
Попробую поотключать последовательно дополнения, может быть что-то перекрывает.
Олег
17 января 2022, 14:35
0
Роман, и коллеги, всем привет!
Роману спасибо за работу!
Такой вопрос, на MODX Revolution 2.6.4-pl — работает?
Miša Bulic
17 января 2022, 13:17
0
Спасибо, так помогло. Пробывал до этого через m2f.zencod.ru/ не вышло. Сейчас нормально. Кстати есть ли возможность проверить используется ли на странице где то стандартный парсер?
Артур Шевченко
17 января 2022, 12:39
0
Там события есть, повесь плагин.