Parametr v komponentě – ve formuláři

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

Ahoj,
snažil jsem se předat parametr komponentě – formuláři a nedařilo se mi to. Nakonec jsem postupným zjednodušováním zkusil udělal následující variantu. Ať dělám ale cokoliv, tak mi dump vrací "editProductForm" (15).

protected function createComponentEditProductForm($krocan='333') {
      dump($krocan);

..........

Moc tomu nerozumím, neměl by ten kód vrátit 333? Jak je možné že vrací něco jiného?

David Matějka
Moderator | 6445
+
+2
-

odkud se tam snazis predat parametr? jako z requestu? na to sahnes treba pres $this->getParameter('krocan').. do createComponent se jako prvni parametr (skoro) vzdy posila nazev komponenty.

kloban
Člen | 123
+
+2
-

No zkusím to popsat komplet celý, protože je to předání asi trošku složitější.

Začne to tak, že se plikem dostanu do presenteru a předám parametr takto {plink EditProduct:Default, 'productId' => $product->id} následně přístoupím k metodě render

EditProductPresenter.php:

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

a ta vyrenderuje šablonu, kterou volám komponentu editProduct a potřebuju jí před parametr productId

default.latte k presenteru EditProductPresenter.php:

{control editProduct $productId}

Tuto komponentu vyrendruji

EditProductControl.php:

public function render($productId){
    $template = $this->template;
    $template->setFile(__DIR__ . '/templates/default.latte');
    $template->productId = $productId;

a v šabloně vykresluji formulář, u kterého tu proměnnou právě potřebuji

default.latte ke komponentě EditProductControl.php:

{control editProductForm $productId}

No a čekal jsem, že u formuláře najdu proměnnou jednoduše takto:

EditProductControl.php:

protected function createComponentEditProductForm($productId) {
        dump($this->getParameter('productId'));

        $form = new UI\Form;
        $form->addText('title', 'Název')

...

Ale to nezafunguje a vypíše se jak říkáš, název komponenty.

Jde o to, že po kliknutí na odkaz chci upravovat daný záznam v DB, takže v odkazu předám jeho ID a ve formuláři ho potřebuju pro vložení výchozích hodnot z DB. Jenže parametr musím předávat takto přes několik míst.

David Matějka
Moderator | 6445
+
+1
-

nesnaz se parametr takhle predavat ze sablony, nebude to fungovat (pri zpracovani bys nevedel ID). Ten parametr predavej pri vytvareni komponenty v presenteru – kde si ho prave vytahnes treba pres getParameter a pak ho nasetujes komponente.

kloban
Člen | 123
+
+1
-

Díky. $this->getParameter('productId'); mi v presenteru funguje. Jen nevím jak ho předat komponentě.

Komponentu vytvářím takto:

protected function createComponentEditProduct()
{
    $control = $this->editProductControlFactory->create();
    return $control;
}
duke
Člen | 650
+
+1
-

Např. takto:

protected function createComponentEditProduct()
{
	$control = $this->editProductControlFactory->create();
	$control->setProductId($this->getParameter('productId'));
	return $control;
}
Šaman
Člen | 2666
+
0
-

Nebo takhle. Pak nemusíš ani tahat parametr pomocí gerParameter, ale rovnou si ho předat do té action metody. A továrna může být stejná pro vytvářecí i editační formulář.

duke
Člen | 650
+
0
-

Šamanův způsob má ovšem tu nevýhodu, že se ti ta komponenta bude instanciovat i v případech, kdy ji vůbec nebudeš potřebovat (může nastat pokud některé komponenty používáš podmíněně či pokud např. kešuješ v šabloně). Pokud dáš vše do továrničky, je to prostě víc lazy.