Ajax bez překreslení + databáze mimo presenter

ForestCZE
Člen | 209
+
0
-

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.

  1. Mohu mít takto samostatně PHP soubor, abych to mohl zpracovat? Hlásí mi to, že RouteFactory pro to nemá cestu.
  2. Č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)

petr.jirous
Člen | 128
+
0
-

URL není cesta k souboru

ForestCZE
Člen | 209
+
0
-

petr.jirous napsal(a):

URL není cesta k souboru

A co to tedy je?

duke
Člen | 650
+
-1
-

A dokumentaci routování, výchozích latte maker (zejména tě zajíma makro link) a ajaxu jsi četl?

igor.pocta
Člen | 100
+
+2
-

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
+
0
-

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

?

galab
Backer | 74
+
0
-

Nechybí ti tam třeba preventDefault() u toho click?

ForestCZE
Člen | 209
+
0
-

galab napsal(a):

Nechybí ti tam třeba preventDefault() u toho click?

preventDefault() tu není potřeba :)

GEpic
Člen | 562
+
0
-

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
+
0
-

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ě to redrawControl("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 | 1028
+
+3
-

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
+
0
-

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 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š…

GEpic
Člen | 562
+
0
-

A nebo si ta data pošli přes payload pokud nechceš řešit snippety, a dostaneš je poté přímo v success. Ale jak píše @filsedla používat echo je špatně vzhledem k návrhu celého Nette FW.

Editoval GEpic (22. 5. 2017 15:04)

David Matějka
Moderator | 6445
+
+2
-

nebo muzes poslat json pres $this->sendJson(['number' => $cislo])

GEpic
Člen | 562
+
+1
-

David Matějka napsal(a):

nebo muzes poslat json pres $this->sendJson(['number' => $cislo])

O této zkratce jsem ani nevěděl, díky! :)

ForestCZE
Člen | 209
+
0
-

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 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š…

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
+
0
-

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 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š…

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 ? :)