Fatal error - при модификации цены

Написал скрипт модификатора цены, на старом хостинге всё работало безупречно. После переноса на новый — белый экран.
Добавил
ini_set('display_errors',1);
Теперь выходит ошибка
Fatal error: Call to a member function get() on a non-object in /home/v/******/public_html/core/cache/includes/elements/modsnippet/106.include.cache.php on line 8
Ругается на:
$product->get('price');

Сам сниппет увеличивает цену на указанный процент (это наряду с плагином модификации цены в корзине).
Код сниппета следующий:
<?php
ini_set('display_errors',1);

$getprice = $product->get('price');

$procent = isset($scriptProperties['procent'])? $procent: 0;
$price = isset($scriptProperties['price'])? $price: $getprice;

$price = str_replace(" ","",$price);

$price2 = $price/100;
$procent = $price2*$procent;
$price = $price + $procent;

echo $price;
Вывожу сниппет на каточке товара:
[[!procent?&procent=`20`]]
Василий Столейков
12 мая 2014, 04:36
modx.pro
2
1 447
0
Поблагодарить автора Отправить деньги

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

Алексей Ерохин
12 мая 2014, 13:37
+1
У Вас в сниппете отсутствует объект $product.
Проще сделать модификатор procent на плейсхолдер [[+price]] из этого сниппета
docs.modx.pro/system/basics/filters-input-and-output
    Василий Столейков
    12 мая 2014, 15:18
    0
    Спасибо за идею! Почему мне это раньше в голову не пришло?
    Модифицировал сниппет procent и вызвал его как модификатор (проценты хранятся в настройках контекста):
    <?php
    ini_set('display_errors',1);
    
    if (isset($options)) {$procent = 'procent_'.$options;}
    else {$procent = 'procent_2';}
    
    $price = $input;
    $price = str_replace(" ","",$price);
    $procent = $modx->getOption($procent, null);
    
    $price2 = $price/100;
    $procent = $price2*$procent;
    $price = $price + $procent;
    
    return number_format(round($price), 0, '.', ' ');
    Василий Столейков
    12 мая 2014, 15:26
    1
    0
    Остался нерешенным 1 вопрос:
    Почему есть разница в выводе результатов этого скрипта и плагина-модификатора корзины?

    Допустим реальный пример:
    с помощью сниппета procent выводится цена в 5968 руб., а в корзину добавляется 5991 руб.!
    Код вроде везде идентичный…

    Код плагина:
    <?php
    $procent_2 = $modx->getOption('procent_2', null);
    
    if ($modx->event->name == 'msOnBeforeAddToCart') {
        $price = $product->get('price');
    	
        $price2 = $price/100;
        $procent_2 = $price2*$procent_2;
        $price = $price + $procent_2;
        $price = round($price);
        $product->set('price', $price);
    }
      Максим Полетаев
      13 мая 2014, 10:30
      +1
      При вызове события msOnBeforeAddToCart miniShop передает в плагин, в переменную $product, объект добавляемого в корзину товара. В случае сниппета, чтобы достать товар, нужно самому сходить за ним в БД.
        Василий Столейков
        13 мая 2014, 10:43
        0
        Получается логика сниппета procent не совсем верна?
        Значит вместо [[+price:procent=`2`]], мне нужно переписать сниппет и вызывать его так: [[+id:procent=`2`]]?
        В таком случае как лучше залезть в базу за ценой товара, зная его ID?
          Максим Полетаев
          13 мая 2014, 11:23
          0
          Пардон, вначале не совсем понял вопрос.

          Логика, на первый взгляд, верна. Но возможно, прикол в приведении типов. Вероятно, что в [[+price]] содержится не число, а строка (отформатированная цена, содержащая пробел).
            Василий Столейков
            13 мая 2014, 11:34
            0
            Неа, не помогло. После строки:
            $price = str_replace(" ","",$price);
            добавил перевод из строки в число:
            $price = (int)$price;
            Результат всё тот же: сниппет показывает цену в 200 руб., а в корзину добавляет 223 руб.!
      Василий Столейков
      13 мая 2014, 14:06
      0
      Сделал непростительный и ужасный костыль: ручками добавил к процентам недостающие 23 рубля:
      $price = $price + $procent_2 + 23;
      В 90% случаях цена товара совпадает с ценой в корзине. На оставшиеся 10% товаров пока не хочу смотреть, чтобы не было мучительно больно… =(
        Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
        8