Sesbírání dat ze stránky poslání ajaxem a zpracování

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

Ahoj,
dělám svoji první aplikaci a mám problém s ajaxem a přebíráním dat v prezenteru.
Přidal jsem si do aplikace nette.ajax.js od Vojtěcha Dobeše, ale nepodařilo se mi pochopit jak ho přesně použít.
V šabloně mám několik elementů, kterým jsem přidal class=„ajax“ a potřebuju v prezenteru pracovat s jejich id. To znamená, že mě obsah elementu nezajímá, zajímá mě pouze id.
Jak tyto údaje odešlu? A jak řeknu ajaxu, kterému prezenteru má data poslat?

Pokud máte někdo čas, prosil bych o příklad.
Dejme tomu, že mám v prezenteru „HomepagePrezenter.php“ metodu „public function actionUlozObjednavku()“.

Šablona mi vygeneruje:

<div id="4">Smažený sýr</div>
<div id="3">Kuře na paprice</div>
<div id="5">Opékané brambory</div>

A právě ty „id“ potřebuji předat metodě.

Díky za reakce. A omlouvám se za tak dlouhý dotaz.

Editoval kloban (28. 2. 2014 9:48)

vjirovsky
Člen | 12
+
0
-

Ahoj,
rád bych ti pomohl ale moc jsem tvůj problém nepochopil. Můžeš poslat víc informací?
Hodil by se kód jak vytváříš komponentu (formulář) a jak na ní reaguješ po odeslání a šablona.

kloban
Člen | 123
+
0
-

V HomepagePrezenter pouze načítám data z databáze.

public function renderDefault()
{
$this->template->posts = $this->database->table('jidelni_listek')
    ->order('id DESC')
    ->limit(5);
}

Ty pak v šabloně načítám:

{block content}

<h1 n:block="title">Jídelní lístek</h1>

<div class="post">
{foreach $posts as $post}
    <div id="{$post->id}">{$post->nazev}</div>
{/foreach}
</div>

<div class="post2">

</div>


<a id="tlacitko">tlačítko</a>

Dále pomocí jquery po kliknutí na nějaký „div“ ho naklonuju do „post2“.

$("div.post > div").click(function(){
	$(this).clone().appendTo("div.post2").attr("class", "ajax");
});

Id divů, které jsou zkopírovány do post2 bych potřeboval předat prezenteru.

Žádný formulář tedy nevytvářím. Prezenter mi jen dodá data, která vypisuju do divu „post“ a ty pak přes jquery kopíruju (vybíram). Ty co jsem vybral bych potřeboval poslat poslat zpět prezenteru.

Snad už je to jasnější kdyžtak se ptej. :-)
Ještě abys věděl k čemu to má být. Číšníkovy se zobrazí jídelní lístek z něhož objednává. Po odeslání objednávky ji prezenter uloží do databáze. Toť zjednodušeně vše.

Celá aplikace je zde: http://dp.schoula.cz/sandbox/www/

Oli
Člen | 1215
+
0
-

Práce s id není 100%. Pokud někdo (nevím kdo a proč) bude mít vypnutej js, tak ti to nepojede. s tím ajaxem se standardně pracuje zhruba takhle:

{snippet objednavka}
<a n:href="ulozObjednavku! 4" id="4" class="ajax">Smažený sýr</a>
<a n:href="ulozObjednavku! 3" id="3" class="ajax">Kuře na paprice</a>
<a n:href="ulozObjednavku! 5" id="5" class="ajax">Opékané brambory</a>
{/snippet}
public function handleUlozObjednavku($id)
{
	//uloz objednavku
	if ($this->isAjax()) // pokud to nemáš v presenteru, ale v komponentě tak místo $this použij $this->presenter
	{
		$this->flashMessage('Objednávka byla uložena');
		$this->invalidateControl('objednavka');
	} else
	{
		$this->redirect('this');
	}
}

Tohle ti bude fungovat vždy.

EDIT:
Pokud si to chceš naklikat a poslat, tak nejjedonušší je něco jako

$.ajax({ // myslím, že by to mohlo s nette.ajax.js fungovat kdyz misto $.ajax das neco jako $.nette.ajax, ale nejsem si tím jistej
	url: {link ulozObjednavku!}
	data: { name: tvojeIDcka }
});

Editoval Oli (28. 2. 2014 11:54)