17 января 2015, 13:44 Cyrax_02 , спасибо за развернутый ответ. Попробовал ваш метод — действительно, все просто. Только вот проблема теперь с shopkeeper'ом (тестировал на нескольких сайтах). Непонятно, почему, но switch ($modx->event->name) { case 'OnBeforeDocFormSave': $discount = (float)$resource->getTVValue(13); $modx->log(modX::LOG_LEVEL_ERROR, '$discount: ' . $discount); break; }выдает ошибку "../www/core/components/shopkeeper/elements/tv/output/". Отписал разработчику shopkeeper'a. После устранения проблемы буду использовать ваш метод. Вопросы / Срабатывание плагина, если tv изменился 20 0
16 января 2015, 17:00 Дополнение: По OnDocFormRender значение изменяется, но не обнуляется. Думаю, с $_POST тоже самое. Вопросы / Срабатывание плагина, если tv изменился 20 0
16 января 2015, 16:10 Итак, я попробовал все предложенные варианты. У каждого свои ограничения: 0. При работе с сессиями в любом виде, на странице (в админке), в которой производится изменение скидки, выводится "../www/core/components/shopkeeper/elements/tv/output/". 1. От Сергея modx.pro/help/4600/#comment-33447 OnDocFormRender не выполняется при сохранении значения, только при перезагрузке страницы (вполне логично). 2. От Василия modx.pro/help/4600/#comment-33439 $_POST тоже приходит только при перезагрузке страницы + приходится пользоваться переменной сессии. 3. От Cyrax_02 modx.pro/help/4600/#comment-33448 Не смог добраться до массива data. В итоге остановился на варианте №1. Указанные ограничения победить пока не удалось. код: <?php /* * Action: OnDocFormRender, OnDocFormSave */ global $modx; if ($mode == modSystemEvent::MODE_UPD ) { $parent = $resource->get('parent'); $isDiscountChanged = 0; if ($parent == "9") { $startTime = microtime(true); $brand = $resource->get('menutitle'); switch ($modx->event->name) { case 'OnDocFormRender': $_SESSION['discount_before'] = (float)$resource->getTVValue(13); // скидка при загрузке $modx->log(modX::LOG_LEVEL_ERROR, '$discount_before: ' . $_SESSION['discount_before']); break; case 'OnDocFormSave': $discount = (float)$resource->getTVValue(13); // скидка при сохранении $priceCoeff = (float)$resource->getTVValue(14); // коэфф. при сохранении if($discount != $_SESSION['discount_before']){ $isDiscountChanged = 1; } if ($isDiscountChanged) { {...} // получение выборки из базы if ( $query -> prepare() && $query -> stmt -> execute() ) { while ( $queryRow = $query -> stmt -> fetch( PDO::FETCH_ASSOC ) ) { $thisProject = $modx -> getObject( 'modResource', $queryRow['id'] ); $price = $thisProject -> getTVValue( 1 ); $discountPrice = round((1-$discount/100)*$price); $thisProject->setTVValue(2, $discountPrice); //внесение цены со скидкой } } unset($_SESSION['discount_before']); $finishTime = microtime(true); $timeScript = $finishTime - $startTime; $modx->log(modX::LOG_LEVEL_ERROR, 'setDiscount checked ' . $i . ' elements'); $modx->log(modX::LOG_LEVEL_ERROR, 'Time wasted: ' . round($timeScript,4) . 'sec'); break; } } } Вопросы / Срабатывание плагина, если tv изменился 20 0
15 января 2015, 12:06 Спасибо) А еще подскажи пжлста, как в сниппете RecalcPrice получить пришедшие переменные? Раньше не доводилось вызывать runSnippet Вопросы / Срабатывание плагина, если tv изменился 20 0
15 января 2015, 12:04 Спасибо за оживленную дискуссию! :-) Вопросы / Срабатывание плагина, если tv изменился 20 0
15 января 2015, 11:14 Ну это все понятно (в теории). Но вот как получить ТВ по событию OnBeforeDocFormSave (кроме предложенного выше решения)? Вопросы / Срабатывание плагина, если tv изменился 20 0
Gallery3x 3.4.0 - вставка галерей прямо из визуального редактора (CKEditor и TinyMCE RTE) Здравствуйте. Есть консольный скрипт Вот почитайте: docs.ivan345.com/books/gallery3x/page/import-ms2galleryphp
[mSync] Новая версия синхронизации с 1С Всем привет. В какой то момент начали сыпаться ошибки: Error 23000 executing statement: INSERT INTO `modx_msync_products` (`product_id`, `uuid_1c`) VALUES ...
Checkbox для модального окна Они не отключены, они платные, чтобы писали только те, кому действительно очень надо. Когда бесплатно люди начинают думать, что я им должен.
[SendIt 2.6.0] Анализ поведения пользователя для защиты от спама (невидимая капча)... Здравствуйте. Делаю личный кабинет на Sendit и со сбросом пароля возникли проблемы. Можете подсказать, в чем ошибка? Список вопросов в одноименном разделе на modx.pro пока пуст, и,...
Minishop + честный знак (продажа маркированной продукции) В нашем случае мы решили убрать всю логику по маркировке сайта.
MiniShop3 - Не выводятся товары дополнительных категорий @SYAN ваша указанная проблема исправлена еще до версии 1.2.3 @Павлик Мышкин завел: github.com/modx-pro/MiniShop3/issues/480 github.com/modx-pro/MiniShop3/issues/481Исправим в б...
MobileDetect 2.0.0-pl функция "планшеты как стандартные браузеры не работает" в 2.1.0-pl баг исправлен
Попробовал ваш метод — действительно, все просто.
Только вот проблема теперь с shopkeeper'ом (тестировал на нескольких сайтах).
Непонятно, почему, но
выдает ошибку "../www/core/components/shopkeeper/elements/tv/output/".
Отписал разработчику shopkeeper'a. После устранения проблемы буду использовать ваш метод.
По OnDocFormRender значение изменяется, но не обнуляется.
Думаю, с $_POST тоже самое.
0. При работе с сессиями в любом виде, на странице (в админке), в которой производится изменение скидки, выводится "../www/core/components/shopkeeper/elements/tv/output/".
1. От Сергея modx.pro/help/4600/#comment-33447
OnDocFormRender не выполняется при сохранении значения, только при перезагрузке страницы (вполне логично).
2. От Василия modx.pro/help/4600/#comment-33439
$_POST тоже приходит только при перезагрузке страницы + приходится пользоваться переменной сессии.
3. От Cyrax_02 modx.pro/help/4600/#comment-33448 Не смог добраться до массива data.
В итоге остановился на варианте №1. Указанные ограничения победить пока не удалось.
код:
А еще подскажи пжлста, как в сниппете RecalcPrice получить пришедшие переменные?
Раньше не доводилось вызывать runSnippet
Но вот как получить ТВ по событию OnBeforeDocFormSave (кроме предложенного выше решения)?