proměnná do zpracování formuláře v komponentě

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

Ahoj všem, mohl by mi někdo poradit jak předat data z presenteru do komponenty?

Mám tohle:

<?php
// sablona
{control PostForm $cityInfo->id}

// presenter
protected function createComponentComment()
	{
	    $control = $this->comments->create();
	    return $control;
	}

// Komponenta
public function createComponentAddPost()
    {
	$form = new \Nette\Application\UI\Form;
	$form->addText('post')
	        ->setAttribute('placeholder', 'Přidejte příspěvek...')
		->setAttribute('class', 'post');
	$form->addSubmit('addpost', 'OK')
		->setAttribute('class', 'addpost');
	$form->addProtection('Vypršel časový limit, odešlete formulář znovu');
	$form->onSuccess[] = $this->addingPost;

	return $form;
    }

    public function addingPost($form)
    {
	$user = $this->user->id;
	$values = $form->getValues();
	$date = date('Y-m-d H:i:s');
	$this->database->query("INSERT INTO posts VALUES('','".$user."','','".$values->post."','".$date."','','','','')");
	$this->redirect('this');
    }
?>

No proměnnou $cityInfo->id bych rád dostal do zpracování formuláře. Dával jsem jí do render() jako hidden pole ale to se dá jednoduše editovat. Byl by někdo tak hodný a navedl mě jak správně a hlavně funkčně použít setter aby mi ta proměnná přistáli ve fci addingPost() např jako $cID ?

Za všechny rady děkuju :)

Azathoth
Člen | 495
+
-4
-

Hm, co takhle session?

David Matějka
Moderator | 6445
+
+2
-

to $cityInfo uz znas v presenteru? resp. je na strance pouze jeden form, nebo vice?

a precti si doc jak pracovat s databazi, takhle tam mas sql injection…

Fyasko
Člen | 106
+
0
-

Je to napsaný jen jako příklad takže sql řeším jinak..

A na stránce jsou dva formuláře a každý má svou komponentu.. S tím že mi v tuto chvíli v káždé z těch komponent chybí jedna proměnná resp.

PostForm přidává posty pro město → potřebuje cityInfo->id
CommentForm přidává komenty pro post → potřebuje postInfo->id

Vyčetl jsem že to jde jako setter nastavit, ale nějak se nemůžu dostat ke správnému řešení.

David Matějka
Moderator | 6445
+
0
-

no a postInfo, resp. cityInfo znas uz v presenteru, ne?
takze muzes pouzit neco jako

public function actionFoo()
{
	$this->postInfo = ...;
	...
}

public function renderDefault()
{
	$this->template->postInfo = $this->postInfo;
}

protected function createComponentPostForm()
{
	$control = ...;
	$control->setPostInfo($this->postInfo);

	...
}
Fyasko
Člen | 106
+
0
-

Abych řekl pravdu nejsem si jist jestli ho znám v presenteru když v prměnný cityInfo je sql dotaz který vrací např. 20 postů… Myslím si že v presenteru mám jen data pro každý znich.. a v šabloně mám

<?php
{foreach posts}
	{cityInfo->id}
{/foreach}
?>

začínám se v tom nějak motat :D

David Matějka
Moderator | 6445
+
0
-

v tom pripade zkus pouzit multiplier

Fyasko
Člen | 106
+
0
-

Nemyslím si že tohle řeší můj problém..Možná jsem špatně položil otázku..

Jde proměnná v šabloně dostat do jiné metody komponenty než render()?

David Matějka
Moderator | 6445
+
0
-

myslim, ze to resi tvuj problem. Kdyz teda iterujes nad prispevkama, tak pro kazdy prispevek mas jeden form, ne?

Fyasko
Člen | 106
+
0
-

pro příspěvky mám jen jeden form.. ten je pro celé město… a pro každý příspěvek mám další form na přidání komentáře…Tomu formu pro příspěvky ale musím říct to id města…a pro koment musím zase říct id příspěvku.. Jak říkám proměnou kterou potřebuji, dostanu do komponenty, ale jen do metody render()…rád bych jí v komponentě např. globálně aby byla použitelná v jakékoliv funkci stejné komponenty.

