добавляем Объектам каталога еще два числовых поля 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); иначе значение в базе не меняется. Вот такая вот странность
может быть проблема в моем коде?