Recoverable Error?

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

Zdravim
jelikoz se v nette pohybuji pouze par dni tak narazim na chyby pro me neresitelne :D
narazil jsem na problem zapisu dat do DB, vytvorim si komponentu … zavolam si ji ale pri odeslani mi to hodi nasledujici chybu
*Recoverable Error

Argument 1 passed to ClankyPresenter::formularSubmitted() must be an instance of AppForm, instance of SubmitButton given*

cerpal jsem z akrabat.forms

<?php
protected function createComponentVloz($name)
	{
             $form = new appForm($this, $name);
             $form->addText("pridal", "Zadejte jméno")
                ->addRule(FORM::FILLED, "Zadejte jméno");
             $form->addText("datum", "Zadejte datum")
                ->addRule(FORM::FILLED, "Zadejte datum");
             $form->addTextArea("text", "Obsah", "20", "10")
                ->addRule(FORM::FILLED, "Obsah nebyl vyplněn");
             $form->addProtection();
             $form->addSubmit("odeslat", "Odeslat")
                ->onClick[] = array($this, 'formularSubmitted');
	}
?>

vykreslim

<?php
    public function renderVloz()
    {
        $this->template->title = "Přidání článku";
        $this->template->formular = $this->getComponent('vloz');
    }
?>

a kdyz chci zapsat

<?php
    public function formularSubmitted(AppForm $form)
    {
		if ($form['odeslat']->isSubmittedBy()) {
           // zapis pomoci DIBI
		}

		$this->redirect('default');
    }
?>

tak mi to hodi zminovanou chybu… kdyz AppForm z tama odstranim tak mi to zase hodi chybu u isSubmittedBy.. nevim si rady… :((
poradi nekdo??
diky za vsechny odpovedi
Fergi

David Grudl
Nette Core | 8228
+
0
-

On je totiž rozdíl v tom, když nastavíš událost na tlačítko nebo na formulář:

$form->addSubmit("odeslat", "Odeslat")
                ->onClick[] = array($this, 'formularSubmitted');
// vs.
$form->onSubmit[] = array($this, 'formularSubmitted');

Zatímco v druhém případě se (jak očekáváš) metodě předá odeslaný formulář, v prvním případě se předá odeslané tlačítko. Takže metoda musí vypadat takto:

public function formularSubmitted(SubmitButton $button)

// nebo jednodušeji
public function formularSubmitted($button)

K formuláři se pak dostaneš takto:

public function formularSubmitted($button)
{
	$form = $button->form;
}
romansklenar
Člen | 655
+
0
-

buď:

public function formularSubmitted(SubmitButton $button)
{
	$form = $button->getForm();
	...
}

nebo:

$form = new AppForm($this, $name);
...
$form->addSubmit("odeslat", "Odeslat");
$form->onSubmit[] = array($this, 'formularSubmitted');

EDIT: pozdě :)

Fergi
Člen | 14
+
0
-

krasa :) uz to vali dik moc obema