Почему-то не работает плагин на msOnBeforeAddToCart

Добрый день.
Пишу плагин который дает 5% скидки на определенную группу товаров. Вешаю его на событие msOnBeforeAddToCart.
В результате одна часть работает, вторая нет… хотя через print_r выводит верную цену, но в корзину все равно попадает цена без скидки… Помогите почему так происходит

<?php
$plamgasCatsId = 10535;
$target = 6;

switch ($modx->event->name) {
	
	case 'msOnBeforeAddToCart':
    
	$products = $modx->getObject('msProduct', $product->get('id'));
	

    		if ($products->get('parent') == $plamgasCatsId) {
    			
    			$price_product_id = $products->get('price_id_product');
				$para = $products->get('para')[0];

    			foreach ($price_product_id as $product_id) {
					$res = $modx->getObject('msProduct',$product_id);
						if ($res) {
							$price_sostav = $res->get('price');
							$price_sum += $price_sostav;
							if ($para[0] == 1) {
								$price_sum = $price_sum*2;
							}
						}
				}
				
				$price_sale = $price_sum * 0.95;
    			$product->set('price', $price_sale);
				//$product->set('price', $price_sum);

    			
    		}
    		
    		else {
    			
    			$pids = $modx->getParentIds($products->get('id'), 10, array('context' => 'web'));
	    		
	    		if (in_array($target, $pids)) {
	    			
	    			$price_sale = $products->get('price') * 0.95;
// Вот эта строка не работает, все остальное работает корректно.
	    			$product->set('price', $price_sale);
	    		}
	    		
    		}
    		
    		
    
    break;
    
}
Андрей
04 февраля 2021, 15:07
modx.pro
683
0

Комментарии: 8

Андрей
04 февраля 2021, 16:39
0
Выяснилось что вообще никаким товарам цен не меняется кроме одной категории…
Почему-то не работает лаже скрипт из документации
case 'msOnBeforeAddToCart':
    $product->set('price', 5555);
    break;
Как выяснить причину?
    Евгений Webinmd
    04 февраля 2021, 18:31
    0
    а если так:
    case 'msOnGetProductPrice': 
              $returned_values = & $modx->event->returnedValues;
              $values =  $modx->event->params['data'];
               $returned_values['price'] = 300;
            break;
      Андрей
      04 февраля 2021, 18:39
      0
      А так он меняет ценник в самой карточке товара, а нужно чтобы в корзине при добавлении
        Евгений Webinmd
        04 февраля 2021, 18:44
        0
        а, точно, заработался, но если попробовать $returned_values = & $modx->event->returnedValues; вот это впихнуть в твой вариант?
          Андрей
          04 февраля 2021, 18:55
          0
          Добавил такие строки:
          $returned_values = & $modx->event->returnedValues;
          $values =  $modx->event->params['data'];
          $returned_values['price'] = $price_sale;
          все равно не меняет ценник.
          Я тут плагины поотключал и выяснил что при отключении плагина msOptionPrice все работает. Но вот где он ценник перебивает ума не приложу
            Евгений Webinmd
            04 февраля 2021, 19:03
            0
            там есть такая штука как приоритет плагинов, поиграйте там со значениями, чтобы ваш плагин срабатывал после msOptionPrice
              Андрей
              04 февраля 2021, 19:11
              0
              Ставил бОльший приоритет. И штука в том что в одном коде одна часть товаров нормально работает:
              $products = $modx->getObject('msProduct', $product->get('id'));
              	
              
                  		if ($products->get('parent') == $plamgasCatsId) {
                  			
                  			$price_product_id = $products->get('price_id_product');
              				$para = $products->get('para')[0];
              
                  			foreach ($price_product_id as $product_id) {
              					$res = $modx->getObject('msProduct',$product_id);
              						if ($res) {
              							$price_sostav = $res->get('price');
              							$price_sum += $price_sostav;
              							if ($para[0] == 1) {
              								$price_sum = $price_sum*2;
              							}
              						}
              				}
              				
              				$price_sale = $price_sum * 0.95;
                  			$product->set('price', $price_sale);
              				//$product->set('price', $price_sum);
              
                  			
                  		}
              А другая часть, которая должна применять скидку к товарам одной категории — не работает

              else {
                  			
                  				$pids = $modx->getParentIds($products->get('id'), 10, array('context' => 'web'));
              	    			if (in_array($target, $pids)) {
              	    				$price_sale = $product->get('price') * 0.95;
              	    			}
              	    		
                  		}
                  		
                  		$product->set('price', $price_sale);
      Андрей
      05 февраля 2021, 14:12
      0
      Выкладываю свой полный код, помогите понять почему msOptionPrice своим плагином перебивает мой, приоритеты у моего стоят выше

      <?php
      $plamgasCatsId = 10535;
      $target = 6;
      
      switch ($modx->event->name) {
      	
      	case 'msOnBeforeAddToCart':
      		
          
      	$products = $modx->getObject('msProduct', $product->get('id'));
      	
      
          		if ($products->get('parent') == $plamgasCatsId) {
          			
          			$price_product_id = $products->get('price_id_product');
      				$para = $products->get('para')[0];
      
          			foreach ($price_product_id as $product_id) {
      					$res = $modx->getObject('msProduct',$product_id);
      						if ($res) {
      							$price_sostav = $res->get('price');
      							$price_sum += $price_sostav;
      							if ($para[0] == 1) {
      								$price_sum = $price_sum*2;
      							}
      						}
      				}
      				
      				$price_sale = $price_sum * 0.95;
          			
          		}
          		
          		else {
          			
          				$pids = $modx->getParentIds($products->get('id'), 10, array('context' => 'web'));
      	    			if (in_array($target, $pids)) {
      	    				$price_sale = $product->get('price') * 0.95;
      	    			}
      	    			
      	    		
          		}
          		
          		$product->set('price', $price_sale);
          
          break;
      
      }
        Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
        8