UMIhelp

Разработка дополнительного функционала => Custom макросы => Тема начата: crazygeorgio от 03 Октября 2015, 03:22:49

Название: Цены в разных валютах. Проблемы и странности
Отправлено: crazygeorgio от 03 Октября 2015, 03:22:49
добавляем Объектам каталога еще два числовых поля price_dollar и price_euro, далее выводим пользователям только цену в рублях, у рахных объектов может быть цена задана как в рублях, так и в любой другой валюте.

в папке emarket в __custom.php прописали метод

public function OnPriceValue($e)
{
$value = & $e->getRef('price');
$object_id = $e->getParam('object_id');
$object = umiObjectsCollection::getInstance()->getObject($object_id);
if ($object instanceof umiObject)
{
$price_dollar = $object->getValue('price_dollar');
$price_euro = $object->getValue('price_euro');
if ($price_dollar or $price_euro)
{
$code = $price_dollar ? 'USD' : 'EUR';
$price = $price_dollar ? $price_dollar : $price_euro;
$Currency = $this->getCurrency($code);
$defaultCurrency = $this->getDefaultCurrency();
$prices = array(
$price
);
$format = $this->formatCurrencyPrice($prices, $defaultCurrency, $Currency);
$value = round($format[0]);
/*$object->setValue('price',round($format[0]));               
$object->commit;*/             
                        }
}
else return false;
}

в custom_events.php прописали

Цитировать
<?php  new umiEventListener("umiObjectProperty_loadPriceValue", "emarket", "OnPriceValue");?>

все работает ок, но при этом если цена задана в долларах или евро, то по своей сути в базе в поле цены будет стоять НОЛЬ и таким образом не будут корректно работать фильтры по рублевой цене товаров каталога, при этом закомментченные строки в __custom.php решали бы проблему, но это слишком нагружает сайт. Поэтому решили делать это по крону

в catalog в __custom.php прописали метод, который перебирает товары и ставит в них рублевую цену:

public function setRubPrice()
{
$now = time();
$pages = new selector('objects');
$pages->types('object-type')->name('catalog', 'object');
$pages->option('or-mode')->fields('price_dollar', 'price_euro');
$pages->option('or-mode')->field('next_update_price');
$pages->where('next_update_price')->eqless($now);
$pages->where('next_update_price')->isnull(true);
$pages->where('price_euro')->more(0);
$pages->where('price_dollar')->more(0);
$pages->limit(0, 100);
foreach($pages as $page)
{
$price = $page->price;
$objectId = $page->id;
$page->setValue('price', 0); [b]/* **** */ [/b]     
                $page->setValue('price',$price);      $page->setValue('next_update_price',$now + 60*60*4);     
                $page->commit();     
                umiObjectsCollection::getInstance()->unloadObject($objectId);
}

return true;
}

в custom_events.php прописали

<?php    new umiEventListener('cron', 'catalog', 'setRubPrice'); ?>

все работает, но приходится сначала сбрасывать значение цены **** $page->setValue('price',0); иначе значение в базе не меняется. Вот такая вот странность

может быть проблема в моем коде?