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ší :-)