Авто конвертация валюты в рубли shopkeeper2 Новый


Здравствуйте, уважаемые коллеги. Подскажите, как можно сделать автоматическую конвертацию цен из долларов в рубли. Т.е. цену на товары писать в долларах, а на сайте цена выводилась в рублях по сегодняшнему курсу и было обновление ежедневное при изменении курса. Спасибо!
31 октября 2016, 12:09    Кост   
0    326 0

Комментарии (10)

  1. Павел Романов 31 октября 2016, 14:27 # 0
    Попробуйте сделать плагин на событие OnSHKgetProductPrice

    <?php
    $rate = 63; //тут курс
    $output = 0;
    $price_tv_name = 'price'; //Имя TV цены
        $p_id = isset($purchaseArray['shk-id']) && is_numeric($purchaseArray['shk-id']) ? $purchaseArray['shk-id'] : 0;
        if($p_id){
            $price_tv = $modx->getObject('modTemplateVar',array('name'=>$price_tv_name));
            $price_usd = $price_tv->renderOutput($p_id);
    	$output = $price_usd * $rate;
        }
    $modx->event->_output = '';
    $modx->event->output($output);
    
    return '';
    1. Кост 31 октября 2016, 15:14 # 0
      Спасибо, Павел за ответ, плагин создал, его нужно как-то подключить к карточке товара и корзине? Так пробовал цены не меняются. $price_tv_name = 'price'; //Имя TV цены поле так и называется price
      1. Павел Романов 31 октября 2016, 15:23 # 0
        У плагина на вкладке «Системные события» отметьте галочкой OnSHKgetProductPrice.

        Но плагин не меняет цену на странице товара — от просто пересчитывает ее, когда происходит добавление в корзину. Для того, чтобы выводить цену, создайте сниппет getprice:

        <?php
        $rate = 63; // курс
        return $input * $rate;

        И выводите в чанках:
        [[+tv.price:getprice:num_format]]

        На странице товара:
        [[*price:getprice:num_format]]
        1. Кост 31 октября 2016, 15:38 # 0
          Спасибо, галочку поставил. Буду пробовать
      2. Кост 09 ноября 2016, 13:57 # 0
        Павел, спасибо за подсказки, подскажите, так можно прописать условия, т.е. если акционная цена, то выводим ее, если нет, то выводим обычную цену?
        <?php
        $rate = 63; //тут курс
        $output = 0;
        $price_tv_name = 'price'; //Имя TV цены
        $action_price_tv_name = 'action_price'; //Имя акционной TV цены
        $action = 'action'; //галочка акции TV поля
            $p_id = isset($purchaseArray['shk-id']) && is_numeric($purchaseArray['shk-id']) ? $purchaseArray['shk-id'] : 0;
            if($p_id){
                if (!empty ($action)) {
                    $action_price_tv = $modx->getObject('modTemplateVar',array('name'=>$action_price_tv_name));
                    $price_usd = $action_price_tv->renderOutput($p_id);
                } else {
                    $price_tv = $modx->getObject('modTemplateVar',array('name'=>$price_tv_name));
                    $price_usd = $price_tv->renderOutput($p_id);
                }
                $output = $price_usd * $rate;
            }
        $modx->event->_output = '';
        $modx->event->output($output);
        
        return '';
        1. Павел Романов 09 ноября 2016, 14:22 # +1
          Попробуйте так:
          <?php
          $rate = 63; //тут курс
          $output = 0;
          $price_tv_name = 'price'; //Имя TV цены
          $action_price_tv_name = 'action_price'; //Имя акционной TV цены
          
              $p_id = isset($purchaseArray['shk-id']) && is_numeric($purchaseArray['shk-id']) ? $purchaseArray['shk-id'] : 0;
              if($p_id){
          	$action_tv = $modx->getObject('modTemplateVar',array('name'=>'action'));
          	$action = $action->renderOutput($p_id);
                  if (!empty ($action)) {
                      $action_price_tv = $modx->getObject('modTemplateVar',array('name'=>$action_price_tv_name));
                      $price_usd = $action_price_tv->renderOutput($p_id);
                  } else {
                      $price_tv = $modx->getObject('modTemplateVar',array('name'=>$price_tv_name));
                      $price_usd = $price_tv->renderOutput($p_id);
                  }
                  $output = $price_usd * $rate;
              }
          $modx->event->_output = '';
          $modx->event->output($output);
          
          return '';
          1. Кост 09 ноября 2016, 14:35 # 0
            Выдал ошибку при добавлении в корзину Fatal error: Call to a member function renderOutput() on a non-object
            1. Павел Романов 09 ноября 2016, 15:49 # +1
              Ошибся. А так?
              <?php
              $rate = 63; //тут курс
              $output = 0;
              $price_tv_name = 'price'; //Имя TV цены
              $action_price_tv_name = 'action_price'; //Имя акционной TV цены
              
                  $p_id = isset($purchaseArray['shk-id']) && is_numeric($purchaseArray['shk-id']) ? $purchaseArray['shk-id'] : 0;
                  if($p_id){
              	$action_tv = $modx->getObject('modTemplateVar',array('name'=>'action'));
              	$action = $action_tv->renderOutput($p_id);
                      if (!empty ($action)) {
                          $action_price_tv = $modx->getObject('modTemplateVar',array('name'=>$action_price_tv_name));
                          $price_usd = $action_price_tv->renderOutput($p_id);
                      } else {
                          $price_tv = $modx->getObject('modTemplateVar',array('name'=>$price_tv_name));
                          $price_usd = $price_tv->renderOutput($p_id);
                      }
                      $output = $price_usd * $rate;
                  }
              $modx->event->_output = '';
              $modx->event->output($output);
              
              return '';
              1. Кост 09 ноября 2016, 16:03 # 0
                Да, заработало, круто, спасибо! очень благодарен. Еще один вопрос, как сделать чтобы выводились только целые числа цен, например если в долларах 15,7, то цена получается с хвостом, его бы не выводить.
                1. Павел Романов 09 ноября 2016, 16:15 # +1
                  Используйте number_format.
                  Для вывода на сайте можете сделать сниппет-модификатор nformat:
                  return number_format($input, 0, '', ' ');

                  и использовать:
                  [[*price:nformat]]

                  Если нужно округление, то round.
      Вы должны авторизоваться, чтобы оставлять комментарии.