Перейти до вмісту
Пошук в
  • Детальніше...
Шукати результати, які ...
Шукати результати в ...

Автообновление курса валют


Recommended Posts

В настройках включено автообновление курса валют при входе в админку. Вроде все ок, но последнее время работает криво. Модуль Currency fix поставил, чтобы с яху решить проблему, но все равно приходится обновлять вручную.

 

Вопрос в другом. Как сделать, чтобы валюты автоматически обновлялись каждый день в определенное время? Независимо от того заходил кто-то в админку или нет.

Надіслати
Поділитися на інших сайтах


В 19.01.2018 в 21:26, storer сказал:

Вопрос в другом. Как сделать, чтобы валюты автоматически обновлялись каждый день в определенное время? Независимо от того заходил кто-то в админку или нет.

никто не в курсе?

Надіслати
Поділитися на інших сайтах


Создать в папке admin какой-нибудь PHP-файл, например currency-updater.php

Далее вызывать его через крон хоть каждые 5-ть минут.

<?php
require_once('config.php');
require_once(DIR_SYSTEM . 'startup.php');
$registry = new Registry();
$loader = new Loader($registry);
$registry->set('load', $loader);
$config = new Config();
$registry->set('config', $config);
$db = new DB(DB_DRIVER, DB_HOSTNAME, DB_USERNAME, DB_PASSWORD, DB_DATABASE, DB_PORT);
$registry->set('db', $db);
global $loader, $registry;


$query = $db->query("SELECT * FROM " . DB_PREFIX . "setting WHERE store_id = '0'");

foreach ($query->rows as $setting) {
	if (!$setting['serialized']) {
		$config->set($setting['key'], $setting['value']);
	} else {
		$config->set($setting['key'], json_decode($setting['value'], true));
	}
}

$loader->model('localisation/currency');
$model = $registry->get('model_localisation_currency');
$model->refresh(true);

?>

 

  • +1 1
Надіслати
Поділитися на інших сайтах


6 hours ago, storer said:

Интересное решение.

Правильно понимаю, что вместо 


DB_DRIVER, DB_HOSTNAME, DB_USERNAME, DB_PASSWORD, DB_DATABASE, DB_PORT

нужно вписать параметры базы данных сайта?

 

Зачем, если константы из конфига подгружаются? Как есть, так и надо запускать. Ничего менять не нужно.

Змінено користувачем ImLucky
Надіслати
Поділитися на інших сайтах


В 25.01.2018 в 19:33, ImLucky сказал:

 

Зачем, если константы из конфига подгружаются? Как есть, так и надо запускать. Ничего менять не нужно.

Круто. Попробую, отпишусь о результате.

 

Надіслати
Поділитися на інших сайтах


Выдает ошибку:

[27-Jan-2018 14:29:01 Europe/Moscow] PHP Fatal error:  Call to a member function delete() on null in /home/user/public_html/admin/model/localisation/currency.php on line 178

178 строка содержит:

$this->cache->delete('currency');

Кэш не может почистить через cron?

Змінено користувачем storer
Надіслати
Поділитися на інших сайтах


9 минут назад, storer сказал:

Выдает ошибку:


[27-Jan-2018 14:29:01 Europe/Moscow] PHP Fatal error:  Call to a member function delete() on null in /home/user/public_html/admin/model/localisation/currency.php on line 178

178 строка содержит:


$this->cache->delete('currency');

Кэш не может почистить через cron?

 

У вас кеш не подключен

в файлике добавьте куда-то

 

// Cache
$cache = new Cache('file');
$registry->set('cache', $cache);

  • +1 1
Надіслати
Поділитися на інших сайтах

7 минут назад, spectre сказал:

У вас кеш не подключен

в файлике добавьте куда-то

 

// Cache
$cache = new Cache('file');
$registry->set('cache', $cache);

В каком файлике: currency-updater.php или currency.php?

Надіслати
Поділитися на інших сайтах


1 минуту назад, storer сказал:

В каком файлике: currency-updater.php или currency.php?

посмотрите 3 сообщение в теме и поймете

Надіслати
Поділитися на інших сайтах

