Zpracovat formular pro jeden zaznam v DB
- error414-c
- Člen | 45
Cau,
marne hledam na internetu nejaky pouzitelny navod jak pomoci nette editovat zaznam ktery ma ID.
Modelovy priklad:
Mam Prezenter kosik kteri resi pridavani polozek do kosiku :). V detailu produktu mam odkaz na pridani do kosiku, treba /pridat-do-kosiku/6. 6 je ID produktu ktery chceme pridat do kosiku. Zobrazi se stranka KosikPresenter::renderPridatDoKosiku,
public function renderAddToBasket()
{
$moduleId = $this->getParameter('id');
$module = $this->modulesModel->findBy(array('id' => $moduleId))->fetch();
$this->template->module = $module;
}
tato stranka obsahuje formular ktery blize specifikuje produkt, napriklad barvu, hmotnost atd..
{control $module->order_componet_class}
public function createComponent($name)
{
$componentClass = '\\Component\\Order\\' . $name;
return new $componentClass($this, $name, $this->template->module);
}
a ted me nejde do hlavy jak si predavat ID produktu, z prezenteru do componenty a jak to id potom dostat do akce ktera se vola na pri odeslani formulare.
Editoval error414-c (19. 3. 2013 19:23)
- Šaman
- Člen | 2666
Do komponenty to předáš pomocí parametrů komponenty
{control formular 6}
a přijmeš ho v metodě
render($id)
.
Ve formuláři budeš mít hidden pole id
, do kterého předáš
$id a při zpracování ho tak stále máš.
Hledám parametry komponenty a ono se o nich nikde moc nepíše.. ale používají se v quickstartu, je tam příklad použití.
Editoval Šaman (19. 3. 2013 19:44)
- error414-c
- Člen | 45
Dekuji za odpoved, buhuzel me to tak nejak nefunguje. Do komponenty jsem uz dokazal vlozit ID, ale kdyz odeslu formular tak to odesila na adresu
pridat-do-kosiku?do=moje_komponenta-formular_v_komponente-submit
jenze pri tom odesilani formulare se i vola metoda renderAddToBasket ktera v sobe ma kontrolu jestli ma ID zaznam v databazi a jelikoz ji zadne ID nepredam tak ukonci beh :(.
Zkousel jsem pridat do komponenty
/** @persistent */
public $id;
ale to me nefunguje, funguje to jen kdyz to dam do prezenteru kosiku a pak se ale ID predava i do adres kde nema co delat, napriklad na vypis kosiku.
- Šaman
- Člen | 2666
renderAddToBasket? Nevím co všechno má dělat, ale čekal bych, že addToBasket() nebude render metoda, ale signál.
Možná zkus ten formulář postnout, pokud možno jen to důležité. Podle mě tam bude víc problémů v tom volání.
Jinak persistentní proměnnou tady fakt nechceš, ty potřebuješ předat id formulářem do nějaké onSubmit metody, jestli jsem to dobře pochopil.
Editoval Šaman (19. 3. 2013 20:40)
- error414-c
- Člen | 45
jj mam to blbe pojmenovano :(. Polozce v kosiku rikam modul (pracovne, jinak se to muze nazvat treba produkt)
/**
* stranka pro pridani polozky do kosiku
*/
public function renderAddToBasket()
{
/** @var $addBasketForm Form */
$moduleId = $this->getParameter('id');
$module = $this->modulesModel->findBy(array('id' => $moduleId))->fetch();
if(!$module){
$this->flashMessage('Modul nebyl nalezen');
$this->forward('orderList');
$this->terminate();
}
$this->template->module = $module;
}
v sablone, nazev komponenty pro kazdy modul (polozku) je ulozena v databazi, treba | 1 | kocarek | AddBasketComponentKocarek
<h3>Modul {$module->name}</h3>
{control $module->order_componet_class, $module->id}
tovarna na komponenty
/**
* komponeta pridani polozky do kosiku
*
* @param $name
* @return Form
*/
public function createComponent($name)
{
$componentClass = '\\Component\\Order\\' . $name;
return new $componentClass($this, $name);
}
v komponetne, napriklad toho kocarku
/**
* vypsani sablony
*/
public function render($moduleID)
{
$form = $this->getComponent('addBasketForm');
$form['module']->setValue($moduleID);
$this->getTemplate()->render();
}
v sablone komponenty
{control addBasketForm}
v komponente vytvoreni formulare
public function createComponentAddBasketForm($name)
{
$form = new \Nette\Application\UI\Form($this, $name);
$form->addSelect('quantity', 'doba:', array(12 => 'rok'));
$form->addSubmit('sub', 'vlozit do kosiku');
$form->addHidden('module', NULL);
$form->onSuccess[] = $this->addModuleBasketSucceeded;
return $form;
}
a zpracovani formulare
public function addModuleBasketSucceeded($form)
{
var_dump($form);
}
kazdy modul, muze mit uplne jiny formular.