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`]]
Поблагодарить автора
Отправить деньги
Комментарии: 8
У Вас в сниппете отсутствует объект $product.
Проще сделать модификатор procent на плейсхолдер [[+price]] из этого сниппета
docs.modx.pro/system/basics/filters-input-and-output
Проще сделать модификатор procent на плейсхолдер [[+price]] из этого сниппета
docs.modx.pro/system/basics/filters-input-and-output
Спасибо за идею! Почему мне это раньше в голову не пришло?
Модифицировал сниппет procent и вызвал его как модификатор (проценты хранятся в настройках контекста):
Модифицировал сниппет 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, '.', ' ');
Остался нерешенным 1 вопрос:
Почему есть разница в выводе результатов этого скрипта и плагина-модификатора корзины?
Допустим реальный пример:
с помощью сниппета procent выводится цена в 5968 руб., а в корзину добавляется 5991 руб.!
Код вроде везде идентичный…
Код плагина:
Почему есть разница в выводе результатов этого скрипта и плагина-модификатора корзины?
Допустим реальный пример:
с помощью сниппета 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);
}
При вызове события msOnBeforeAddToCart miniShop передает в плагин, в переменную $product, объект добавляемого в корзину товара. В случае сниппета, чтобы достать товар, нужно самому сходить за ним в БД.
Получается логика сниппета procent не совсем верна?
Значит вместо [[+price:procent=`2`]], мне нужно переписать сниппет и вызывать его так: [[+id:procent=`2`]]?
В таком случае как лучше залезть в базу за ценой товара, зная его ID?
Значит вместо [[+price:procent=`2`]], мне нужно переписать сниппет и вызывать его так: [[+id:procent=`2`]]?
В таком случае как лучше залезть в базу за ценой товара, зная его ID?
Пардон, вначале не совсем понял вопрос.
Логика, на первый взгляд, верна. Но возможно, прикол в приведении типов. Вероятно, что в [[+price]] содержится не число, а строка (отформатированная цена, содержащая пробел).
Логика, на первый взгляд, верна. Но возможно, прикол в приведении типов. Вероятно, что в [[+price]] содержится не число, а строка (отформатированная цена, содержащая пробел).
Неа, не помогло. После строки:
$price = str_replace(" ","",$price);
добавил перевод из строки в число:$price = (int)$price;
Результат всё тот же: сниппет показывает цену в 200 руб., а в корзину добавляет 223 руб.!
Сделал непростительный и ужасный костыль: ручками добавил к процентам недостающие 23 рубля:
$price = $price + $procent_2 + 23;
В 90% случаях цена товара совпадает с ценой в корзине. На оставшиеся 10% товаров пока не хочу смотреть, чтобы не было мучительно больно… =(
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.