Zpracování formuláře odeslaného přes AJAX

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
quiced
Člen | 85
+
0
-

Zdravím,

snažím se vytvořit ve své aplikaci odeslání formuláře za pomocí nette.ajax.js. Formulář se mi přes AJAX odešle i s hodnotami ovšem mám tam trochu specifické zpracování formuláře a nevím si rady jak postupovat po odeslání formuláře. Mám totiž na stránce graf a formulář, který slouží pro nastavení časového období a právě ten formulář odesílám přes AJAX.

Při rendrování odesílám do šablony data do toho grafu. Ovšem nevím jak si poradit s tím formulářem. Udělal jsem to tak, že formulář odesílám přes GET a u rendrování mám filtrování podle data vypadá to takto:

public functio renderKeywordDetail($id){
	    $date_from = $this->getParam('date_from');
		$date_to = $this->getParam('date_to');

        if(isset($date_from) AND isset($date_to)){
            $positions = $this->checkerRepository->getPositionTable()->where('keyword_id = ? AND date >= ? AND date <= ?',$id,$date_from,$date_to);
        }else{
            $positions = $this->checkerRepository->getPositionTable()->where(array('keyword_id' => $id));
        }
        $position_template = array();
        foreach($positions as $position){
            $position_to_template = array();
            $position_to_template[0] = $position['id'];
            $position_to_template[1] = $position['position'];
            $position_template[] = $position_to_template;
        }
		$this->template->keyword_positions_json = $position_template;
}

Zde mám ještě ten formulář:

    public function createComponentDateFilterForm(){
        $date_filter = new Form;
        $date_filter->setMethod('GET');
        $date_filter->getElementPrototype()->class('ajax');
        $date_filter->addText('date_from', 'Date from');
        $date_filter->addText('date_to', 'Date to');
        $date_filter->addSubmit('submit', 'Submit');
        return $date_filter;
    }

Teď bohužel nevím jak udělat to, aby se po odeslání formuláře přes AJAX zavolalo rendrování a změnily se data v šabloně. Myslím si, že to jak jsem to udělal není ideální a možná by bylo nejlepší vytvořit funkci pro zpracování formuláře a odeslat do šablony jenom json, který už bych zpracoval.

Díky za pomoc.

TomasHalasz
Bronze Partner | 79
+
0
-

A máš tu část šablony, kterou chceš překreslovat zabalenou ve snippetu? Snippet je pak třeba po submitu formu invalidovat a nette se postará o překreslení toho co je ve snippetu.

Více zde: https://doc.nette.org/…ication/ajax

quiced
Člen | 85
+
0
-

V šabloně mám aktuálně nastavený snippet okolo formuláře a potom tam mám script, který právě vytváří ten graf a do toho scriptu zadávám data vypadá to takto:

            <script>
            $(function(){
  var d1 = {$keyword_positions_json};
  console.log(d1);
  $("#flot-1ine").length && $.plot($("#flot-1ine"), [{
          data: d1
      }],
      {
        series: {
            lines: {
                show: true,
                lineWidth: 1,
                fill: true,
                fillColor: {
                    colors: [{
                        opacity: 0.3
                    }, {
                        opacity: 0.3
                    }]
                }
            },
            points: {
                radius: 3,
                show: true
            },
            grow: {
              active: true,
              steps: 50
            },
            shadowSize: 2
        },
        grid: {
            hoverable: true,
            clickable: true,
            tickColor: "#f0f0f0",
            borderWidth: 1,
            color: '#f0f0f0'
        },
        colors: ["#1bb399"],
        xaxis:{
        },
        yaxis: {
          ticks: 5
        },
        tooltip: true,
        tooltipOpts: {
          content: "chart: %x.1 is %y.4",
          defaultTheme: false,
          shifts: {
            x: 0,
            y: 20
          }
        }
      }
  );
            });
            </script>

Podle tebe bych měl napsat ještě snippet okolo toho scriptu? A myslíš, že to posílání přes GET a následné zpracování v renderKeywordDetail, bude fungovat?

Díky za odpověď.

TomasHalasz
Bronze Partner | 79
+
0
-

To co předáváš do JS je v předpokládám v $keyword_positions_json. Ber to tak, že Nette posílá v payloadu vše co je obaleno v snippetu.
Snippetů můžeš mít samozřejmě více, jen je pak potřeba je invalidovat všechny.

V tomhle případě bych zkusil i ten celý javascript dát do stejného snippetu. Nette pak pošle znovu i ten script i s $keyword_positions_json takže by Ti to mělo fungovat tak jak chceš.

Ačkoli čistější a správnější by zřejmě bylo odeslat form ručně ajaxem a pak zpracovat payload s daty, které vrátí server. Ale je to pracnější :-)