David Matějka
Moderator | 6445
+
0
-

nevim, jestli chapu. Na jedne strance vykreslis tedy jeden formular pro prispevek, ktery vyzaduje ID mesta (kde ziskas to id mesta? to uz znas v presenteru?)
a X formularu pro komentare pro kazdy post (tedy projdes posts ve foreach a zobrazis X formularu) jo?

Fyasko
Člen | 106
+
0
-

v BasePresenteru v metodě beforeRender() zjistím vše o tom městu..tak zjistím i to id, které potřebuju dostat do zpracování formuláře v komponentě.. potě vypíšu ten příspěvek, pod něj všechny jeho komentáře a nakonec komponentu která mi vytvoří formulář pro přidávání komentářů která opět potřebuje id toho postu…jak ty id dostat do komponenty vím…Např kdyby mi stačilo hidden pole s tím ide tak to jednoduše z render() předám do šablony komponenty…ale hidden pole se dají jednoduše editovat, takže špatný…chci k tomu id přistoupit až ve chvíli kdy zpracovávám formulář v komponentě která to id přijme…

David Matějka
Moderator | 6445
+
0
-

no kdyz teda to id znas uz v presenteru, tak ho predavej rovnou v createComponent* metode, jak jsem psal vyse

Fyasko
Člen | 106
+
0
-

Jasně, ale můžu se zeptat jak actionfoo() zjistí to $id? Jestli to správně chápu tak musím ten dotaz položit na db znovu?

David Matějka
Moderator | 6445
+
0
-

nezjistuj ty info o mestu v beforeRender, ale treba ve startup a uloz to do clenske promenne tridy

Fyasko
Člen | 106
+
0
-

Nakonec jsem to vyřešil takto

<?php
// Presenter
createComponentPostForm()
{
	$control = $this->postform->create();
	$control->setId($this->getParameter('id'));
...
}

// Komponenta
private $id;
setId($id)
{
	$this->id = $id;
}
// A ve zpracování formuláře
$city = $this->id;
?>

Pro post jsem id města dostal…teď budu řešit ty komentáře a k ním id postu :D

Fyasko
Člen | 106
+
0
-

A samozřejmě tomu tak není… Pro přidání komentáře už id musím získat jinak :D no a babo raď :D

David Matějka
Moderator | 6445
+
0
-

a kde a jak vybiras ten post?

Fyasko
Člen | 106
+
0
-

V presenteru metodou renderDefault. Pro posty to nakonec byla pohoda protože mám adresu ve tvaru:

example.cz/mesto/kategorie

Ale postů je tam dejme tomu dvacet. Tak potřebuju 20× tu samou komponentu ale s jiným parametrem. Tzn. že se vracím k problému, jak dostat z {control addComment $post->id} hodnotu ID do komponenty :D

Editoval Fyasko (21. 9. 2014 21:21)

David Matějka
Moderator | 6445
+
0
-

a ja se vracim k memu predchozimu doporuceni – multiplier :)

Fyasko
Člen | 106
+
0
-

doufám že se v tom neztratím ještě víc :D každopádně to vyzkouším a dám vědět jak jsem dopadl :)

Fyasko
Člen | 106
+
0
-

No… koukám že on tam hodnotu přidává jako hidden pole.. tak nevím jestli to jde i jinak ale to hiddne pole je přesně to co já nechci :D to můžu i přes render metodu :D

David Matějka
Moderator | 6445
+
0
-

do samotneho formu, ktery neni obalen komponentou se totiz parametry blbe davaji. Kdyz to mas obaleny komponentou, muzes si to id (nebo treba objekt) tam dat treba pres setter. Ale stejne doporucuju kontrolovat, jestli to id je validni – necha se to „hacknout“ zmenou signalu

Šaman
Člen | 2666
+
0
-

Takhle a nastaví se to v presenteru. Dneska už to jde i pomocí autowiringu, tohle je ještě klasická ručně vytvářená tovární třída (tu si zaregistruješ jako službu a ona už ti bude vytvářet ty jednotlivé komponenty/formuláře).

Editoval Šaman (21. 9. 2014 23:39)