createComponent s parametrem

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

Vytvářím formulář s hidden inputem, ale nedaří se mi dostat data do továrničky formuláře

šablona:

<?php
{block content}
id(template): {$zdroj_id}<br/>
{widget zdrojForm, $zdroj_id}
?>

presenter:

<?php
    public function createComponentZdrojForm($id){
        echo "id(presenter):" . $id . "<br>";
        $zdroj = $this->model->getZdroj($id);
        var_dump($zdoj);
        echo "/zdroj<br>";
        $form = new NForm();
        $form->addText('nazev', 'Název')
                ->addRule(NForm::FILLED, 'Musíte vyplnit název')
                ->setDefaultValue($zdroj->name);
        $form->addText('url', 'Url zdroje')
                ->addRule(NForm::URL, 'Musíte zadat url zdroje')
                ->addRule(NForm::FILLED, 'Musíte zadat url zdroje')
                ->setDefaultValue($zdroj->link);
        $form->addSubmit('save', 'Uložit');
        $form->addSubmit('back', 'Zpět')
                ->setValidationScope(NULL);
        $form->addHidden('id')
                ->setValue($id);

        $form->onSubmit[] = callback($this, 'processZdrojForm');

        return $form;
    }
?>

výpis:
id(template): 1
id(presenter):zdrojForm

Plus další notices

Tušim, že jsem něco špatně pochopil, jen nemůžu přijít na to co.

PHP 5.3.5
Nette 0.9.6

Nox
Člen | 378
+
0
-

{widget name $param1} nebo {control name $param1} neznamená vytvoření controlu, ale na dané místo se vloží přímo příkaz vykreslení – tzn. parametry z šablony se dostávají jen do funkce render()

skupina funkcí createComponent* bere jako parametr jméno, což bude u tebe „zdrojForm“

pokud chceš vložit nějaký spešl parametr, obstarej si ho nějak v té továrně… ulož si to třeba jako $this->zdrojId (kde $this je ten presenter) a tam si ho zase vem přes $this->zdrojId

Bertram
Člen | 75
+
0
-

Ahoj, jak tuto samou situaci řešit pokud tento spešl parametr získám až v šabloně, například v nějakém cyklu, kde v každém průchodu vytvářím tutéž komponentu, které potřebuji pokaždé předat jiný parametr?

Možné řešení budou asi tato, ale nevím, jestli je to správné řešení.

// přímo do továrničky
{?$component['myForm']['id']->value = $pruchod->id}

// nastavení vlastnosti presenteru
{?$presenter->value = $pruchod->id}

A je to vůbec správné, že potřebuji něco z šablony vracet do presenteru nebo komponenty?

norbe
Backer | 405
+
0
-

Nejsnadnější řešení je to, že parametr přidáš do názvu komponenty. Příklad:

{widget zdrojForm-$zdroj_id}

A pak v presenteru budes mit neco jako:

protected function createComponent($name) {
	if(Strings::startsWith("zdrojForm")) {
		// vytvoreni komponenty, parametr jde vycůcnout z názvu komponenty
	}
	else {
		return parent::createComponent($name);
	}
}
Nox
Člen | 378
+
0
-

Škoda že podpora toho co píše norbe (anebo v nějaké jiné formě) není nativně – jaké jsou argumenty proti?

Gormit
Člen | 5
+
0
-

Postup od nox se mi povedl, ještě jsem do createComponentZdrojForm() přidal na konec echo $form;
Ale stejně se mi zdá, že to není ono, možná jsem měl napsat o co se vlastně snažim:

Potřebuji formulář s předvyplněnými daty, která se berou z databáze. Formulář příslušný řádek v db updatuje a měl by být na samostatné stránce.

Nox
Člen | 378
+
0
-

Jestli to chápu dobře, tak je to podobné jako tady u tohoto nedávného dotazu
https://forum.nette.org/…ho-odeslanim

tak v podstatě místo toho ID se (taky) předají ty data