10 минут назад, spectre сказал:

посмотрите 3 сообщение в теме и поймете

<?php
require_once('config.php');
require_once(DIR_SYSTEM . 'startup.php');
$registry = new Registry();
$loader = new Loader($registry);
$registry->set('load', $loader);
$cache = new Cache('file');
$registry->set('cache', $cache);
$config = new Config();
$registry->set('config', $config);
$db = new DB(DB_DRIVER, DB_HOSTNAME, DB_USERNAME, DB_PASSWORD, DB_DATABASE, DB_PORT);
$registry->set('db', $db);
global $loader, $registry;


$query = $db->query("SELECT * FROM " . DB_PREFIX . "setting WHERE store_id = '0'");

foreach ($query->rows as $setting) {
	if (!$setting['serialized']) {
		$config->set($setting['key'], $setting['value']);
	} else {
		$config->set($setting['key'], json_decode($setting['value'], true));
	}
}

$loader->model('localisation/currency');
$model = $registry->get('model_localisation_currency');
$model->refresh(true);
?>

Так, вроде бы ошибка не вылазит больше. Кажется работает. Ждем обновление курса чтобы проверить))

Змінено користувачем storer
Надіслати
Поділитися на інших сайтах


ну тогда заплатите кому-то пару пива, даже мне, и вам все сделают под ключ

Змінено користувачем spectre
Надіслати
Поділитися на інших сайтах

6 minutes ago, storer said:

<?php
require_once('config.php');
require_once(DIR_SYSTEM . 'startup.php');
$registry = new Registry();
$loader = new Loader($registry);
$registry->set('load', $loader);
$config = new Config();
$registry->set('config', $config);
$db = new DB(DB_DRIVER, DB_HOSTNAME, DB_USERNAME, DB_PASSWORD, DB_DATABASE, DB_PORT);
$registry->set('db', $db);
global $loader, $registry;


$query = $db->query("SELECT * FROM " . DB_PREFIX . "setting WHERE store_id = '0'");

foreach ($query->rows as $setting) {
	if (!$setting['serialized']) {
		$config->set($setting['key'], $setting['value']);
	} else {
		$config->set($setting['key'], json_decode($setting['value'], true));
	}
}

$loader->model('localisation/currency');
$model = $registry->get('model_localisation_currency');
$model->refresh(true);

$cache = new Cache('file');
$registry->set('cache', $cache);
?>

Вот так сделал, все равно ошибка. Сильно не пинайте, понимаю, что вопросы совсем тупые, но php для меня пока темный лес :ph34r:

Вы кеш вызываете после того, как идет обращение к функции. Кидал скрипт "на глаз" и не проверял. Забыл про кеширование курсов.

Добавьте 


$cache = new Cache('file');
$registry->set('cache', $cache);

После 

$loader = new Loader($registry);

 

Змінено користувачем ImLucky
  • +1 1
Надіслати
Поділитися на інших сайтах


1 минуту назад, ImLucky сказал:

Вы кеш вызываете после того, как идет обращение к функции.

Добавьте 



$cache = new Cache('file');
$registry->set('cache', $cache);

После 


$loader = new Loader($registry);

 

Да, почти понял как это работает. На одну строчку уже ошибся, поправил сейчас. Спасибо большое!

@spectre куда перекинуть на пиво? :ugeek:

Надіслати
Поділитися на інших сайтах


5 минут назад, storer сказал:

Да, почти понял как это работает. На одну строчку уже ошибся, поправил сейчас. Спасибо большое!

@spectre куда перекинуть на пиво? :ugeek:

Это не мне) товарищу выше)

  • +1 1
Надіслати
Поділитися на інших сайтах

