Перейти к содержанию

Рекомендуемые сообщения

В настройках включено автообновление курса валют при входе в админку. Вроде все ок, но последнее время работает криво. Модуль 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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

DB_DRIVER, DB_HOSTNAME, DB_USERNAME, DB_PASSWORD, DB_DATABASE, DB_PORT

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
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:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
4 minutes ago, storer said:

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

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

  • +1 2

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
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

 

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

 

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

 

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти

  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу

×

Важная информация

На нашем сайте используются файлы cookie и происходит обработка некоторых персональных данных пользователей, чтобы улучшить пользовательский интерфейс. Чтобы узнать для чего и какие персональные данные мы обрабатываем перейдите по ссылке. Если Вы нажмете «Я даю согласие», это означает, что Вы понимаете и принимаете все условия, указанные в этом Уведомлении о Конфиденциальности.