Komponenta a parametry v createComponentForm

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

Ahoj,

mam komponentu

public function createComponentPageForms()
    {
        $control = new \FrontModule\PageFormsControl();
        return $control;
    }

Kterou volam v sablone s parametrem

{control pageForms [parametry]}

Komponenta ma vratit formular s vytvorenymi inputy podle parametru.

Parametry odchytnu v metode render($parametry), ale po odeslani formulare je potrebuje i metoda createComponentPageForm(), jenze ta je nema, kdyz se nespousti render().

public function render($params)
    {
        $this->formParams = json_decode($params);
        $this->template->setFile(__DIR__ . "/PageFormsControl.latte");
        $this->template->pageForm = $this['pageForm'];
        $this->template->render();
    }

    /**
     * @return Nette\Application\UI\Form
     */
    public function createComponentPageForm()
    {
		//$this->formParams pro render funguje, po odeslani uz ne
        $form = new Form;
		return $form;
}

Ma to nejake reseni? Diky.

David Matějka
Moderator | 6445
+
0
-

spravnym resenim je nepouzivat parametry predavane ze sablony – zapomen, ze takova moznost existuje :)

o jake parametry se jedna?

libik
Člen | 96
+
0
-

V podstate resim v redakcnim systemu moznost zapsani specifickeho textoveho tvaru do textu stranky (mam takto vic tzv. rozsireni, ktera mi volaji komponenty, napr. pro vypis specifickych dat z db, apod). V tomto pripade jednoduchy formular, kdy uzivatel si zapise jednotlive inputy. Ja si to vyparsuju – znam tedy presne nazev komponenty a parametry, ze kterych formular sestavim. Tahle jedina obsahuje formular a mam tuhle potiz.

Resim to na urovni latte, neco jako :

{block pageContent}
{if $textSnippet['type'] == 'extension'} //$textSnippet je vyparsovany zapis rozsireni
        {control $textSnippet['control'] $textSnippet['parameters']}
{/block}

Ten zapis v textu nahradim obsahem, ktery mi vyrenderuje prislusna komponenta.
Asi by bylo lepsi to udelat pres nejaky setter, ale v teto fazi bych se tomu uz radsi vyhnul.

Editoval libik (10. 4. 2017 14:29)

David Matějka
Moderator | 6445
+
0
-

nejlepsi je vsechny tyhle parametry nastavovat v presenteru v createComponent metode, kde je komponente predas treba pres konstruktor nebo pres setter.

CZechBoY
Člen | 3608
+
+1
-

Prostě si ty parametry předej přes konstruktor/setter jak radí @DavidMatějka.
presenter

protected function createComponentAbc()
{
	$control = new AbcControl(); // nebo rovnou do konstruktoru
	$control->setParameters($this->getParametersForComponentAbc());
	return $control;
}

komponenta

class AbcControl extends UI\Control
{
	private $parameters = [];

	public function setParameters(array $parameters)
	{
		// ... ulož
		$this->parameters = $parameters;
	}
}

Editoval CZechBoY (10. 4. 2017 14:52)

libik
Člen | 96
+
0
-

V basePresenteru mam registrovanou komponentu, rekneme tu AbcControl, v pagePresenteru pak pri analyze textu zjistim, ze ji potrebuju vykreslit. Nevim jak to napasovat na uvedenou $this->getParametersForComponentAbc().

David Matějka
Moderator | 6445
+
+1
-

muzes treba v action metode neco jako

$this['abcControl']->setSomeParameter($foo)
libik
Člen | 96
+
0
-

Jo, to je vlastne pravda. Ale i presto mam po odeslani vygenerovaneho formulare v createComponentPageForm() $this->parameters = NULL, takze to funguje stejne jako predtim.

David Matějka
Moderator | 6445
+
0
-

ukaz, jak vypada cely ten kod v action, ktery nastavuje ty parametry

libik
Člen | 96
+
0
-

Dneska uz to nedam, snad zitra. Prozatim diky za cas.