proměnná do zpracování formuláře v komponentě
- Fyasko
- Člen | 106
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 :)
- David Matějka
- Moderator | 6445
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
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
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
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
myslim, ze to resi tvuj problem. Kdyz teda iterujes nad prispevkama, tak pro kazdy prispevek mas jeden form, ne?
- Fyasko
- Člen | 106
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
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
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
no kdyz teda to id znas uz v presenteru, tak ho predavej rovnou v createComponent* metode, jak jsem psal vyse
- David Matějka
- Moderator | 6445
nezjistuj ty info o mestu v beforeRender, ale treba ve startup a uloz to do clenske promenne tridy
- Fyasko
- Člen | 106
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
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
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
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)