Изменение цены в зависимости от типа валюты (в tv-параметре)

<?php
switch($modx->event->name) { 
    case 'msOnGetProductFields':
        $returned_values = & $modx->event->returnedValues;
        $values =  $modx->event->params['data'];

        $product = $modx->getObject('msProduct', $product->id);
        $currency_type = $product->getTVValue('valuta'); //Тип валюты
        $currency = $modx->getOption('currency_'.strtoupper($currency_type)); //Значение курса
        
        if (isset($currency)) {
            $returned_values['price'] = round($values['price'] * $currency); // Округление цены;
        }       
        
        $modx->log(1,'returned_price - ' . $returned_values['price'] );
        $modx->log(1,'current_type - ' . $currency_type );
        $modx->log(1,'currency - ' . $currency );
        break;
}
Почему-то логи пишет корректно, но цена не меняется.
Если убрать эти строки
$product = $modx->getObject('msProduct', $product->id);
        $currency_type = $product->getTVValue('valuta'); //Тип валюты
        $currency = $modx->getOption('currency_'.strtoupper($currency_type)); //Значение курса
, работает. С ними все ломается…
Валентина Павлова
08 июля 2021, 15:25
modx.pro
1
183
0

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

Павел Романов
08 июля 2021, 16:35
+1
Попробуйте так (только вместо 999999 укажите ID TV-шки valuta):
//...
if($tvo = $modx->getObject('modTemplateVarResource', array('tmplvarid' => 999999,'contentid' => $product->id))) {
    $currency_type = $tvo->get('value');
    $currency = $modx->getOption('currency_'.strtoupper($currency_type)); //Значение курса
}
//...
    Валентина Павлова
    08 июля 2021, 17:21
    0
    Спасибо, заработало! А чем разница вызова?
      Павел Романов
      08 июля 2021, 17:25
      0
      В плагинах getTVValue не всегда срабатывает.
      Надежнее получать данные непосредственно из TV по ID ресурса.
    Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
    3