Владислав

Владислав

С нами с 14 января 2015; Место в рейтинге пользователей: #401
Владислав
19 января 2015, 09:54
0
Это и есть вся ошибка
Владислав
17 января 2015, 13:44
0
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. После устранения проблемы буду использовать ваш метод.
Владислав
16 января 2015, 17:00
0
Дополнение:
По OnDocFormRender значение изменяется, но не обнуляется.
Думаю, с $_POST тоже самое.
Владислав
16 января 2015, 16:10
0
Итак, я попробовал все предложенные варианты. У каждого свои ограничения:
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;
		}
	}
}
Владислав
15 января 2015, 12:06
0
Спасибо)
А еще подскажи пжлста, как в сниппете RecalcPrice получить пришедшие переменные?
Раньше не доводилось вызывать runSnippet
Владислав
15 января 2015, 12:04
0
Спасибо за оживленную дискуссию! :-)
Владислав
15 января 2015, 11:14
0
Ну это все понятно (в теории).
Но вот как получить ТВ по событию OnBeforeDocFormSave (кроме предложенного выше решения)?