Skip to content

Instantly share code, notes, and snippets.

@s3va
Created July 22, 2020 19:59
Show Gist options
  • Save s3va/060e5afa233ccafc73e884dc991e4e44 to your computer and use it in GitHub Desktop.
Save s3va/060e5afa233ccafc73e884dc991e4e44 to your computer and use it in GitHub Desktop.
Super Market For SeyKo2. Currency cources and metall prices from cbr.ru by SOAP.
<?php
session_start();
error_log("!!hph://input!! ".file_get_contents("php://input")." !!!!!!!!!!!!!");
error_log("!!\$_POST!!!!!!! ".print_r($_POST,TRUE)." !!!!!!!!!!!!!");
error_log("NNNNNN ".print_r($_SESSION,TRUE)." NNNN");
if(isset($_POST['val'])){
if($_POST['val']=='USD')
$_SESSION['val']='USD';
elseif($_POST['val']=='EUR')
$_SESSION['val']='EUR';
else
$_SESSION['val']='RUB';
}
if($_SESSION['val']=='USD' && isset($_SESSION['USDcurs'])){
$multiply = $_SESSION['USDcurs'];
$simbol = '&#36;';
}elseif($_SESSION['val']=='EUR' && isset($_SESSION['EURcurs'])){
$multiply = $_SESSION['EURcurs'];
$simbol = '&euro;'; // '&#128;'
}else{
$multiply=1;
$simbol= '&#8381';
}
?>
<html>
<head>
<title>
Super Market
</title>
<style>
table {
border: solid;
}
td, th {
padding: 4px;
}
tr {
background: #808080;
}
.parent {
display: flex;
flex-wrap: wrap;
justify-content: center;
background: #888;
}
.box {
flex: 1 1 350px; /* Stretching: */
flex: 0 1 600px; /* No stretching: */
margin: 10px;
background: #ccffcc;
}
</style>
</head>
<body style="background:black;">
<h2 style="text-align:center; background:brown;">This is Super Market!</h2>
<div class="parent white">
<?php
$metally = array(
1 => 'Gold',
2 => 'Silver',
3 => 'Platina',
4 => 'Palladi',
);
$wsdl = 'http://www.cbr.ru/DailyInfoWebServ/DailyInfo.asmx?WSDL'; // указываем адрес WSDL-описания SOAP-сервиса, оттуда PHP возьмет информацию о доступных методах и их параметрах
try {
$euro_to = 0;
$cbr = new SoapClient($wsdl,array('soap_version'=> SOAP_1_2, 'exceptions'=>true)); // создаем клиент для подключения к SOAP-сервису
$date = $cbr->GetLatestDateTime(); // получаем последнюю дату, за которую есть курс
// можно, ко формировать ее вручную, но нужно учитывать, что по выходным и праздникам торги не проводятся, поэтому лучше сделать так
$result = $cbr->GetCursOnDateXML(array('On_date'=>$date->GetLatestDateTimeResult)); //запрашиваем данные о курсах за указанную дату в формате XML
// к сожалению, возможности запросить курс отдельной валюты не предусмотрено, поэтому придется пройтись циклом по всем полученным
if ($result->GetCursOnDateXMLResult->any) { // если в ответе сервера есть XML с курсами валют
// echo $result->GetCursOnDateXMLResult->any . "\n================\n";
$xml = new SimpleXMLElement($result->GetCursOnDateXMLResult->any); // открываем его как XML-объект
// echo $xml->attributes()->OnDate . "\n===============\n";
// echo $xml[0]['OnDate'] . "\n===============\n";
echo "<table class=\"box red\"><caption style=\"color:white\">Currency's exchange rates on (".(new DateTime($xml[0]['OnDate']))->format("d M Y").")</caption>\n";
foreach ($xml->ValuteCursOnDate as $currency) { // и начинаем обходить
if($currency->VchCode=='EUR'){
$_SESSION['EURcurs']=(string)$currency->Vcurs;
echo '<tr style="background-color:silver">';
}elseif($currency->VchCode=='USD'){
echo '<tr style="background-color:#80FF80">';
$_SESSION['USDcurs']=(string)$currency->Vcurs;
} else { echo "<tr>\n"; }
echo "<td style=\"text-align:right\">".$currency->Vnom . "</td><td>" . trim($currency->Vname) . "</td><td>" . $currency->Vcurs . " &#8381;</td><td style=\"text-align:right\">" . $currency->Vcode . "</td><td>" . $currency->VchCode . "</td>\n";
if ($currency->VchCode=='EUR') { // VchCode содержит код валюты, для евро это EUR, для доллара — USD
$euro_to = floatval($currency->Vcurs); // цена за указанное в Vnom количество валюты
$euro_from = $currency->Vnom; // для доллара и евро количество равно единице, для других валют может отличаться
// чтобы получить реальный курс за одну единицу валюты, нужно разделить $currency->Vcurs на $currency->Vnom
}
echo "</tr>\n";
}
if ($euro_to!=0) {
// здесь можно вставить код, который обновляет данные в магазине
}
echo "</table>\n";
} else
echo 'Error!';
} catch (Exception $e) { // на всякий случай обработчик ошибок
echo 'Error: '.$e->getMessage();
}
//$wsdl = 'http://www.cbr.ru/DailyInfoWebServ/DailyInfo.asmx?WSDL'; // указываем адрес WSDL-описания SOAP-сервиса, оттуда PHP возьмет информацию о доступных методах и их параметрах
try {
// print (new DateTime)->format('c')."\n" ;
// print (new DateTime)->modify('-7 day')->format('c')."\n" ;
$cbr = new SoapClient($wsdl,array('soap_version'=> SOAP_1_2, 'exceptions'=>true)); // создаем клиент для подключения к SOAP-сервису
//echo $cbr->GetLatestDateTime()->GetLatestDateTimeResult."\n"; // получаем последнюю дату, за которую есть курс
// можно, ко формировать ее вручную, но нужно учитывать, что по выходным и праздникам торги не проводятся, поэтому лучше сделать так
//$result = $cbr->DragMetDynamicXML(array('fromDate'=>((new DateTime)->modify('-7 day')->format('c')),'ToDate'=>((new DateTime)->format('c')))); //запрашиваем данные о курсах за указанную дату в формате XML
$result = $cbr->DragMetDynamic(array('fromDate'=>((new DateTime)->modify('-7 day')->format('c')),'ToDate'=>((new DateTime)->modify('1 day')->format('c')))); //запрашиваем данные о курсах за указанную дату в формате XML
//echo "\n----------------\n".$result->DragMetDynamicXMLResult->any . "\n--------\n";
// echo "\n----------------\n".$result->DragMetDynamicResult->any . "\n--------\n";
// к сожалению, возможности запросить курс отдельной валюты не предусмотрено, поэтому придется пройтись циклом по всем полученным
//if ($result->DragMetDynamicXMLResult->any) { // если в ответе сервера есть XML с курсами валют
if ($result->DragMetDynamicResult->any) { // если в ответе сервера есть XML с курсами валют
//$xml = new SimpleXMLElement($result->DragMetDynamicXMLResult->any); // открываем его как XML-объект
$xml = new SimpleXMLElement($result->DragMetDynamicResult->any); // открываем его как XML-объект
// echo $xml->attributes()->OnDate . "\n===============\n";
// echo $xml[0]['OnDate'] . "\n===============\n";
foreach ($xml->DragMetall->DrgMet as $met) { // и начинаем обходить
// echo (new DateTime($met->DateMet))->format('Y M d') . " " . $metally["$met->CodMet"] . " " . $met->price . "\n";
$arraydata[(new DateTime($met->DateMet))->format('Y M d')]["$met->CodMet"] = $met->price;
////if ($currency->VchCode=='EUR') { // VchCode содержит код валюты, для евро это EUR, для доллара — USD
//// $euro_to = floatval($currency->Vcurs); // цена за указанное в Vnom количество валюты
//// $euro_from = $currency->Vnom; // для доллара и евро количество равно единице, для других валют может отличаться
// чтобы получить реальный курс за одну единицу валюты, нужно разделить $currency->Vcurs на $currency->Vnom
////}
}
} else
echo 'Error!';
} catch (Exception $e) { // на всякий случай обработчик ошибок
echo 'Error: '.$e->getMessage();
}
//echo '<table style="border: 1px solid black; border-collapse: collapse; width: 100%;"><caption>Drag Metall Prices</caption><tr><th>Date</th>';
echo "<div class=\"box white\" style=\"background:grey;\">\n";
echo '<table style="width:100%;background:#ccffcc;"><caption style="color:yellow;">Drag Metall Prices</caption><tr><th>Date</th>';
foreach($metally as $h){
echo "<th>$h</th>";
}
echo "</tr>\n";
setlocale(LC_MONETARY, 'ru_RU');
foreach($arraydata as $data => $prices) {
echo "<tr><th>$data</th>\n";
echo "<td style=\" background-color:YELLOW\">". money_format('%.2n',$prices[1]/$multiply) ." $simbol</td><td style=\"background-color:silver\"> ".
money_format('%.2n',$prices[2]/$multiply) ." $simbol</td><td style=\"background-color:#d0d0d0\"> ".
money_format('%.2n',$prices[3]/$multiply) ." $simbol</td><td style=\"background-color:#f0f0f0\"> ".
money_format('%.2n',$prices[4]/$multiply) ." $simbol</td>\n";
// foreach($prices as $price) {
// echo "<td>$price</td>";
// }
echo "</tr>\n";
}
echo "</table>\n";
if(isset($_SESSION['val']))
switch($_SESSION['val']){
case 'RUB':
$v='USD';
break;
case 'USD':
$v='EUR';
break;
case 'EUR':
$v='RUB';
break;
default:
$v='USD';
}
else
$v='USD';
echo '<form action="/" method="POST">
<button type="submit" name="val" value="'.$v.'" />switch to '.$v.'</button>
</form>';
echo "</div>\n";
///// ------------------------- /////
?>
</div>
</body></html>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment