Zpracování formuláře z ruzných prezenterů

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

Ahoj,

mám formulář v komponentě, kterou používá více presenterů. Po odeslání formuláře bych chtěl ten form zpracovat jednou funkcí jednoho presenteru a zobrazit view na tomto presenteru.

Komponentu negeneruji už v layoutu, ale pouze pro určité pohledy různých presenterů.

Zatím používám ve vyhledávacím formu v komponentě tento callback. Pokuď jsem v presenteru, kde je funkce searchFormSubmitted, tak to celé funguje bezvadně. Když jsem v jiném, tak mi to nefunguje.

$panelForm->onSubmit[] = callback($this->presenter, 'searchFormSubmitted');

Nevím, jak šikovně odkázat callbackem na konkrétní presenter.

Používam Nette 2alpha.

Poraďte prosím.

Honza

srigi
Nette Blogger | 558
+
0
-

Jedno (hnusne a nesystemove) riesenie je nadefinovat callback metodu v kazdom Presenteri. Omnoho lepsi napad je definovat Formular vo vlasnej triede a do nej dat aj callback metodu:

forms/PanelForm.php

class PanelForm extends AppForm
{
  public function __construct($parent, $name)
  {
    parent::__construct($parent, $name);

    $this->addText('foo', 'Foo')
       ...
       ...

    $this->onSubmit[] = array($this, 'formSubmited');
  }

  public function formSubmited(AppForm $form)
  {
    // zpracovanie
    // $this->presenter vrati aktualny Presenter
  }
}

components/FooControl.php

class FooControl extends control
{
  public function render()
  {
    $this->template->form = new PanelForm();
    ...
  }
}
Filip Procházka
Moderator | 4668
+
0
-

Nepřipojený formulář přijímá signály? :)

Když už máš ten callback v tom rozšířeném formuláři, proč to komplikovat.

public function renderDefault()
{
	// jeden ze způsobů
	$this->template->form = $this['panelForm'];
}


protected function createComponentPanelForm($name)
{
	return $form = new PanelForm($this, $name);
}

popř, pokud potřebuješ, můžeš dát šablony už do formuláře

jenda87
Člen | 20
+
0
-

Jasně jasně. Díky chlapy. Jenže já mám ještě jeden problém, který jsem asi zapomněl zdůraznit. Potřebuju custom vypisování to formu. Proto jsem to celý hodil do komponenty. Zdálo se mi to ideální, vlastní šablonka. Jenže teď mi nejde to přesměrování zpracování formu na jedno view na stále stejnej presenter (jak jsem psal v 1. postu)

class PanelControl extends NControl {

    public function __construct()
    {
        parent::__construct();
    }

    public function render()
    {
        $template = $this->template;
        $template->setFile(dirname(__FILE__) . '/PanelControl.phtml');
        $template->render();
    }

    protected function createComponentPanelForm() {

    	...

        $panelForm->onSubmit[] = callback($this->presenter,'searchFormSubmitted');



        return $panelForm;

    }

Funkce pro zpracování formu vypadá takto:

class DefaultPresenter extends BasePresenter
{
public function SearchFormSubmitted(NAppForm $form) {
	   $values = $form->getValues();

		...



	   if (!$this->isAjax()) {
               $this->redirect('vyhledavani');
           }
           else {
               $this->invalidateControl('form');
               $this['searchForm']->setValues($values, TRUE);
           }
	}
}

Komponentu PanelControl vytvářím v basepresenteru.

Lei
Člen | 4
+
0
-

Řešil jsem podobný problém a vyřešil jsem to tak (i když netuším, jestli správně ;)), ze funkci searchFormSubmitted mám normálně v tý komponentě a dělá jen to, že data ze searchformu uloží do session a aplikaci redirectne na presenter Search.

jenda87
Člen | 20
+
0
-

Nojo. Jenze, ja touhle funkci jeste chci zpracovavat jinej formular.

Muj komponentovej formular je vpodstate podmnozina velkyho vyhledavaciho formulare. Je to takovy ajaxovaty, hezky se nastavujou defaultni hodnoty. Mam to celkem odladeny.

Tak jsem myslel (nez to nejak preprasim :D), ze by mohlo existovat nejaky systemovejsi reseni nez sessions a tak.

Filip Procházka
Moderator | 4668
+
0
-

imho best practise na složené formuláře:

class AddressContainer extends Nette\Forms\FormContainer
{
	protected function attached($form)
	{
		if (!($form instanceof Nette\Forms\FormContainer)) {
			return;
		}

		$this->addText('city', "město");
		$this->addText('street', "ulice");
		// ...
	}
}
$form = new Nette\Application\AppForm();
// ...
$form['dorucovaciAdresa'] = new AddressContainer();
// ...
$form['fakturacniAdresa'] = new AddressContainer();
// ...
jenda87
Člen | 20
+
0
-

Nojo ale to stejne neresi problem, kdyz zobrazim form (at uz v kompente nebo bez) v jednom presenteru a chci zpracovat a zobrazit view z jinyho presenteru ne?

Takze jedina moznost sessions?