lodos 0 Опубликовано 16 декабря, 2009 Жалоба Share Опубликовано 16 декабря, 2009 Приветствую! Столкнулся с такой задачей: 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 ; Всё. наслаждаемся )) Ссылка на сообщение Поделиться на другие сайты
support 447 Опубликовано 16 декабря, 2009 Жалоба Share Опубликовано 16 декабря, 2009 lodos Спасибо большое. Только ещё одно пожелание, прицепите код прямо в тему, отредактируйте своё сообщение и там можно файлы цеплять. А то ведь letitbit не вечный и просто люди не смогу потом скачать Ваш код, а на форуме всё будет висеть без ограничений. Ссылка на сообщение Поделиться на другие сайты
support 447 Опубликовано 17 декабря, 2009 Жалоба Share Опубликовано 17 декабря, 2009 Спасибо, так лучше, а то зайдёшь через год например, а файла-то нет уже :) Ссылка на сообщение Поделиться на другие сайты
lodos 0 Опубликовано 17 декабря, 2009 Автор Жалоба Share Опубликовано 17 декабря, 2009 да не вопрос. лишь бы помогло. я вот подумал, что в этом решении есть одно НО! этот файл работает на сессиях. и цепляется в application_top.php. соответственно, для каждой новой сессии (любого юзера) он будет выполняться. один раз, правда, но тут вопрос о посещаемости ресурса. нужна ли такая излишняя нагрузка на сервер? поэтому имею мысль реализовать его через memcached. Но и тут есть своё но. не у каждого хостёра в стандартной сборке стоит эта либа. Если будет необходимость - шумите. наверное смогу помочь. и хостом и либой и кодом Ссылка на сообщение Поделиться на другие сайты
support 447 Опубликовано 17 декабря, 2009 Жалоба Share Опубликовано 17 декабря, 2009 Спасибо. Я думаю, кто будет использовать данный код, тот и Ваше предупреждение прочитает :) Ссылка на сообщение Поделиться на другие сайты
lodos 0 Опубликовано 17 декабря, 2009 Автор Жалоба Share Опубликовано 17 декабря, 2009 вобщем, я чёт проникся этой идеей и у себя реализовал. изменений в коде немного. основное откомментировано. напоминаю! решение для тех у кого на хосте собрана библиотека "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] Ссылка на сообщение Поделиться на другие сайты
support 447 Опубликовано 17 декабря, 2009 Жалоба Share Опубликовано 17 декабря, 2009 Спасибо, что поделились решением. Ссылка на сообщение Поделиться на другие сайты
darklend 0 Опубликовано 8 мая, 2010 Жалоба Share Опубликовано 8 мая, 2010 после добавления include("currency.php"); в файл /includes/application_top.php перестает работать каптча :( кто нить знает как поправить ? Ссылка на сообщение Поделиться на другие сайты
support 447 Опубликовано 8 мая, 2010 Жалоба Share Опубликовано 8 мая, 2010 Наверное в currency.php что-то не так. Ссылка на сообщение Поделиться на другие сайты
vitalp1982 0 Опубликовано 23 января, 2011 Жалоба Share Опубликовано 23 января, 2011 Чет не работает пишет вот что: 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 Ссылка на сообщение Поделиться на другие сайты
Рекомендуемые сообщения