Předání hodnoty do proměnné

Blackrat
Člen | 17
+
0
-

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);
  }
}
Blackrat
Člen | 17
+
0
-

Č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..

Pepino
Člen | 249
+
0
-

@Blackrat

  public function formSuccess(Form $form, $data): void
  {
	$this->redirect('this', ['country' => $data->country, 'mena' => $data->mena]);
  }

Editoval Pepino (19. 4. 2022 13:32)

Blackrat
Člen | 17
+
0
-

@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)

Pepino
Člen | 249
+
0
-

@Blackrat

public function actionDefault(string $currency=null, string $mena=null){

    $url = 'www.domena.cz/' . $currency . ',' . $mena;
   }
Blackrat
Člen | 17
+
0
-

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..

Pepino
Člen | 249
+
0
-

@Blackrat FormularPresenter.php řádek 15, Co tam máš? Resp. před tím redirectem nesmí být žádný výstup.. Nějaké echo nebo cokoliv.

Blackrat
Člen | 17
+
0
-

Hhh, bingo. Potom bych se chtěl zeptat.. Jakým způsobem uvěřovat, že v proměné $currency je to co má být? Když pomineme nějaký další kód. Já to vždy amatersky řešil var_dumpem/echem..

Pepino
Člen | 249
+
0
-

@Blackrat Jestli používáš tracy tak zkus funkci bdump a pak koukni do záložky dumps.

Blackrat
Člen | 17
+
0
-

@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>
Pepino
Člen | 249
+
+2
-

@Blackrat ty promenne posli v tom redirectu a do sablony je predej az v tom action.

Blackrat
Člen | 17
+
0
-

Super, díky moc. Fakt si pomohl mega moc. Cením :) Já bych Jako asi chápu, proč to tak je, ale sám bych to nikdy nevymyslel, protože bych to po měsíci zabalil..