Вставка переменной в формулу
Всем привет. Пишу калькулятор для расчета стоимости заказа.
- Функционал написал, возникла проблема. Нужно в формулу расчета вставлять курс валюты. Парсер валюты написал Код:
<?php <script src="http://code.jquery.com/jquery-latest.js";></script> <SCRIPT> $(document).ready(function () { $.ajax({ type: "GET", async : false, url: "cb.xml", dataType: "xml", success: XmlKurs }); function XmlKurs (xml) { $(xml).find("Valute").each(function(){ if($(this).attr('ID')=='R01239') { p=$(this).find("Value").text(); $("p").append(document.getElementById('tcena').value()*$(this).find("Value")); } }); } }); </script> Есть формула S = (Pbum + Ppec + Potd)*Euro; Переменная Euro должна получаться автоматом из парсера Объявляю функцию var Euro = new function () { $(document).ready(function () { $.ajax({ type: "GET", async : false, url: "cb.xml", dataType: "xml", success: XmlKurs }); function XmlKurs (xml) { $(xml).find("Valute").each(function(){ if($(this).attr('ID')=='R01239') { d=$(this).find("Value").text(); $("p").append(document.getElementById('Euro').value()*$(this).find("Value")); } }); } }); } -В итоге получаю ответ на расчет- Общая стоимость -= Na руб. Стоимость 1 экземпляра = Na руб. Вопрос, что я не так делаю и как подставить число из функции в формулу? |
Цитата:
|
Becass,
игнорируйте комментарий) |
Цитата:
d=$(this).find("Value"); Проблемы не решает |
Becass,
а XML файл можно сюда? |
<?xml version="1.0" encoding="windows-1251" ?> <ValCurs Date="21/11/2015" name="Foreign Currency Market"> <Valute ID="R01010"> <NumCode>036</NumCode> <CharCode>AUD</CharCode> <Nominal>1</Nominal> <Name>Австралийский доллар</Name> <Value>46,6590</Value> </Valute> <Valute ID="R01020A"> <NumCode>944</NumCode> <CharCode>AZN</CharCode> <Nominal>1</Nominal> <Name>Азербайджанский манат</Name> <Value>61,9791</Value> </Valute> <Valute ID="R01035"> <NumCode>826</NumCode> <CharCode>GBP</CharCode> <Nominal>1</Nominal> <Name>Фунт стерлингов Соединенного королевства</Name> <Value>99,0718</Value> </Valute> <Valute ID="R01060"> <NumCode>051</NumCode> <CharCode>AMD</CharCode> <Nominal>100</Nominal> <Name>Армянских драмов</Name> <Value>13,4635</Value> </Valute> <Valute ID="R01090"> <NumCode>974</NumCode> <CharCode>BYR</CharCode> <Nominal>10000</Nominal> <Name>Белорусских рублей</Name> <Value>36,1680</Value> </Valute> <Valute ID="R01100"> <NumCode>975</NumCode> <CharCode>BGN</CharCode> <Nominal>1</Nominal> <Name>Болгарский лев</Name> <Value>35,3944</Value> </Valute> <Valute ID="R01115"> <NumCode>986</NumCode> <CharCode>BRL</CharCode> <Nominal>1</Nominal> <Name>Бразильский реал</Name> <Value>17,2428</Value> </Valute> <Valute ID="R01135"> <NumCode>348</NumCode> <CharCode>HUF</CharCode> <Nominal>100</Nominal> <Name>Венгерских форинтов</Name> <Value>22,3334</Value> </Valute> <Valute ID="R01215"> <NumCode>208</NumCode> <CharCode>DKK</CharCode> <Nominal>10</Nominal> <Name>Датских крон</Name> <Value>92,8161</Value> </Valute> <Valute ID="R01235"> <NumCode>840</NumCode> <CharCode>USD</CharCode> <Nominal>1</Nominal> <Name>Доллар США</Name> <Value>64,8673</Value> </Valute> <Valute ID="R01239"> <NumCode>978</NumCode> <CharCode>EUR</CharCode> <Nominal>1</Nominal> <Name>Евро</Name> <Value>69,3886</Value> </Valute> <Valute ID="R01270"> <NumCode>356</NumCode> <CharCode>INR</CharCode> <Nominal>100</Nominal> <Name>Индийских рупий</Name> <Value>97,9499</Value> </Valute> <Valute ID="R01335"> <NumCode>398</NumCode> <CharCode>KZT</CharCode> <Nominal>100</Nominal> <Name>Казахстанских тенге</Name> <Value>21,1054</Value> </Valute> <Valute ID="R01350"> <NumCode>124</NumCode> <CharCode>CAD</CharCode> <Nominal>1</Nominal> <Name>Канадский доллар</Name> <Value>48,6699</Value> </Valute> <Valute ID="R01370"> <NumCode>417</NumCode> <CharCode>KGS</CharCode> <Nominal>100</Nominal> <Name>Киргизских сомов</Name> <Value>93,7321</Value> </Valute> <Valute ID="R01375"> <NumCode>156</NumCode> <CharCode>CNY</CharCode> <Nominal>1</Nominal> <Name>Китайский юань</Name> <Value>10,1600</Value> </Valute> <Valute ID="R01500"> <NumCode>498</NumCode> <CharCode>MDL</CharCode> <Nominal>10</Nominal> <Name>Молдавских леев</Name> <Value>32,4093</Value> </Valute> <Valute ID="R01535"> <NumCode>578</NumCode> <CharCode>NOK</CharCode> <Nominal>10</Nominal> <Name>Норвежских крон</Name> <Value>75,1544</Value> </Valute> <Valute ID="R01565"> <NumCode>985</NumCode> <CharCode>PLN</CharCode> <Nominal>1</Nominal> <Name>Польский злотый</Name> <Value>16,3024</Value> </Valute> <Valute ID="R01585F"> <NumCode>946</NumCode> <CharCode>RON</CharCode> <Nominal>1</Nominal> <Name>Румынский лей</Name> <Value>15,5882</Value> </Valute> <Valute ID="R01589"> <NumCode>960</NumCode> <CharCode>XDR</CharCode> <Nominal>1</Nominal> <Name>СДР (специальные права заимствования)</Name> <Value>89,5733</Value> </Valute> <Valute ID="R01625"> <NumCode>702</NumCode> <CharCode>SGD</CharCode> <Nominal>1</Nominal> <Name>Сингапурский доллар</Name> <Value>45,9173</Value> </Valute> <Valute ID="R01670"> <NumCode>972</NumCode> <CharCode>TJS</CharCode> <Nominal>1</Nominal> <Name>Таджикский сомони</Name> <Value>10,0914</Value> </Valute> <Valute ID="R01700J"> <NumCode>949</NumCode> <CharCode>TRY</CharCode> <Nominal>1</Nominal> <Name>Турецкая лира</Name> <Value>22,8045</Value> </Valute> <Valute ID="R01710A"> <NumCode>934</NumCode> <CharCode>TMT</CharCode> <Nominal>1</Nominal> <Name>Новый туркменский манат</Name> <Value>18,5335</Value> </Valute> <Valute ID="R01717"> <NumCode>860</NumCode> <CharCode>UZS</CharCode> <Nominal>1000</Nominal> <Name>Узбекских сумов</Name> <Value>24,0695</Value> </Valute> <Valute ID="R01720"> <NumCode>980</NumCode> <CharCode>UAH</CharCode> <Nominal>10</Nominal> <Name>Украинских гривен</Name> <Value>27,1411</Value> </Valute> <Valute ID="R01760"> <NumCode>203</NumCode> <CharCode>CZK</CharCode> <Nominal>10</Nominal> <Name>Чешских крон</Name> <Value>25,6160</Value> </Valute> <Valute ID="R01770"> <NumCode>752</NumCode> <CharCode>SEK</CharCode> <Nominal>10</Nominal> <Name>Шведских крон</Name> <Value>74,4634</Value> </Valute> <Valute ID="R01775"> <NumCode>756</NumCode> <CharCode>CHF</CharCode> <Nominal>1</Nominal> <Name>Швейцарский франк</Name> <Value>63,8206</Value> </Valute> <Valute ID="R01810"> <NumCode>710</NumCode> <CharCode>ZAR</CharCode> <Nominal>10</Nominal> <Name>Южноафриканских рэндов</Name> <Value>46,3835</Value> </Valute> <Valute ID="R01815"> <NumCode>410</NumCode> <CharCode>KRW</CharCode> <Nominal>1000</Nominal> <Name>Вон Республики Корея</Name> <Value>56,1138</Value> </Valute> <Valute ID="R01820"> <NumCode>392</NumCode> <CharCode>JPY</CharCode> <Nominal>100</Nominal> <Name>Японских иен</Name> <Value>52,7527</Value> </Valute> </ValCurs> Пробовал менять <Valute ID="R01239"> <NumCode>978</NumCode> <CharCode>EUR</CharCode> <Nominal>1</Nominal> <Name>Евро</Name> <Value>69,3886</Value> </Valute> На <Valute ID="R01239"> <NumCode>978</NumCode> <CharCode>EUR</CharCode> <Nominal>1</Nominal> <Name>Евро</Name> [COLOR="Lime"]<Value>69</Value>[/COLOR] </Valute> Думал "давится" запятой, но нет |
А почему за курсом валют нужно постоянно обращаться к ЦБ, причем при каждом запросе клиентов?
|
Цитата:
|
Цитата:
|
Цитата:
http://www.cyberforum.ru/php-beginne...ad1494550.html вот отсюда |
Becass,
вот меня интересует эта строка p=$(this).find("Value").text(); что такое p? |
Цитата:
Ну а насчет евро, то по законодательству нашей страны все должно быть в нашей валюте, иное, это нарушение Закона. |
Becass,
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> <script src="//code.jquery.com/jquery-1.11.3.min.js"></script> </head> <body> <div id="tcena">123</div> <p id="res"></p> <p id="res2"></p> <script> $(document).ready(function () { $.ajax({ type: "GET", async : false, url: "cb.xml", dataType: "xml", success: XmlKurs }); function XmlKurs (xml) { $(xml).find("Valute").each(function(){ var atr ='R01239'; if(atr =='R01239') { var price=$(this).find("Value").text().replace(/,/,'.'); console.log(price); $("#res").append(document.getElementById('tcena').value()*price); } }); } }); var Euro = new function () { $(document).ready(function () { $.ajax({ type: "GET", async : false, url: "cb.xml", dataType: "xml", success: XmlKurs }); function XmlKurs (xml) { $(xml).find("Valute").each(function(){ if($(this).attr('ID')=='R01239') { var price=$(this).find("Value").text().replace(/,/,'.'); $("res2").append(document.getElementById('Euro').value()*price); } }); } }); }; </script> </body> </html> |
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <HTML><HEAD><TITLE>Листовки, буклеты, флаеры, плакаты,визитки и др. листовая продукция.</TITLE> <META http-equiv=Content-Type content="text/html; charset=windows-1251"> </head> <body> <div id="tcena">123</div> <p id="res"></p> <p id="res2"></p> <script src="http://code.jquery.com/jquery-latest.js";></script> <SCRIPT> $(document).ready(function () { $.ajax({ type: "GET", async : false, url: "cb.xml", dataType: "xml", success: XmlKurs }); function XmlKurs (xml) { $(xml).find("Valute").each(function(){ var atr ='R01239'; if(atr =='R01239') { var price=$(this).find("Value").text().replace(/,/,'.'); console.log(price); $("#res").append(document.getElementById('tcena').value()*price); } }); } }); function calc1() { var Euro = new function () { $(document).ready(function () { $.ajax({ type: "GET", async : false, url: "cb.xml", dataType: "xml", success: XmlKurs }); function XmlKurs (xml) { $(xml).find("Valute").each(function(){ if($(this).attr('ID')=='R01239') { var price=$(this).find("Value").text().replace(/,/,'.'); $("res2").append(document.getElementById('Euro').value()*price); } }); } }); }; var Li = new Number(list.Li.value); var Si = new Number(list.Si.value); var Ti = new Number(list.Ti.value); var Cf = new Number(list.Cf.value); var Cb = new Number(list.Cb.value); var F = new Number(list.F.checked); var B = new Number(list.B.checked); var Pf = new Number(list.Pf.checked); var N = new Number(list.N.checked); var V = new Number(list.V.checked); var Lg = new Number(list.Lg.checked); var Lm = new Number(list.Lm.checked); if (Li.toString() == "NaN" || Li <= 0) { alert('Введено неверное значение формата!'); list.Li.focus(); return false; } if (Si.toString() == "NaN" || Si <= 0) { alert('Введено неверное значение формата!'); list.Si.focus(); return false; } if ( (Li < 20 || Li > 430) || (Si < 20 || Si > 430) ) { alert('Формат задается в пределах от 20 до 430!'); return false; } if (Ti.toString() == "NaN" || Ti <= 0) { alert('Введено неверное значение тиража!'); list.Ti.focus(); return false; } else { Nil1 = Math.floor(438/ (Li + 1) ); Nis1 = Math.floor(306/ (Si + 1) ); Ni1 = Nil1 * Nis1; Nil2 = Math.floor(438/ (Si + 1) ); Nis2 = Math.floor(306/ (Li + 1) ); Ni2 = Nil2*Nis2; Ni = Math.max(Ni1,Ni2); Na3 = Ti / Ni; Rb = list.RbK.value.substring(0, list.RbK.value.indexOf('_')); K = list.RbK.value.substring(list.RbK.value.indexOf('_')+1); Phs = Math.floor(0.999+(Na3*Rb/70)); if ( Ni1 > Ni2 ) { Prz=(6+(Nil1-1)+(Nis1-1))*0.37*Phs; } else { Prz=(6+(Nil2-1)+(Nis2-1))*0.37*Phs; } Pbum=(0.6 * Rb * K *( Na3 + 100))/4; if (!(Cf-Cb) && ((Li<310 && Si<=240) || (Li<=310 && Si<240) || (Si<310 && Li<=240) || (Si<=310 && Li<240))) { Pl = 1.5*(Cf+Cb); Ppec = 2*(Cf+Cb)+(Cf+Cb)*(10.0+0.0033*Na3); } else { Pl = 3*(Cf+Cb); Ppec = 2*(Cf+Cb)+(Cf+Cb)*(20+0.0033*Na3); } //alert(Ppec); Potd = Pl + F*(0.0022*Ti+500) + B * (20 + Na3 * 0.01) + Pf * Na3 * 0.01 + V*(Na3 * 0.05)+N*(30+Ti*0.003) + Lg * Na3 * 0.25 + Lm * Na3 * 0.5 + Prz; //Общая стоимость тиража S = (Pbum + Ppec + Potd)*res2; console.log(Pbum, Ppec, Potd, Euro); S1 = S / list.Ti.value; S = S.toString().substring(0,S.toString().indexOf(".")+3); S1 = S1.toString().substring(0,S1.toString().indexOf(".")+3); list.result.value = "Общая стоимость тиража = " + S + " руб.\nСтоимость 1 экземпляра = " + S1 + " руб."; return true; } } function format(dx,dy){ document.list.Si.value = dx; document.list.Li.value = dy; } </SCRIPT> Эффекта не дало, формула не получает число. http://joxi.ru/RmzkaQJf6Nzj2O |
Цитата:
Скрипт получения курса стоит на CRON, данные о валюте получает XML файл, а из него уже выводится в JS |
Цитата:
$client = new SoapClient("http://www.cbr.ru/DailyInfoWebServ/DailyInfo.asmx?wsdl"); $curs = $client->GetCursOnDate(["On_date"=>date('Y-m-d', strtotime('now -1 day'))]); $rate = new SimpleXMLElement($curs->GetCursOnDateResult->any); $result = $rate->xpath('ValuteData/ValuteCursOnDate[VchCode="EUR"]'); //сохраняем у себя на сутки, что и возвращаем клиенту при запросах $eur = (float)$result[0]->Vcurs/(int)$result[0]->Vnom; И не заставляйте клиент обрабатывает ненужное. |
Цитата:
<?php $today = date("d/m/Y"); $fp = fopen('cb.xml', 'w'); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, 'http://www.cbr.ru/scripts/XML_daily.asp?date_req='.$today); curl_setopt($ch, CURLOPT_FILE, $fp); curl_exec($ch); fclose($fp); curl_close ($ch); ?> Данные сохраняются в XML файл. И уже из XML файла мне надо получить число которое будет вставляться в формулу $(document).ready(function () { $.ajax({ type: "GET", async : false, url: "cb.xml", dataType: "xml", success: XmlKurs }); function XmlKurs (xml) { $(xml).find("Valute").each(function(){ if($(this).attr('ID')=='R01239') { d=$(this).find("Value").text(); $("p").append(document.getElementById('Euro').value()*$(this).find("Value")); } }); } }); что бы это число не менять каждый день в ручную |
Нахрена вам cURL, и нахрена вам XML, который еще вынужден получать клиент и парсить, если нужна всего одна валюта?
Я не понимаю, какой смысл пыхтеть над тем, что совсем не нужно? Ну неужто не видно сразу, что вы вместо того чтобы единожды, пусть и устаревшим способом получая курс, получить нужное, заставляете клиента заниматься этим постоянно? |
Цитата:
|
А слабо запустить код мной показанный и увидеть что возвращается курс нужной валюты? Используйте полученное значение, какая проблема? Тоже самое (коли и у вас планировщиком раз в сутки получение курса) вы могли бы получить из xml курс евро, а при запросах клиента возвращать его, или же сразу в виде переменной в подключаемый JS поместить, или...
|
Цитата:
Parse error: syntax error, unexpected '[', expecting ')' in Z:\home\calc\www\calc.php on line 3 Цитата:
|
Вот на эту строку
$curs = $client->GetCursOnDate(["On_date"=>date('Y-m-d', strtotime('now -1 day'))]); надо полагать? Причина в том, что у вас древняя версия РНР, а начиная с версии 5.4 массивы можно объявлять так же просто как и в JS, то есть не array(...), а [...] Замените квадратные скобки на круглые и объявите массив. Цитата:
|
Цитата:
Кароче как я понял проще забить на эту идею. Не совсем догоняю ваших рекомендаций |
Проблема еще актуальна, возможно кто то подскажет
|
Денвер давно пора в помойку выбросить, он умер, есть куда более лучший локальный сервер. Более того, писать и проверять код нужно не Денвером, а под те версии ПО, которые будут использоваться на реальном сервере.
А что не понятного? Могу в виде сказки разъяснить - сказочница Арина Родионовна рассказывает серверу сказку раз в день, на ночь, и сервер знает чем оканчивается сказка. Детишки клиенты же постоянно спрашивают сервер чем сказка заканчивается, но он вместо концовки рассказывает заново всю сказку. Есть в этой сказке логика? Вот так и у вас с получением валюты - вы заставляете клиентов опрашивающих сервер постоянно, постоянно же заниматься не нужным. Что касается невозможности получения значения уже на клиенте по запросу, то не вникая в ваш код, надеюсь вы понимаете, что ajax запрос асинхронный, а значит и считать нужно в его контексте. Ну и самый днешово-сердитый способ, это сразу вывод всех переменных так или иначе требуемых клиентом. |
Спасибо за ссылочку. Сейчас поставлю, попробую запустить скрипт
|
laimas,
Вставил код в страницу, вписал в формулу переменную, которая судя по документации ЦБ выдает курс S = (Pbum + Ppec + Potd)*Vcurs; Но эффект тот же, т.е не какого. Куда скрипт должен сохранять полученное число то? |
Знаете что такое cron? Если установили Open Server, то в нем он есть - в настройках его можно задать любую задачу выполняемую по расписанию, тоже самое делается и на сервере - хостер предлагает такую услугу, планировщик задач.
Ну думайте в конце концов. Вас же не динамика курса валют интересует, а установленный курс причем одной валюты. А кроме этого курса всегда будет то, что необходимо как значения конфигурации, и многое из них выгодно хранить не в файле конфигурации в виде переменных, а в базе, так как они могут изменяться во времени. Значит планировщик задач получая по расписанию в ночь на следующий день курс валюты за прошедший день записывает его в базу. Клиент запрашивает, сервер получает курс из базы возвращая его клиенту. Но если запрос клиента асинхронный, то либо расчет в контексте запроса должен быть, либо callback или promise. Если это для вас заоблачно, отдавайте клиенту переменные сразу гарантированно: <html> <head> .... </head> <body> ..... <script> var eur = <?=$eur?>; //$eur полученный из базы курс сохраненный планировщиком задач </script> </body> <html> |
laimas,
т.е надо создать базу и в нее посылать курс который получает скрипт который вы написали выше? Только мне не нужна работа с базой. Мне надо только JS |
Что значит сразу создавать базу? А где же у вас храниться основной контент сайта? Надо полагать в базе, если сайт динамический, а значит база уже существует, и нужно только создать таблицу в ней, которая и будет хранить в себе все конфигурационные переменные подверженные изменениям во времени или же изменяемые оперативно. В эту таблицу и должен писать курс валюты планировщик задач.
Если и с этим проблемы, пишите для начала хотя бы в файл, но разберитесь в конце концов с тем что такое курс, как его получать и использовать. |
Цитата:
|
Я ранее уже писал как получить его, и если асинхронным запросом, и помещать в переменную, а потом использовать, то читать выше. Не понимаете что это такое, вставляйте сразу в вывод страницы и используйте.
|
Решение проблемы на чистом JS
Получаем курс доллара <?php $today = date("d/m/Y"); $fp = fopen('cb.xml', 'w'); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, 'http://www.cbr.ru/scripts/XML_daily.asp?date_req='.$today); curl_setopt($ch, CURLOPT_FILE, $fp); curl_exec($ch); fclose($fp); curl_close ($ch); ?> Получаем нужное число и объявляем функцию <script src="http://code.jquery.com/jquery-latest.js";></script> <SCRIPT> $(document).ready(function () { $.ajax({ url: 'cb.xml', dataType: 'xml' }).done(function (xml) { $(xml).find('Valute').each(function() { if ($(this).attr('ID') == 'R01239') { currency = parseFloat($(this).find('Value') .text().replace(',', '.')); } }); }); }); Вставляем в формулу S = (Pbum + Ppec + Potd) * currency; Не один из представленных в теме ответов не были верными |
Вам известно что такое асинхронность?
Чтобы подставить в формулу полученное асинхронным запросом, формула должна решаться гарантированно после того, как сервер вернул ответ, а клиент "породил" то, что вы пытаетесь подставить в нее. Вам об этом не раз говорилось, вы либо не читаете, либо гоните коней. |
Цитата:
|
Если ранее не удавалось добиться этого же, то ошибка была в том, что подставлялось несуществующее, еще раз говорить почему это происходит не буду.
А вот в чем ошибка получения курса написано выше - вы продолжаете заниматься глупостями, заставляя это же делать и клиентов. |
laimas,
а в чем ошибка то? Крон запустил php Файл ( раз в сутки ), который получил данные в xml, далее JS берет нужные ему данные и вставляет в формулу. Тему можно закрывать |
Ошибка в том, что вы не понимаете самого понятия "установленный курс валюты", отсюда и ваше "кодирование" - как чапаевец с саблей наголо, похрен что головы лишние летят, главное результат.
|
Часовой пояс GMT +3, время: 12:05. |