Jump to content
Search In
  • More options...
Find results that contain...
Find results in...
  • Sign Up

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


Recommended Posts

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

 

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

Link to post
Share on other sites

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

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

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

Link to post
Share on other sites

Создать в папке 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
Link to post
Share on other sites

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

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

DB_DRIVER, DB_HOSTNAME, DB_USERNAME, DB_PASSWORD, DB_DATABASE, DB_PORT

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

Link to post
Share on other sites

6 hours ago, storer said:

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

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


DB_DRIVER, DB_HOSTNAME, DB_USERNAME, DB_PASSWORD, DB_DATABASE, DB_PORT

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

 

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

Edited by ImLucky
Link to post
Share on other sites

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

 

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

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

 

Link to post
Share on other sites

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

[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?

Edited by storer
Link to post
Share on other sites

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
Link to post
Share on other sites
7 минут назад, spectre сказал:

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

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

 

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

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

Link to post
Share on other sites

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

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

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

Link to post
Share on other sites
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);
?>

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

Edited by storer
Link to post
Share on other sites

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

Edited by spectre
Link to post
Share on other sites
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);

 

Edited by ImLucky
  • +1 1
Link to post
Share on other sites

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

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

Добавьте 



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

После 


$loader = new Loader($registry);

 

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

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

Link to post
Share on other sites

4 minutes ago, storer said:

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

Написал в личку

  • +1 2
Link to post
Share on other sites

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

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

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

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

  • +1 1
Link to post
Share on other sites

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

 

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

 

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

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

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

 

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

Edited by storer
Link to post
Share on other sites

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

 

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

 

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

Link to post
Share on other sites

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

 

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

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

Link to post
Share on other sites

Похоже, что работает. Круто блин B)

Link to post
Share on other sites

  • 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>revoltiks@gmail.com</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. Пробовал отключать модификатор для ЦБ - результат тот же.

 

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

 

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

Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...

Important Information

On our site, cookies are used and personal data is processed to improve the user interface. To find out what and what personal data we are processing, please go to the link. If you click "I agree," it means that you understand and accept all the conditions specified in this Privacy Notice.