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

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

С нами с 08 декабря 2012; Место в рейтинге пользователей: #1
Василий Наумкин
27 декабря 2012, 15:29
0
А как сохранить новое значение в ТВ?

$modx->resource->save() не помогает, конечно. А если значение нужно только на время работы скрипта, и сохранять его не надо — то и ТВ ни к чему, можно любое имя написать.
Василий Наумкин
27 декабря 2012, 15:23
0
У меня оно и не сохраняется.

Это поле будет работать только во время выполнения скрипта. То есть, методом set мы выставляем любое поле с любым значением, потом можем его использовать как хотим, а после работы оно пропадает — ибо сохранить его некуда, в модели то его нет.

Если же ничего туда не писать, а просто print_r($modx->resource->get('test')); — то будут данные ТВ параметра.

Всё это очень интересно, но мне надо работать, так что не буду копать «почему всё именно так, а не иначе». Вообще, стараюсь не использовать ТВ, если это возможно.
Василий Наумкин
27 декабря 2012, 15:12
0
Судя по тому, что пишет Боб Рей — оно сохраняется в ТВ, а не в объект.
Василий Наумкин
27 декабря 2012, 15:09
0
Да, так и есть. А выводит он 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
}
Василий Наумкин
27 декабря 2012, 14:55
1
0
Да хоть бы код в тег 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
}

Почему выходит такая фигня — мне не ведомо, а копать исходники времени нет.
Василий Наумкин
27 декабря 2012, 13:39
0
Быстро подорвался и на вапрос атветил, да?
Василий Наумкин
27 декабря 2012, 07:32
0
Выглядит он очень старым, сложным и неповоротливым. Больше всего напоминает Quip.

У меня нет желания ставить и проверять.
Василий Наумкин
26 декабря 2012, 14:38
0
Немного поясню, почему сделано именно так.

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

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

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

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

Если есть огромное желание сделать именно так — пишите сниппет и запускайте на странице товара. Он должен перебрать $_SESSION['minishop']['goods'], найти там товар и выставить плейсхолдер с ключом этой позиции.
Василий Наумкин
26 декабря 2012, 13:53
0
Ошибка в коде ссылки
<a href="#" class="remFromCart" data-key="[[*id]]"></a>

Должно быть не [[*id]], а [[+key]]. Ибо товары удаляются не по номеру, а по ключу, который генерируется из номера страницы-товара и дополнительных свойств. Добавляются по номеру, да.

Вот цитата из оригинального чанка товара в корзине
<a href="#" class="remFromCartLink" title="Удалить из корзины" data-key="[[+key]]"><i class="icon-remove"></i></a>
Простыни кода я потёр.
Василий Наумкин
26 декабря 2012, 13:12
0
После апгрейда, миграции и подарка — не кажется, что дорого.

Скажу по секрету, мне еще и приходит по 20$ за каждого реферала, если он проработал 3 месяца. То есть, за довольного реферала, а не за всех подряд.
Василий Наумкин
26 декабря 2012, 12:16
0
502 Bad gateway — это отказ php, то есть, nginx не может получить от него ответ.

Значит, нужно смотреть в лог ошибок /var/log/nginx/имясайта-error.log. Подозреваю, что у вас там что-то работает неправильно.
Василий Наумкин
26 декабря 2012, 07:51
0
Пользуюсь своим VPS и всем советую. Заметка по настройке, рекомендую linode.
Василий Наумкин
24 декабря 2012, 15:10
0
Моя статья на Хабре про создание компонента — habrahabr.ru/post/126635/.
Официальная документация — rtfm.modx.com/display/revolution20/Custom+Manager+Pages

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

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

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

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