Василий Наумкин

Василий Наумкин

Был в сети 10 июня 2026, 17:44
Заказы не принимаю
Да, так и есть. А выводит он 22 потому, что 2 было сохранено в прошлый раз.
Если по очереди комментировать вызовы setTVValue — хорошо видно.

А ваш хак отлично работает, хоть и выглядит это некрасиво.
if ($res = $modx->getObject('modResource', $modx->resource->id)) {
	$modx->resource->set('test', null);
	$res->setTVValue(1, 1);
	echo $res->getTVValue(1);

	$modx->resource->set('test', null);
	$res->setTVValue(1, 2);
	echo $res->getTVValue(1);
	die;
//12
}
Да хоть бы код в тег code оформил, хрен с ним, с «пожалуйста».
Работает без проблем, но только при одном условии — если вызывается не на странице, ТВ которой он должен обновить.
if ($res = $modx->getObject('modResource', 1)) {
	$res->setTVValue(1, 1);
	echo $res->getTVValue(1);

	$res->setTVValue(1, 2);
	echo $res->getTVValue(1);
	die;
// 12
}

А вот так — выдаёт прикольный глюк, очевидно связанный с кэшированием.
if ($res = $modx->getObject('modResource', $modx->resource->id)) {
	$res->setTVValue(1, 1);
	echo $res->getTVValue(1);

	$res->setTVValue(1, 2);
	echo $res->getTVValue(1);
	die;
// 22
}
Поэтому, переходим на обычный xPDO
if ($tv = $modx->getObject('modTemplateVarResource', array('tmplvarid' => 1, 'contentid' => $modx->resource->id))) {
	$tv->set('value', 1);
	echo $tv->get('value');
	//$tv->save(); //по желанию
		
	$tv->set('value', 2);
	echo $tv->get('value');
	die;
// 12
}

Почему выходит такая фигня — мне не ведомо, а копать исходники времени нет.
Немного поясню, почему сделано именно так.

В miniShop вы можете
добавлять товары с параметрами, то есть, id будет один и тот же, а свойства разные. В корзине это должно быть разными элементами, поэтому id в качестве ключа массива использовать нельзя.

При выводе корзины скрипт выводит все элементы корзины с ключиком, чтобы можно было удалить или изменить их количество, а на странице товара просто не ясно какой ключ выставлять — ведь в корзине он может быть несколько раз и с разным цветом (или еще чем).

Вам этот функционал, пока, не нужен, но решение универсальное, поэтому придется терпеть.
А кто вам на этой странице выставит плейсхолдер [[+key]]?

Его выставляет сниппет miniShop при генерации корзины, и работают они только в корзине. Зачем удалять товар из корзины на странице товара — это не логично ведь?

Если есть огромное желание сделать именно так — пишите сниппет и запускайте на странице товара. Он должен перебрать $_SESSION['minishop']['goods'], найти там товар и выставить плейсхолдер с ключом этой позиции.
Моя статья на Хабре про создание компонента — habrahabr.ru/post/126635/.
Официальная документация — rtfm.modx.com/display/revolution20/Custom+Manager+Pages

Но самый действенный способ, конечно, прокачивать знания разбираясь в том, как устроены чужие разработки. Иначе вы научитесь только тому, что вам рассказали в уроках.
Больше не будет таких потрясений, ибо теперь сайт работает с удаленными сервисами напрямую.

Про логин и пароль — а где ж их взять то?

Username не все сервисы передают, а если и передают, вы сами можете не знать, какой он там. Пароль просто не нужен — ибо авторизация идет через другой сервис. Email тоже когда как, идентификатор у каждого сервиса свой.

Такой вариант возможен только если регистрировать юзера классическим способом, а потом давать ему привязать учётки для быстрого входа. А мне такая регистрация не нужна.
Курсы закончатся послезавтра. Потом я накатаю заметку «как прошло», если кто-то пожелает там откликнуться — ура.

Пока что все дружно доделывают задания и задают вопросы. Никаких досок почета решили не делать, ибо это некорректно, по отношению к людям — вывешивать где-то их данные без выраженного согласия…