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
Возможно ли реализовать возможность предоплаты за доставку на сайте? Так ради этого мне и нужно это все, чтобы клиент платил сразу при оформлении заказа, чтобы избавить себя от мусорных заявок (когда человек оставляет заявку, а предоплату делать не ...
Редизайн сообщества На больших экранах основной текст статьи я бы сделал 18 px. Да и текст комментариев можно таким сделать. Для меня лично 16 — мелковато на больших экранах (в комментариях вообще 15 ...
MiniShop3 1.11.0 при клике на radio идет пересчет итоговой суммы в orderUI, в зависимости от способов(оплаты доставки) я так поняла. попробуй код запуска события поставить ниже чем orderUI, после
ImageOptimizer - WebP/AVIF и responsive <picture> для MODX 3 Дополнение доступно modstore.pro/packages/photos-and-files/imageoptimizer
Localizator3 для MODX 3: перевод полей и TV без отдельного context на язык, Vue 3 + PrimeV... Добавил localizator3_default_language
msInShopNotify Начиная с версии 3.0.0-beta добавлена поддержка MiniShop3 Минимальные требования: PHP 8.4 MODX 3.2 MiniShop3
MaxNotify Обновление 1.2.0-pl (03.07.2026) — добавлены уведомления о заявках FormIt через hook-сниппет `maxNotifyFormIt`; — добавлены уведомления о заявках SendIt через hook-...
[msBonus2] 1.3.0 Бонус-коды, уведомления о сгорании и совместимость с msMultiCurre... Да, планируется. Даже чуть больше, чем просто бонусная система)
Попробовал ваш метод — действительно, все просто.
Только вот проблема теперь с 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 (кроме предложенного выше решения)?