Formulář na editaci a přidávání se nechce odeslat

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

Ahoj,
napsal jsem si formulář na přidávání a editování telefonů, jenže se mi nechce odeslat a nevím proč?

<?php

namespace App;

use Nette,
    Nette\Application\UI;

class PhonePresenter extends BasePresenter {

    private $database;

    public function __construct(Nette\Database\Context $database) {
	$this->database = $database;
    }

    protected function createComponentPhoneForm() {
	$form = new UI\Form;
	$form->addText('serial', 'Sériové číslo:')
		->setRequired('Vyplňte 15ti místné sériové číslo')
		->addRule(\Nette\Forms\Form::INTEGER, 'Zadejte pouze celé číslo')
		->addRule(\Nette\Forms\Form::LENGTH, "Sériové číslo není 15ti místné", 15);
	$form->addText('name', 'Název:')
		->setRequired('Vyplňte název telefonu');
	;
	$sqlColors = "SELECT color_id, color_name FROM o2_colors ORDER BY color_name ASC";
	$colorsArray = array();
	foreach ($this->database->query($sqlColors) as $colors) {
	    $colorsArray[$colors->color_id] = $colors->color_name;
	}
	$form->addSelect('color', 'Barva', $colorsArray);
	$sqlProducers = "SELECT producer_id, producer_name FROM o2_producers ORDER BY producer_name ASC";
	$producersArray = array();
	foreach ($this->database->query($sqlProducers) as $producers) {
	    $producersArray[$producers->producer_id] = $producers->producer_name;
	}
	$form->addSelect('producer', 'Výrobce', $producersArray);
	return $form;
    }

    public function renderAddPhone() {
	$form = $this->getComponent("phoneForm");
	$form->addSubmit('add', 'Přidat');
	$form->onSubmit[] = array($this, 'addPhoneSubmitted');
	$this->template->form = $form;
    }

    public function renderEditPhone($sn) {
	$form = $this->getComponent("phoneForm");
	$sql = "SELECT * FROM o2_phones WHERE phone_sn=$sn";
	$editPhone = $this->database->query($sql)->fetch();
	if (!$editPhone) {
	    $this->error('Takový telefon není v databázi!');
	}
	$name = $editPhone->phone_name;
	$setDefaults = array('serial' => $editPhone->phone_sn,
	    'name' => $editPhone->phone_name);
	$form->setDefaults($setDefaults);
	$form['color']->setDefaultValue($editPhone->phone_color);
	$form['producer']->setDefaultValue($editPhone->phone_producer);
	$form->addSubmit('edit', 'Editovat');
	$form->onSuccess = $this->editPhoneSubmitted;
	$this->template->name = $name;
	$this->template->form = $form;
    }

    public function editPhoneSubmitted(UI\Form$form) {
	$values = $form->getValues();
    }

    public function addPhoneSubmitted(UI\Form $form) {
	$values = $form->getValues();
    }

}
David Matějka
Moderator | 6445
+
0
-
  1. $form->onSubmit[] je spatne, pouziva se onSuccess
  2. $form->onSuccess je spatne, chybi ti tam []
  3. co to znamena, ze se nechce odeslat?

Editoval matej21 (14. 1. 2014 19:07)

voda
Člen | 561
+
0
-

onSuccess formuláře musíš nastavit před zpracováním signálů (buď v továrničce nebo action metodě). Viz Životní cyklus presenteru

Chuchy
Člen | 77
+
0
-

Ok,

$form->onSuccess[] = $this->editPhoneSubmitted;

$form->onSuccess[] = $this->addPhoneSubmitted;

jsem opravil snad je to takhle správně.

A pokud to chci pomocí action, jak tam dostanu ty hodnoty z toho formuláře?

public function actionAddPhone(){
	$this->addPhoneSubmitted();
}

Nechce fungovat, když jsem měl vyplněné addPhoneSubmitted, tak mi to neuložilo do db a ani nepřesměrovalo na jiný presenter.

Editoval Chuchy (14. 1. 2014 19:31)

David Matějka
Moderator | 6445
+
0
-

jen ten kod, co nastavuje ty callbacky, presun z render do action

Editoval matej21 (14. 1. 2014 19:30)

Chuchy
Člen | 77
+
0
-

Takhle to, ale asi nepůjde, něco mi tam chybí?

public function editPhoneSubmitted(UI\Form $form) {
	$this->redirect('Phones:default');
	//$values = $form->getValues();
    }

    public function addPhoneSubmitted(UI\Form $form) {
	$this->redirect('Phones:default');
	//$values = $form->getValues();
    }

    public function actionAddPhone() {
	$form->onSuccess[] = $this->addPhoneSubmitted;
    }

    public function actionEditPhone() {
	$form->onSuccess[] = $this->editPhoneSubmitted;
    }

Editoval Chuchy (14. 1. 2014 19:41)

David Matějka
Moderator | 6445
+
0
-

ano, chybi ti tam promenna $form

Chuchy
Člen | 77
+
0
-

matej21 napsal(a):

ano, chybi ti tam promenna $form

public function addPhoneSubmitted(UI\Form $form) {
	$this->redirect('Phones:default');
	//$values = $form->getValues();
    }

    public function actionAddPhone($form) {
	$form->onSuccess[] = $this->addPhoneSubmitted;
    }

Pokud takhle, tak to nefunguje.
Jestli můžu poprosit, momentálně netuším, kde :D

Editoval Chuchy (14. 1. 2014 20:01)

voda
Člen | 561
+
0
-
public function actionAddPhone() {
	$this['phoneForm']->onSuccess[] = $this->addPhoneSubmitted;
}
Chuchy
Člen | 77
+
0
-

voda napsal(a):

public function actionAddPhone() {
	$this['phoneForm']->onSuccess[] = $this->addPhoneSubmitted;
}

Díky moc.

Btw.jak mám renderEditPhone($sn), tak bude vhodné asi $sn uložit jako skryté pole.