Перейти к содержанию
Форум поддержки пользователей VamShop

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


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

Приветствую! Столкнулся с такой задачей:

1. все цены в админке - в евро

2. все цены на сайте - в рублях.

3. ежедневное автоматическое обновление курса евро  и предусмотреть возможность наценки курса. Т.е. чтобы не "попасть" на курсе, накидываем сверху определённый %.

По поводу того, как реализовать п.п.1 и 2 все в курсе, до меня обсуждалось неоднократно. есть FAQ.

Теперь по п.3.

план работ:

1. Получить сегодняшний курс валют, если мы его ещё не получали

2. "наценить" текущий курс фикисрованным %

3. Поднять его в базу.

Теперь по порядку:

1. создаём файл currency.php и заливаем в корень сайта!

2. выполняем в текущей БД запрос из файла mysql.dump

3. открываем файл currency.php и правим блок между комментами: ## Начать трогать здесь и ## Закончить трогать здесь. Всего 3 строчки с русскими комментами в UTF-8. Сложно заблудиться ))

(если наценка курса не нужна - находим строку

       $_SESSION["eurocurs"]=$_SESSION["eurocurs"]+(($_SESSION["eurocurs"]*$percent)/100); и меняем на

       #$_SESSION["eurocurs"]=$_SESSION["eurocurs"]+(($_SESSION["eurocurs"]*$percent)/100);

)  

4. Подключим файл в /includes/application_top.php

находим define('DEBUG', false); и после неё вставляем

include("currency.php");

Код файлов

currency.php


<?php
## Начать трогать здесь
$percent=10; // + этот % к текущему курсу
$rub_id=1; // ИД валюты РУБЛЬ
$errormail='any@mail.com'; // электропочта для отсылки письма с предупреждением, что курс не обновился
## Закончить трогать здесь

unset($_SESSION["eurocurs"]);
function startElement($parser, $name, $attrs) {
global $tag, $rss;
if ($name == 'RSS')
$rss = '^RSS';
elseif ($name == 'RDF:RDF')
$rss = '^RDF:RDF';

$tag .= '^' . $name;
}

function endElement($parser, $name) {
global $tag;
global $itemCount, $items;
if ($name == 'ITEM') {
$itemCount++;
if (!isset($items[$itemCount])) $items[$itemCount] = array('title' => '', 'link' => '', 'desc' => '', 'pubdate' => '');
}

$tag = substr($tag, 0, strrpos($tag, '^'));
}

function characterData($parser, $data) {
global $tag, $chanTitle, $chanLink, $chanDesc, $rss, $imgTitle, $imgLink, $imgUrl;
global $items, $itemCount;

$rssChannel = '';
if ($data) {
if ($tag == $rss . '^CHANNEL^TITLE') {
$chanTitle .= $data;
} elseif ($tag == $rss . '^CHANNEL^LINK') {
$chanLink .= $data;
} elseif ($tag == $rss . '^CHANNEL^DESCRIPTION') {
$chanDesc .= $data;
}
if ($rss == '^RSS') $rssChannel = '^CHANNEL';

if ($tag == $rss . $rssChannel . '^ITEM^TITLE') {
$items[$itemCount]['title'] .= $data;
} elseif ($tag == $rss . $rssChannel . '^ITEM^LINK') {
$items[$itemCount]['link'] .= $data;
} elseif ($tag == $rss . $rssChannel . '^ITEM^DESCRIPTION') {
$items[$itemCount]['desc'] .= $data;
} elseif ($tag == $rss . $rssChannel . '^ITEM^PUBDATE') {
$items[$itemCount]['pubdate'] .= $data;
} elseif ($tag == $rss . $rssChannel . '^IMAGE^TITLE') {
$imgTitle .= $data;
} elseif ($tag == $rss . $rssChannel . '^IMAGE^LINK') {
$imgLink .= $data;
} elseif ($tag == $rss . $rssChannel . '^IMAGE^URL') {
$imgUrl .= $data;
}
}

}

