Zpracování formuláře odeslaného přes AJAX
- quiced
- Člen | 85
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
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
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
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ší :-)