Ajax bez překreslení + databáze mimo presenter
- ForestCZE
- Člen | 209
Ahoj, zde nastává přesně ten problém, kdy jsem byl na něco zvyklý mimo Nette Framework a teď nevím, jak to předělat do Nette.
Po kliknutí na obrázek potřebuji zpracovat ajax, ve kterém vytáhnu data z databáze.
$("div.foto img").click(function(){
$.ajax({
type: 'POST',
url: '/app/model/mujajax.php',
data: {
promenna: promenna,
atd: atd
},
dataType: 'text',
success: function(data){
console.log(data);
}
});
});
Dejme tomu, že by ten ajax vypadal nějak takto.
- Mohu mít takto samostatně PHP soubor, abych to mohl zpracovat? Hlásí mi to, že RouteFactory pro to nemá cestu.
- Čtení z databáze mám takto:
$this->anything->getPhotos()->fetch();
Kde $this je presenter. To znamená, že v samostatném souboru se k té funkci nedostanu a nemohu získat data.
Jak to vyřešit? Moc děkuji předem za každou užitečnou radu :)
Editoval ForestCZE (21. 5. 2017 16:52)
- igor.pocta
- Člen | 100
Udělej si signál na presenter. Nette aplikace má nějaký životní cyklus, který začíná zpravidla v index.php a který porušuješ svým přímým přístupem na modelovou vrstvu.
url: {link klikni!},
data: {
promenna: promenna,
atd: atd
},
Presenter:
public function handleKlikni(promenna, atd) {
// Udelej neco
}
- ForestCZE
- Člen | 209
igor.pocta napsal(a):
Udělej si signál na presenter. Nette aplikace má nějaký životní cyklus, který začíná zpravidla v index.php a který porušuješ svým přímým přístupem na modelovou vrstvu.
url: {link klikni!}, data: { promenna: promenna, atd: atd },
Presenter:
public function handleKlikni(promenna, atd) { // Udelej neco }
Mám ten script v JS souboru, takže v latte jsem udělal:
data-url="{link Neco!}"
A pak mám funkci:
function Funkce(){
$("div.mujdiv img").click(function(){
var url = $(this).attr("data-url");
var cislo = 3;
$.ajax({
type: 'POST',
url: url,
data: {
cislo: cislo
},
success: function(data){
$("body").append("<div id='obal'>"+data+"</div>");
}
});
});
}
public function handleNeco($cislo)
{
echo $cislo;
}
Problém je, že mi ten ajax překreslí celou stránku. Musím použít
redrawcontrol()
?
- GEpic
- Člen | 566
Použij hlavně nette.ajax.js pokud
chceš pracovat se snippety. Potom si obalíš pomocí
{snippet nazev}{/snippet}
oblast, kterou chceš překreslit a
použiješ poté místo redirect právě to
redrawControl("nazev")
.
Svůj JS kód si pak změníš z $.ajax({});
na
$.nette.ajax({});
Editoval GEpic (21. 5. 2017 22:26)
- ForestCZE
- Člen | 209
GEpic napsal(a):
Použij hlavně nette.ajax.js pokud chceš pracovat se snippety. Potom si obalíš pomocí
{snippet nazev}{/snippet}
oblast, kterou chceš překreslit a použiješ poté místo redirect právě toredrawControl("nazev")
.Svůj JS kód si pak změníš z
$.ajax({});
na$.nette.ajax({});
Děkuji, já vím, jak fungují snippety a jejich překreslení :)
Dokonce jde překreslovat i bez $.nette.ajax({});
Tady jde teď spíš o to, jestli je nutné něco překreslovat v případě mého kódu a proč ta data vyhodí celou stránku.
- jiri.pudil
- Nette Blogger | 1032
Pravděpodobně proto, že v té handle metodě neukončuješ životní
cyklus presenteru (třeba pomocí $this->terminate()
), který
proto pokračuje do render fáze a vypíše kromě $cislo
i celou
stránku.
- filsedla
- Člen | 101
Jak píše @jiri.pudil, terminate()
by to měla
vyřešit.
Nicméně, proč ohýbat něco (handle), co normálně vypisuje celou
stránku (a má vypisovat celou stránku), když chceš vypsat jenom
číslo? Taky, pokud vidím takové použití echo
a
terminate()
, vidím v tom náznak, že by se to dalo
navrhnout líp.
Takže otázkou je, potřebuješ tenhle ajaxový call volat z víc stránek?
Pokud se vyskytuje jenom na jedné stránce, použij snippety plně nette
způsobem („správným“), tj. s redrawControl()
rozhodně bez
echo
a terminate()
.
Pokud je to volání ale obecnější, neměl bys vytvořit API? To bys pak neřešil přes handle. Bylo by to úplně oddělené od vykreslování jakékoliv HTML stránky.
A ještě něco:
Mohu mít takto samostatně PHP soubor, abych to mohl zpracovat?
Ve skutečnosti, můžeš…
- ForestCZE
- Člen | 209
filsedla napsal(a):
Jak píše @jiri.pudil,
terminate()
by to měla vyřešit.Nicméně, proč ohýbat něco (handle), co normálně vypisuje celou stránku (a má vypisovat celou stránku), když chceš vypsat jenom číslo? Taky, pokud vidím takové použití
echo
aterminate()
, vidím v tom náznak, že by se to dalo navrhnout líp.Takže otázkou je, potřebuješ tenhle ajaxový call volat z víc stránek? Pokud se vyskytuje jenom na jedné stránce, použij snippety plně nette způsobem („správným“), tj. s
redrawControl()
rozhodně bezecho
aterminate()
.Pokud je to volání ale obecnější, neměl bys vytvořit API? To bys pak neřešil přes handle. Bylo by to úplně oddělené od vykreslování jakékoliv HTML stránky.
A ještě něco:
Mohu mít takto samostatně PHP soubor, abych to mohl zpracovat?
Ve skutečnosti, můžeš…
Odehrává se to na jednom presenteru s několika podstránkami + stránkování.
Jde o to, že jsem na stránce, kde mám miniaturu nějaké fotky. Její oddělení, název a popis načtu z DB a pak to vrátím jako img.
Když na tu miniaturu kliknu, tak se mi vytvoří dva divy (modal box) a v něm potřebuji načíst ty samé údaje z DB s tím rozdílem, že cestu do složky dám bez /miniatura, proto jsem zvolil ajax, aby se to načítalo na pozadí. Má tedy někdo něco k tomu, jak by to šlo lépe? Moc děkuji.
- Zuben45
- Člen | 268
ForestCZE napsal(a):
filsedla napsal(a):
Jak píše @jiri.pudil,
terminate()
by to měla vyřešit.Nicméně, proč ohýbat něco (handle), co normálně vypisuje celou stránku (a má vypisovat celou stránku), když chceš vypsat jenom číslo? Taky, pokud vidím takové použití
echo
aterminate()
, vidím v tom náznak, že by se to dalo navrhnout líp.Takže otázkou je, potřebuješ tenhle ajaxový call volat z víc stránek? Pokud se vyskytuje jenom na jedné stránce, použij snippety plně nette způsobem („správným“), tj. s
redrawControl()
rozhodně bezecho
aterminate()
.Pokud je to volání ale obecnější, neměl bys vytvořit API? To bys pak neřešil přes handle. Bylo by to úplně oddělené od vykreslování jakékoliv HTML stránky.
A ještě něco:
Mohu mít takto samostatně PHP soubor, abych to mohl zpracovat?
Ve skutečnosti, můžeš…
Odehrává se to na jednom presenteru s několika podstránkami + stránkování.
Jde o to, že jsem na stránce, kde mám miniaturu nějaké fotky. Její oddělení, název a popis načtu z DB a pak to vrátím jako img.
Když na tu miniaturu kliknu, tak se mi vytvoří dva divy (modal box) a v něm potřebuji načíst ty samé údaje z DB s tím rozdílem, že cestu do složky dám bez /miniatura, proto jsem zvolil ajax, aby se to načítalo na pozadí. Má tedy někdo něco k tomu, jak by to šlo lépe? Moc děkuji.
co takhle třeba tu cestu na velký obrázek dát do atributu třeba data-img a s tím dál pracovat ? :)