function parseRSS($url) {
global $tag, $chanTitle, $chanLink, $chanDesc, $rss, $items, $itemCount, $imgTitle, $imgLink, $imgUrl;
$chanTitle = '';
$chanLink = '';
$chanDesc = '';
$imgTitle = '';
$imgLink = '';
$imgUrl = '';
$tag = '';
$rss = '';

global $items, $itemCount;

$itemCount = 0;
$items = array(0 => array('title' => '', 'link' => '', 'desc' => '', 'pubdate' => ''));

$xml_parser = xml_parser_create();
xml_set_element_handler($xml_parser, "startElement", "endElement");
xml_set_character_data_handler($xml_parser, "characterData");

@$fp = fopen($url, "r");
$data = "";
while (true) {
@$datas = fread($fp, 4096);
if (strlen($datas) == 0) {
break;
}
$data .= $datas;
}

@fclose($fp);

if ($data) {
$xmlresult = xml_parse($xml_parser, $data);
$xmlerror = xml_error_string(xml_get_error_code($xml_parser));
$xmlcrtline = xml_get_current_line_number($xml_parser);

if ($xmlresult){ displayData(); } else {
mail($errormail, 'Currency!', 'Update currency manualy', 'From: RSS updater <currency@'.$_SERVER["HTTP_HOST"].'>');
$q=mysql_query("
SELECT isvalue FROM currency ORDER BY id DESC
") or die(mysql_error());
$r=mysql_fetch_array($q);
$_SESSION["eurocurs"]=$r["isvalue"];
}

} else {
global $items, $itemCount, $eurocurs;
mail($errormail, 'Currency!', 'Update currency manualy', 'From: RSS updater <currency@'.$_SERVER["HTTP_HOST"].'>');
$q=mysql_query("
SELECT isvalue FROM currency ORDER BY id DESC
") or die(mysql_error());
$r=mysql_fetch_array($q);
$_SESSION["eurocurs"]=$r["isvalue"];
}

xml_parser_free($xml_parser);
}

function displayData() {
global $chanTitle, $chanLink, $chanDesc, $rss, $items, $itemCount, $imgTitle, $imgLink, $imgUrl;
global $items, $itemCount, $eurocurs;
$ex=explode('EUR)', $items[0]['desc']);
$exp=explode('руб',$ex[1]);
$ea=split('  ', strip_tags($exp[0], '<b>'));
$_SESSION["eurocurs"]=strip_tags($ea[0]);
}
include("includes/configure.php");
$link = mysql_connect(DB_SERVER, DB_SERVER_USERNAME, DB_SERVER_PASSWORD)
 or die('Could not connect: ' . mysql_error());
$db_link=mysql_select_db(DB_DATABASE) or die('Could not select database');
@mysql_query ("SET NAMES `utf8`");



$url="http://liverss.ru/currency/";
parseRSS($url);

$q=mysql_query("
SELECT isvalue FROM currency WHERE curdate='".date('Y-m-d')."'
") or die(mysql_error());
$r=mysql_fetch_array($q);
if(!$r["isvalue"]){
$i=mysql_query("INSERT INTO currency (isvalue, curdate) VALUES ('".$_SESSION["eurocurs"]."', '".date('Y-m-d')."')") or die("". mysql_error());
$_SESSION["eurocurs"]=$_SESSION["eurocurs"]+(($_SESSION["eurocurs"]*$percent)/100);
$update="UPDATE currencies SET value='".$_SESSION["eurocurs"]."' WHERE currencies_id='".$rub_id."' LIMIT 1";
mysql_query($update) or die("". mysql_error());
}



     mysql_close($link);
?>
[/code] файл [b]mysql.dump[/b]
[code]
CREATE TABLE IF NOT EXISTS `currency` (
 `id` bigint(20) NOT NULL auto_increment,
 `isvalue` varchar(10) NOT NULL,
 `curdate` date NOT NULL,
 PRIMARY KEY  (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=0 ;

Всё. наслаждаемся ))

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

lodos

Спасибо большое.

Только ещё одно пожелание, прицепите код прямо в тему, отредактируйте своё сообщение и там можно файлы цеплять.

А то ведь letitbit не вечный и просто люди не смогу потом скачать Ваш код, а на форуме всё будет висеть без ограничений.

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

да не вопрос. лишь бы помогло.

я вот подумал, что в этом решении есть одно НО!

этот файл работает на сессиях. и цепляется в application_top.php. соответственно, для каждой новой сессии (любого юзера) он будет выполняться. один раз, правда, но тут вопрос о посещаемости ресурса. нужна ли такая излишняя нагрузка на сервер?

поэтому имею мысль реализовать его через memcached.

Но и тут есть своё но. не у каждого хостёра в стандартной сборке стоит эта либа.

Если будет необходимость - шумите. наверное смогу помочь. и хостом и либой и кодом

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

Спасибо.

Я думаю, кто будет использовать данный код, тот и Ваше предупреждение прочитает :)

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

вобщем, я чёт проникся этой идеей и у себя реализовал.

изменений в коде немного. основное откомментировано.

напоминаю! решение для тех у кого на хосте собрана библиотека "Memcache"

читать о ней тут: http://ru.php.net/manual/en/book.memcache.php


<?php
## Начать трогать здесь
$percent=10; // + этот % к текущему курсу
$rub_id=1; // ИД валюты РУБЛЬ
$errormail='any@mail.com'; // электропочта для отсылки письма с предупреждением, что курс не обновился
$timedown=10800; // время жизни курса memcached, в сек.
## Закончить трогать здесь

$memcache_obj = new Memcache;
$memcache_obj->connect('localhost', 11211);
$eurocurs = $memcache_obj->get('eurocurs');

function startElement($parser, $name, $attrs) {
global $tag, $rss;
if ($name == 'RSS')
$rss = '^RSS';
elseif ($name == 'RDF:RDF')
$rss = '^RDF:RDF';

$tag .= '^' . $name;
}

function endElement($parser, $name) {
global $tag;
global $itemCount, $items;
if ($name == 'ITEM') {
$itemCount++;
if (!isset($items[$itemCount])) $items[$itemCount] = array('title' => '', 'link' => '', 'desc' => '', 'pubdate' => '');
}

$tag = substr($tag, 0, strrpos($tag, '^'));
}

function characterData($parser, $data) {
global $tag, $chanTitle, $chanLink, $chanDesc, $rss, $imgTitle, $imgLink, $imgUrl;
global $items, $itemCount;

$rssChannel = '';
if ($data) {
if ($tag == $rss . '^CHANNEL^TITLE') {
$chanTitle .= $data;
} elseif ($tag == $rss . '^CHANNEL^LINK') {
$chanLink .= $data;
} elseif ($tag == $rss . '^CHANNEL^DESCRIPTION') {
$chanDesc .= $data;
}
if ($rss == '^RSS') $rssChannel = '^CHANNEL';

if ($tag == $rss . $rssChannel . '^ITEM^TITLE') {
$items[$itemCount]['title'] .= $data;
} elseif ($tag == $rss . $rssChannel . '^ITEM^LINK') {
$items[$itemCount]['link'] .= $data;
} elseif ($tag == $rss . $rssChannel . '^ITEM^DESCRIPTION') {
$items[$itemCount]['desc'] .= $data;
} elseif ($tag == $rss . $rssChannel . '^ITEM^PUBDATE') {
$items[$itemCount]['pubdate'] .= $data;
} elseif ($tag == $rss . $rssChannel . '^IMAGE^TITLE') {
$imgTitle .= $data;
} elseif ($tag == $rss . $rssChannel . '^IMAGE^LINK') {
$imgLink .= $data;
} elseif ($tag == $rss . $rssChannel . '^IMAGE^URL') {
$imgUrl .= $data;
}
}

}

function parseRSS($url) {
global $tag, $chanTitle, $chanLink, $chanDesc, $rss, $items, $itemCount, $imgTitle, $imgLink, $imgUrl;
$chanTitle = '';
$chanLink = '';
$chanDesc = '';
$imgTitle = '';
$imgLink = '';
$imgUrl = '';
$tag = '';
$rss = '';

global $items, $itemCount;

$itemCount = 0;
$items = array(0 => array('title' => '', 'link' => '', 'desc' => '', 'pubdate' => ''));

$xml_parser = xml_parser_create();
xml_set_element_handler($xml_parser, "startElement", "endElement");
xml_set_character_data_handler($xml_parser, "characterData");

@$fp = fopen($url, "r");
$data = "";
while (true) {
@$datas = fread($fp, 4096);
if (strlen($datas) == 0) {
break;
}
$data .= $datas;
}

@fclose($fp);

if ($data) {
$xmlresult = xml_parse($xml_parser, $data);
$xmlerror = xml_error_string(xml_get_error_code($xml_parser));
$xmlcrtline = xml_get_current_line_number($xml_parser);

if ($xmlresult){ displayData(); } else {
global $items, $itemCount, $eurocurs, $errormail, $memcache_obj, $timedown;
mail($errormail, 'Currency!', 'Update currency manualy', 'From: RSS updater <currency@'.$_SERVER["HTTP_HOST"].'>');
$q=mysql_query("
SELECT isvalue FROM currency ORDER BY id DESC
") or die(mysql_error());
$r=mysql_fetch_array($q);
$memcache_obj->set('eurocurs',$r["isvalue"], MEMCACHE_COMPRESSED, $timedown);

}

} else {
global $items, $itemCount, $eurocurs, $errormail, $memcache_obj, $timedown;
mail($errormail, 'Currency!', 'Update currency manualy', 'From: RSS updater <currency@'.$_SERVER["HTTP_HOST"].'>');
$q=mysql_query("
SELECT isvalue FROM currency ORDER BY id DESC
") or die(mysql_error());
$r=mysql_fetch_array($q);
$memcache_obj->set('eurocurs',$r["isvalue"], MEMCACHE_COMPRESSED, $timedown);
}

xml_parser_free($xml_parser);
}

function displayData() {
global $chanTitle, $chanLink, $chanDesc, $rss, $items, $itemCount, $imgTitle, $imgLink, $imgUrl, $memcache_obj, $timedown;
global $items, $itemCount, $eurocurs;
$ex=explode('EUR)', $items[0]['desc']);
$exp=explode('руб',$ex[1]);
$ea=split('  ', strip_tags($exp[0], '<b>'));
$memcache_obj->set('eurocurs', strip_tags($ea[0]), MEMCACHE_COMPRESSED, $timedown);
$eurocurs = $memcache_obj->get('eurocurs');
}

if(!$eurocurs){
include("includes/configure.php");
$link = mysql_connect(DB_SERVER, DB_SERVER_USERNAME, DB_SERVER_PASSWORD)
  or die('Could not connect: ' . mysql_error());
$db_link=mysql_select_db(DB_DATABASE) or die('Could not select database');
@mysql_query ("SET NAMES `utf8`");


$url="http://liverss.ru/currency/";
parseRSS($url);

$q=mysql_query("
SELECT isvalue FROM currency WHERE curdate='".date('Y-m-d')."'
") or die(mysql_error());
$r=mysql_fetch_array($q);
if(!$r["isvalue"]){
$i=mysql_query("INSERT INTO currency (isvalue, curdate) VALUES ('".$eurocurs."', '".date('Y-m-d')."')") or die("". mysql_error());
$eurocurs=$eurocurs+(($eurocurs*$percent)/100);
#echo $eurocurs;
$update="UPDATE currencies SET value='".$eurocurs."' WHERE currencies_id='".$rub_id."' LIMIT 1";
mysql_query($update) or die("". mysql_error());
}
  mysql_close($link);
}

   


#echo $memcache_obj->get('eurocurs');
?>
[/code]

Ссылка на сообщение
Поделиться на другие сайты
  • 4 months later...
  • 8 months later...

Чет не работает пишет вот что:

Warning: Cannot modify header information - headers already sent by (output started at /home/vital/domains/my-pandora.ru/public_html/currency.php:157) in /home/vital/domains/my-pandora.ru/public_html/inc/vam_setcookie.inc.php on line 21

Warning: session_start() [function.session-start]: Cannot send session cache limiter - headers already sent (output started at /home/vital/domains/my-pandora.ru/public_html/currency.php:157) in /home/vital/domains/my-pandora.ru/public_html/includes/application_top.php on line 298

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