Předání parametru do formuláře

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

Zdravím, můj formulár má následnou strukturu

TestPresenter.php

actionMyForm($id) {
  if($id) { ... } else { ... }
  $skupina_id (potřebuji předat do komponenty)
}

protected function createComponentForm() {
  $form = new Form();
  foreach($podskupiny->find(**$skupina_id**)) {
    ...
  }
  return $form;
}

function renderMyForm() {

}

process.latte
{control form}

Jakým způsobem se předává proměnná z fce actionMyForm do komponenty createComponentForm, kde ji taky muzou rovnou vyuzit (pro vypis podskupin)?

m4rty
Člen | 40
+
0
-

Ja nechci predat parametr, ale promennou (spatny nazev, sry)

22
Člen | 1478
+
0
-

Tak to je stejné, jako v jakékoliv jiné třídě… ale jelikož nevím, kde se bere nebo jak vzniká proměnná $skupina_id, tak bych ji asi při vzniku přiřadil do $this->skupina_id, a máš ji dostupnou pak napříč třídou.

Jamicon
Člen | 19
+
0
-

Vo svojom kóde posielam dáta do formulára napríklad takto, samozrejme tomu ešte predchádza definícia triedy a protected $riadok;.

<?php
  public function __construct(\Models\TextModel $model, \DibiRow $riadok = null) {
    parent::__construct(null);
    $this->model = $model;
    $this->riadok = $riadok;
  }

  protected function createComponentEditorForm()	{
    $form = new Form;
    $form->addHidden('id');
    $form->addText('url', 'Skopíruj URL zdroja:');
    $form->addHidden('strana', 'Číslo stránky:');
    $form->addText('zdroj', 'Uveď zdroj:');
    $form->addText('nadpis', 'Nadpis článku:', 35)
         ->getControlPrototype()->style('font-size: 1.3em');
    $form->addTextArea('ukazka', 'Ukážka:', 40, 10);
    $form->addTextArea('clanok', 'Článok:', 100, 15);
    $form->addSubmit('zapis', 'Zapíš');
    if (!is_null($this->riadok)) $form->setValues ($this->riadok);
    $form->onSuccess[] = callback($this, 'updateEditorForm');
    return $form;
  }

?>
m4rty
Člen | 40
+
0
-

Do promenne $skupina_id se id priradi pres parametr.

Vytvoril jsem si teda promenou protected $skupina_id;

Pokud v action do ni neco priradim ($this->skupina_id = 1),tak jeji obsah nevidim pote v createComponent.

22
Člen | 1478
+
0
-

pošli celý kod, toto je věštění z koule…

m4rty
Člen | 40
+
0
-

Asi to ani nejde… nize je muj kod

class ListsPresenter extends FormPresenter {
	protected $skupina_id;

	actionMujForm($id) {
		if($id) {
			$this->skupina_id = $this->getParam('skupina');
		}
		else {
		        $this->skupina_id = $this->getModel('skupiny')->where('uzivatel.skupina', $id)..;
		}
	}
	createComponentMujForm() {
		dump($this->skupina_id)
	}

}
22
Člen | 1478
+
0
-

takhle to nemůže fungovat asi nikdy..

  • createComponent je protected → protected function createComponentMyForm
  • bývá dobrým zvykem označovat viditelnost metod (public, protected, private)
  • mixovat české a anglické náyzvy bych se taky odnaučil
  • dump v komponentě se ti provede až po připojení komponenty do stromu komponent, což nikde nevidím. Pokud chceš tedy něco dumpovat, zkus to v action metodě.
  • Je ti jasné, že action je view presenteru v podstatě? Viz. životní cyklus presenteru…

Editoval 22 (2. 11. 2011 16:09)

m4rty
Člen | 40
+
0
-

Kod jsem prepsal z pameti. Metody oznacuju a anglicke nazvy pro promenne taky pouzivam. Diky za upresneni

22
Člen | 1478
+
0
-

čili asi nějak takto:

class ListsPresenter extends FormPresenter {

	protected $group_id;

        public function actionMyForm($id)
	{
                if ($id) {
                        $this->group_id = $this->getParam('group');

		} else {
                        $this->group_id = $this->getModel('group')->where('user.group', $id)..;
                }
        }

	protected function createComponentMyForm()
	{
                $form = new Form();
		...
		dump($this->group_id);
		return $form;
        }

}
// MyForm.latte
{control myForm}

a měl by se ti u formu objevit i dump $group_id

Editoval 22 (2. 11. 2011 16:25)

m4rty
Člen | 40
+
0
-

Takhle to bohuzel nefunguje. Zkus to. Opravdu ne. :/

22
Člen | 1478
+
0
-

funguje to naprosto bez problému, pokud chceš copy/paste:

	protected $group_id;

	public function actionMyForm($id)
	{
		$this->setView('default');

		if ($id) {
			$this->group_id = 'fromUrl';

		} else {
			$this->group_id = 'fromModel';
		}
	}

	protected function createComponentMyForm()
	{
		$form = new Nette\Application\UI\Form();

		dump('Test:',$this->group_id);
		return $form;
	}

výsledek dumpu je fromURL a budes to mít na adrese .../<your-presenter>/my-form/5, pokud smažu $id z URL, tak výsledek je fromModel

stačí zkopírovat do jakéhokoliv presenteru a do šablony default.latte dát {control myForm}

Editoval 22 (4. 11. 2011 15:20)

m4rty
Člen | 40
+
0
-

Ahoj, diky za odpovedi. Uz jsem na to prisel. Mel jsem sem asi okopcit kompletni kod, treba bysme na chybu narazili driv :-).

Funkce action vypada totiz takto:

public function actionMyForm($id) {
        if ($id) {
		$this['form']['save']->caption = 'Přidat';
                $this->group_id = 'fromUrl';
	...
}

Tim, ze volam $this[‚form‘], tak zavola nejdriv createComponentMyForm, ale jeste bez nove pridane id v promenne group_id.

Diky za pomoc.

22
Člen | 1478
+
0
-

ano, upřímně řečeno bych tu action zrušil a dal to rovnou do té komponenty, tím máš po starostech. Anebo si udělal metodu getGroupId().

Editoval 22 (4. 11. 2011 16:35)