Похоже все-таки толком не работает автообновление :(

 

Крон запускает скрипт, но по факту обновления курса не происходит. Посмотрел последнюю цену в пятницу/выходные и сегодня, когда курс обновился - изменений нет. Зашел в админку - дата обновления курса стоит сегодняшняя, т.е. обновление вроде как было (а может дата обновилась на дату последнего входа в админку, т.е. сегодня). Но если нажать на кнопку Обновить, то происходит реальное обновление курса и вот тогда цена уже меняется.

 

Дополнительно поставил этот модуль:

https://www.opencart.com/index.php?route=marketplace/extension/info&extension_id=32352

Он берет курс с другого ресурса (на яху проблемы вроде как с обновлением сейчас), работает вроде бы хорошо, по крайней мере курс обновляет.

 

Так что вопрос остается открытым :-|

Змінено користувачем storer
Надіслати
Поділитися на інших сайтах


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

 

Вы правы, обновление через Яху сейчас не работает, поэтому лично я ставлю этот фикс:
https://www.opencart.com/index.php?route=marketplace/extension/info&extension_id=32694&filter_license=0&filter_download_id=41&sort=date_added

 

Попробуйте поставить его, а тот что стоит сейчас у вас - выключить. Сам модуль и его модификаторы. Ну и обновить всё соответственно. 

Надіслати
Поділитися на інших сайтах


1 час назад, ImLucky сказал:

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

 

Вы правы, обновление через Яху сейчас не работает, поэтому лично я ставлю этот фикс:
https://www.opencart.com/index.php?route=marketplace/extension/info&extension_id=32694&filter_license=0&filter_download_id=41&sort=date_added

 

Попробуйте поставить его, а тот что стоит сейчас у вас - выключить. Сам модуль и его модификаторы. Ну и обновить всё соответственно. 

Все сделал. Будем тестировать пару дней.

Надіслати
Поділитися на інших сайтах


  • 4 months later...

Коллеги, помогите пожалуйста.

 

Есть модификатор, который источник обновления валют - ЦБРФ:

 

<?xml version="1.0" encoding="utf-8"?>
<modification>
    <name><![CDATA[<b style='color:green;'>Курсы валют ЦБ РФ</b>]]></name>
    <code>rf_currency.ocmod</code>
    <version>0.1</version>
    <author><![CDATA[<b style='color:green;'>Ruslan Kozub</b>]]></author>
    <link>[email protected]</link>

    <file path="admin/model/localisation/currency.php">
        <operation>
            <search><![CDATA[public function refresh($force = false) {]]></search>
            <add position="before">
                <![CDATA[
    // modification - rf_currency.ocmod - part #1 - Курсы фалют ЦБ РФ
    public function refreshRF($force = false) {
        $currenciesForUpdate = array();
        $defaultCurrency = $this->config->get('config_currency');
        if ($force) {
            $query = $this->db->query("SELECT * FROM " . DB_PREFIX . "currency WHERE code != '" . $this->db->escape($defaultCurrency) . "'");
        } else {
            $query = $this->db->query("SELECT * FROM " . DB_PREFIX . "currency WHERE code != '" . $this->db->escape($defaultCurrency) . "' AND date_modified < '" .  $this->db->escape(date('Y-m-d H:i:s', strtotime('-1 day'))) . "'");
        }

        /* Валют для обновления не нашли */
        if (! $query->num_rows) {
            return false;
        }
        $currenciesForUpdate[$defaultCurrency] = 1;
        foreach ($query->rows as $result) {
            $currenciesForUpdate[$result['code']] = 1;
        }

        $curl = curl_init();
        curl_setopt($curl, CURLOPT_URL, 'http://www.cbr.ru/scripts/XML_daily.asp');
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($curl, CURLOPT_HEADER, false);
        curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 30);
        curl_setopt($curl, CURLOPT_TIMEOUT, 30);
        $content = curl_exec($curl);
        curl_close($curl);

        /* Ошибка выходим */
        if (! $content) {
            return false;
        }

        $currenciesRF = simplexml_load_string($content);
        /* Ошибка выходим */
        if (! $currenciesRF || count($currenciesRF) == 0) {
            return false;
        }

        foreach ($currenciesRF as $currency) {
            if (isset($currenciesForUpdate[(string)$currency->CharCode]) && $currency->Nominal > 0) {
                $currenciesForUpdate[(string)$currency->CharCode] = str_replace(',', '.', (string)$currency->Value) / $currency->Nominal;
            }
        }

        foreach ($currenciesForUpdate as $code => $val) {
            if ($code != $defaultCurrency) {
                $currenciesForUpdate[$code] = $currenciesForUpdate[$defaultCurrency] / $val;
            }
        }
        $currenciesForUpdate[$defaultCurrency] = 1;

        foreach ($currenciesForUpdate as $code => $val) {
            $this->db->query("UPDATE " . DB_PREFIX . "currency SET value = '" . (float)$val . "', date_modified = '" .  $this->db->escape(date('Y-m-d H:i:s')) . "' WHERE code = '" . $this->db->escape($code) . "'");
        }

        $this->cache->delete('currency');
    }
    // end modification - rf_currency.ocmod - part #1 - Курсы фалют ЦБ РФ
            ]]>
            </add>
        </operation>
        <operation>
        <search><![CDATA[public function refresh($force = false) {]]></search>
        <add position="replace" offset="2"><![CDATA[
    // modification - rf_currency.ocmod - part #2 - Курсы фалют ЦБ РФ
    public function refresh($force = false) {
		$data = array();
		return $this->refreshRF($force);
    // end modification - rf_currency.ocmod - part #2 - Курсы фалют ЦБ РФ
        ]]></add>
        </operation>
    </file>
</modification>

Файл currency-updater.php :

<?php
require_once('config.php');
require_once(DIR_SYSTEM . 'startup.php');
$registry = new Registry();
$loader = new Loader($registry);
$cache = new Cache('file');
$registry->set('cache', $cache);
$registry->set('load', $loader);
$config = new Config();
$registry->set('config', $config);
$db = new DB(DB_DRIVER, DB_HOSTNAME, DB_USERNAME, DB_PASSWORD, DB_DATABASE, DB_PORT);
$registry->set('db', $db);
global $loader, $registry;


$query = $db->query("SELECT * FROM " . DB_PREFIX . "setting WHERE store_id = '0'");

foreach ($query->rows as $setting) {
	if (!$setting['serialized']) {
		$config->set($setting['key'], $setting['value']);
	} else {
		$config->set($setting['key'], json_decode($setting['value'], true));
	}
}

$loader->model('localisation/currency');
$model = $registry->get('model_localisation_currency');
$model->refresh(true);

$cache = new Cache('file');
$registry->set('cache', $cache);
?>

Ошибка CRON такая:

 

PHP Notice: Undefined index: SERVER_PORT in /home/ЛОГИН/domains/САЙТ/public_html/system/startup.php on line 40
PHP Fatal error: Call to a member function trigger() on null in /home/ЛОГИН/domains/САЙТ/public_html/system/storage/modification/system/engine/loader.php on line 42

 

Строки файлов:

startup.php on line 40
 

if ((isset($_SERVER['HTTPS']) && (($_SERVER['HTTPS'] == 'on') || ($_SERVER['HTTPS'] == '1'))) || $_SERVER['SERVER_PORT'] == 443) {

loader.php on line 42

$this->registry->get('event')->trigger('model/' . $route . '/before', array(&$route));

 

===

Сайт https. OcStore 2.3.0.2.3. Пробовал отключать модификатор для ЦБ - результат тот же.

 

Не могу решить задачу, заставить обновляться с ЦБ по крону...

 

Помогите, пожалуйста,..

Надіслати
Поділитися на інших сайтах


Створіть аккаунт або увійдіть для коментування

Ви повинні бути користувачем, щоб залишити коментар

Створити обліковий запис

Зареєструйтеся для отримання облікового запису. Це просто!

Зареєструвати аккаунт

Вхід

Уже зареєстровані? Увійдіть тут.

Вхід зараз
  • Зараз на сторінці   0 користувачів

    • Ні користувачів, які переглядиють цю сторінку

×
×
  • Створити...

Important Information

На нашому сайті використовуються файли cookie і відбувається обробка деяких персональних даних користувачів, щоб поліпшити користувальницький інтерфейс. Щоб дізнатися для чого і які персональні дані ми обробляємо перейдіть за посиланням . Якщо Ви натиснете «Я даю згоду», це означає, що Ви розумієте і приймаєте всі умови, зазначені в цьому Повідомленні про конфіденційність.