Předání hodnoty do proměnné
- Blackrat
- Člen | 17
Zdravím, Mám takovýhle presenter. Potřeboval bych nějak získat hodnotu, kterou si uživatel pomocí radio buttonu vybere a tu vložit do proměnné $data. Základem apky je, že si stahuji data z jedné webovky a potřebuju měnit konec url dle toho, co tam uživatel zadá, že chce (USD, EUR, CAD..) atd
Začínám teprve, tak kdyžtak poprosím nějak stravitelně lajcky.
Děkuji :)
final class PokusPresenter extends Nette\Application\UI\Presenter
{
public function actionDefault(){
**$url = www.domena.cz/.'$data'.;**
}
protected function createComponentMonthSelector(): Form
{
$form = new Form;
$countries = [
'Vyb' => 'Vyber',
'Jan' => 'January',
'Feb' => 'February',
'Mar' => 'March',
'Apr' => 'April',
'May' => 'May',
'Jun' => 'June',
'Jul' => 'July',
'Aug' => 'August',
'Sep' => 'September',
'Oct' => 'October',
'Nov' => 'November',
'Dec' => 'December',
];
$form->addSelect('country', 'Country:', $countries)
->setDefaultValue('Jan');
$mena = [
'USD' => 'USD',
'EUR' => 'EUR',
'AUD' => 'AUD',
'CHF' => 'CHF',
'GBP' => 'GBP',
];
$form->addRadioList('mena', 'Měna:', $mena);
$form->addSubmit('send', 'Klikni');
$form->onSuccess[] = [$this, 'formSuccess'];
return $form;
}
public function formSuccess(Form $form, $data): void
{
$this->template->add('month_name', $data->country);
}
}
- Polki
- Člen | 553
nastuduj si:
- Životní cyklus presenteru
- Že success metody formulářů jsou signály, tedy v životním cyklu na stejné úrovni jako handle metody
- Co je to instanční proměnná
- Proč není dobré skládat URL tak jak to děláš ty
- Co je to GET metoda
- A jak ji využít, aby jsi mohl udělat dotaz na cizí stránku a neskládat u toho URL konkatenací.
S tím by ses měl dostat k požadovanému výsledku. Pak bych ještě doporučoval načíst si tady blog, nebo nějaké návody na netu, kde najdeš BestPractices a nebo nějaké online kurzy.
- Blackrat
- Člen | 17
Čau, tohle je na mě hodně pokročilé, co vše si mi poslal. Nešlo by to prosím nějak zjednodušeně napsat? URL – ok chápem, že to není ideální, ale mám to v rámci nějakého samostudia, kde práce s URL není priorita. Ten zbytek asi chápu, ale vůbec nevím, jak ty informace využít na tento problém..
- Blackrat
- Člen | 17
@Pepino
Něco podobného jsem zkoušel konkrétně
$this->redirect('default', ['currency' => $data->mena]);
Nechápu ale princip, jak to dostat do variable $data, která je zde:
public function actionDefault(string $data=null){
$url = www.domena.cz/.'$data'.;
}
Vlastně ani nevím, jestli to dává smysl tohle.. V hlavě mám takovou myšlenku, že po vyplnění formuláře se klikne na button a ten to pak redirectne do actionDefault a následně se provede něco..
Editoval Blackrat (19. 4. 2022 14:07)
- Blackrat
- Člen | 17
Tak něco takového jsem měl včera. Jsem celkem rád, že jsem nebyl zas tak daleko od řešení. Jenom asi poslední detail..
https://ibb.co/92Qd3cz Tuhle mi to házelo teda i včera..
- Blackrat
- Člen | 17
@Pepino
Ej super, funguje krásně. Jenom mi po napsání directu přestanou funguvat
některé proměnné v šabloně. Konkrétně 'month_name'
a
'currency_name'
. Mohl bych tě poprosit ještě o tohle? Udělal
jsem ještě pár změn, protože tam bylo pár logických chyb, ale overall to
je stejný.
Když si bdumpnu ($data->currency)
a
($data->month)
, tak to v sobě má value takové, jaké má
mít, ale jako by se to neposlalo dál do šablony. Asi je ještě dobrý
říct, že než jsem přidal redirect, tak to fungovalo.. :)
Presenter:
final class PokusPresenter extends Nette\Application\UI\Presenter
{
public function actionDefault(string $url_currency=null){
error_reporting(0);
if ($url_currency!=null){
$url = 'https://www.cnb.cz/cs/financni-trhy/devizovy-trh/kurzy-devizoveho-trhu/kurzy-devizoveho-trhu/vybrane.txt?od=01.01.2021&do=31.12.2021&mena='.$url_currency.'&format=txt';
$data = file_get_contents("$url");
$data = explode("Kurz\n", $data);
$array = explode ("\n", $data[1]);
$array_months = array();
foreach($array as $value) {
if ($value == null) {
continue;
}
$parts = explode('|', $value);
$datum = explode ('.', $parts[0]);
$month_int = (int) $datum[1];
$value_thousand = str_replace (',', '',$parts[1]);
$value_int = (int) $value_thousand;
$array_months[$month_int]["sum"] = ($array_months[$month_int]["sum"] + $value_int);
$array_months[$month_int]["count"] = $array_months[$month_int]["count"]+1;
}
//reIndexace pole
$array_months = array_values($array_months);
foreach ($array_months as $key => $month ){
$array_months[$key]["avg"] = round ( ($month["sum"]) / ($month["count"]) /1000, 3);
$array_months[$key]["sum"] = $array_months[$key]["sum"] / 1000;
}
//rozdíl začátek a konec roku
$diff = $array_months[0]["avg"] - $array_months[11]["avg"];
$this->template->array_months = $array_months;
$this->template->diff = $diff;
}
}
protected function createComponentMonthSelector(): Form
{
$form = new Form;
$months = [
'Vyb' => 'Vyber',
'Jan' => 'January',
'Feb' => 'February',
'Mar' => 'March',
'Apr' => 'April',
'May' => 'May',
'Jun' => 'June',
'Jul' => 'July',
'Aug' => 'August',
'Sep' => 'September',
'Oct' => 'October',
'Nov' => 'November',
'Dec' => 'December',
];
$form->addSelect('month', 'Month:', $months)
->setDefaultValue('Jan');
$currency = [
'USD' => 'USD',
'EUR' => 'EUR',
'AUD' => 'AUD',
'CHF' => 'CHF',
'GBP' => 'GBP',
];
$form->addRadioList('currency', 'Currency:', $currency);
$form->addSubmit('send', 'Klikni');
$form->onSuccess[] = [$this, 'formSuccess'];
return $form;
}
public function formSuccess(Form $form, $data): void
{
bdump($data->month);
$this->template->add('month_name', $data->month);
$this->template->add('currency_name', $data->currency);
$this->redirect('this', ['url_currency' => $data->currency]);
}
}
Šablona:
{control monthSelector}
<p>{$currency_name}</p>
{switch $month_name}
{case 'Jan'}
{$var = $array_months[0]["avg"]}
{$chosenMonth = January}
{case 'Feb'}
{$var = $array_months[1]["avg"]}
{$chosenMonth = February}
{case 'Mar'}
{$var = $array_months[2]["avg"]}
{$chosenMonth = March}
{case 'Apr'}
{$var = $array_months[3]["avg"]}
{$chosenMonth = April}
{case 'May'}
{$var = $array_months[4]["avg"]}
{$chosenMonth = May}
{case 'Jun'}
{$var = $array_months[5]["avg"]}
{$chosenMonth = June}
{case 'Jul'}
{$var = $array_months[6]["avg"]}
{$chosenMonth = July}
{case 'Aug'}
{$var = $array_months[7]["avg"]}
{$chosenMonth = August}
{case 'Sep'}
{$var = $array_months[8]["avg"]}
{$chosenMonth = September}
{case 'Oct'}
{$var = $array_months[9]["avg"]}
{$chosenMonth = October}
{case 'Nov'}
{$var = $array_months[10]["avg"]}
{$chosenMonth = November}
{case 'Dec'}
{$var = $array_months[11]["avg"]}
{$chosenMonth = December}
{default}
{$var = Vyber}
{$chosenMonth = '???'}
{/switch}
<table class="styled-table">
<thead>
<tr>
<th colspan="4">{$chosenMonth} (průměr)</th>
</tr>
</thead>
<tbody>
<tr>
<td class="diff" colspan="4">1 {$currency_name} = {$var} CZK</td>
</tr>
<tbody>
<thead>
<tr>
<th>Měsíc</th>
<th>SUMA</th>
<th>Počet</th>
{* <th>Average</th>*}
</tr>
</thead>
{foreach $array_months as $key => $am}
<tbody>
<tr>
<td>{$key}.</td>
<td>{$am[sum]}</td>
<td>{$am[count]}</td>
{* <td>{$am[avg]}</td>*}
</tr>
<tbody>
{/foreach}
<thead>
<tr>
<th colspan="3">ROZDÍL</th>
</tr>
</thead>
<tbody>
<tr>
<td class="diff" colspan="3">{$diff}</td>
</tr>
</tbody>
</table>