轉貼至:老裁縫小鋪
如果你的購物網站有多種貨幣標價,當你進到後台的本地化管理畫面下的貨幣管理畫面中,除了會顯示出所有 使用到貨幣資料外,還有一個「更新貨幣」按鈕,按了這個按鈕,所使用到的貨幣與預設貨幣間的匯率就會更 新成最新的匯率比。
老裁縫的一位客戶每次都要進到後台按這個「更新貨幣」按鈕,覺得非常麻煩,如果不調整,又怕萬一匯率有 個大變動會造成損失,因此希望老裁縫給他一個自動更新匯率的方法。
我們可以先研究一下,這個「更新貨幣」按鈕到底是作了什麼,可以更新系統內的匯率;然後我們再談如何作 到自動更新。
當你按下這個「更新貨幣」按鈕時,OSC( 包含OSC,ZentCart,XTC,TWE)會到 admin/includes/function/下執行 一支程式 localization.php,這支 localization.php就是整個更新匯率的主要角色;裡面主要有兩個函數 quote_oanda_currency(),quote_xe_currency(),它們分別可以連到 http://www.oanda.com 及 http://www.xe.com 這兩 個網站取得最新的匯率資料。其中OSC、XTC、TWE是用 cgi 方式連到這兩個網站;ZentCart 則是用 Web Service 執行。
Oanda 及 Xe 兩個網站都以提供網際網路匯率交換資訊為主要業務;OSC 的匯率更新程式會先透過 quote_oanda_currency() 連到 Oanda,取得你要更新的匯率,萬一因為 Oanda 網路忙線,沒有取得匯率資料,就 再透過 quote_xe_currency(),連到 Xe 取得匯率資料,想想,OCS 還真是考慮週到,就為了保險起見,一個是主 要主機,另一個則是備份主機,這也就是為什麼OSC 提供兩組程式分別連到兩個網站的原因。
知道 OSC 如何更新匯率之後,接下來的問題是如何讓 OSC 可以自動更新而不是不時手動更新呢?我們可以寫一 支像下面這樣的程式,在 linux 中可以用 crontab 或在 windows 中使用排程程式讓這支程式每天可以自動執行一 次,這樣就能達到自動更新匯率的目的。
$currency_query = tep_db_query("select currencies_id, code, title from " . TABLE_CURRENCIES);
while ($currency = tep_db_fetch_array($currency_query)) {
if($currency['code'] != "TWD"){
$quote_function = 'quote_oanda_currency';
$rate = $quote_function($currency['code']);
if (empty($rate) ) {
$quote_function = 'quote_xe_currency';
$rate = $quote_function($currency['code']);
}
if (tep_not_null($rate)) {
tep_db_query("update " . TABLE_CURRENCIES . " set value = '" . $rate . "', last_updated = now() where currencies_id = '" . (int)$currency['currencies_id'] . "'");
}
}
}
function quote_oanda_currency($code, $base = "TWD") {
$page = file('http://www.oanda.com/convert/fxdaily?value=1&redirected=1&exch='.$code . '&format=CSV&dest=Get+Table&sel_list=' . $base);
$match = array();
preg_match('/(.+),(\w{3}),([0-9.]+),([0-9.]+)/i', implode('', $page), $match);
if (sizeof($match) > 0) {
return $match[3];
} else {
return false;
}
}
function quote_xe_currency($to, $from ="TWD") {
$page = file('http://www.xe.net/ucc/convert.cgi?Amount=1&From=' . $from . '&To=' . $to);
$match = array();
preg_match('/[0-9.]+\s*' . $from . '\s*=\s*([0-9.]+)\s*' . $to . '/', implode('', $page), $match);
if (sizeof($match) > 0) {
return $match[1];
} else {
return false;
}
}
// 以上程式為概念示意,除了必需 inculde 適當包含檔外,由於 OSC 版本眾多,資料庫操作指令在各版本間並不 相同;必需使用正確的資料庫操作指令寫法。例如 zentcart 的資料庫操作指令則使用如下方式
ZenCart 的資料庫操作指令使用方式如下
$currency = $db->Execute("select currencies_id, code, title from " . TABLE_CURRENCIES);
$db->Execute("update " . TABLE_CURRENCIES . " set value = '" . $rate . "', last_updated = now() where currencies_id = '" . (int)$currency->fields['currencies_id'] . "'");
XTC 的資料庫操作指令則使用如下方式
$currency_query = xtc_db_query("select currencies_id, code, title from " . TABLE_CURRENCIES);
$currency = xtc_db_fetch_array($currency_query);
xtc_db_query("update " . TABLE_CURRENCIES . " set value = '" . $rate . "', last_updated = now() where currencies_id = '" . $currency['currencies_id'] . "'");