Всего 114 313 комментариев

Сергей Фещуков
18 января 2022, 09:52
0
Со стороны компонента msProductRemains такого сделать нельзя. Я не знаю как реализован импорт остатков в msImportExport, поэтому подсказать как в данном компоненте это сделать также не могу. На какой-то стороне в итоге придётся реализовать поиск товара по артикулу, а не по ID.
Василий Наумкин
18 января 2022, 05:58
0
getbootstrap.com/docs/5.1/migration/#rtl
Horizontal direction specific variables, utilities, and mixins have all been renamed to use logical properties like those found in flexbox layouts—e.g., start and end in lieu of left and right.
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]]
Алексей Соин
17 января 2022, 20:09
0
д это то понятно))) прост сам факт «апгрейда», особой ценности же такие изменения не несут) д и если даже само свойство называется margin-left, какой смысл делать его сокращением от margin start…
Alexey
17 января 2022, 20:04
0
tags — это свойство товара, не опция. Если нужно вывести свойство, то msOptions не годится.
Рушан
17 января 2022, 19:44
0
Сори сейчас исправлю!
Alexey
17 января 2022, 19:42
0
Привет! В описании «tegs», в коде «tags». Это так задумано?
Евгений Webinmd
17 января 2022, 19:20
0
margin start / margin end
Олег
17 января 2022, 18:46
0
Ниже сrриншоты настроек в Modx revo 2.6.4 — pl. У кого есть идеи, посчему не работает компонент, отзовитесь… Буду благодарен!




Stanislavsky
17 января 2022, 17:02
0
Жиза ) Это прям бесящая тема
Stanislavsky
17 января 2022, 17:01
-1
1. Вопрос не в оптимизации, а в читабельности кода. Тем более представь, что ты поменял функционал какого-то метода и тебе нужно менять еще и комментарий.
2. Смущает то, что нарушен принцип единой ответственности. Логичней же подключать кнопку, как компонент содержащий кнопку без лишних проверок, а не кнопку, которая может быть ссылкой и выполнять функцию ссылки.
3. Ну, расширять в перспективе не очень удобно, ИМХО и миграция будет больно проходить на Vue 3. На скрине обычный spread оператор. Ничего не мешает свой конфиг с пропсами замутить и так же сделать.