Nette\Application\UI\BadSignalException #403 po odoslani formulára

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

Nette Framework 2.0.8
Mám formulár na ktorom mám new/edit položky. Pri vytváraní novej položky, nieje problém všetko prebehne bez problémov. Pri edite ale hodí:

Nette\Application\UI\BadSignalException #403
The signal receiver component ‚users‘ is not found.

Nemám v presentery žiadne action/render, čisto componeta, jej onSuccess a par iných component. Teda mi to osobne vychádza že je nejaký problém s dátami, ktoré dostal formulár pri tvorbe editu.

	public function createComponentUsers(){
		$users = new \Users;
		$form = new UI\Form;

		$form->addText('company', 'Obchodný názov:')
			->addRule(Form::FILLED, 'Prosím zadaj obchodný názov firmy.');
		$form->addText('street', 'Ulica:')
			->addRule(Form::FILLED, 'Prosím zadaj ulicu.');
		$form->addText('number', 'Číslo:')
			->addRule(Form::FILLED, 'Prosím zadaj súpisné číslo.');
		$form->addText('city', 'Mesto:')
			->addRule(Form::FILLED, 'Prosím zadaj mesto.');
		$form->addText('psc', 'PSČ:')
			->addRule(Form::FILLED, 'Prosím zadaj PSČ.')
			->addRule(Form::INTEGER, 'PSČ môže obsahovať iba čísla.')
			->addRule(Form::LENGTH, 'PSČ musí obsahovať %d znakov.', 5);
		$form->addText('ico', 'IČO:')
			->addRule(Form::FILLED, 'Prosím zadaj IČO.')
			->addRule(Form::INTEGER, 'IČO môže obsahovať iba čísla.')
			->addRule(Form::LENGTH, 'IČO musí obsahovať %d znakov.', 8);


		$form->addText('website', 'Webstránka tvojej donáškovej služby:')
			->addRule(Form::FILLED, 'Prosim zadaj webstránku svojej donáškovej služby.')
			->addRule(Form::URL, 'Zadaj platnú URL adresu.');
		$form->addText('username', 'Login:')
			->addRule(Form::FILLED, 'Prosím zadaj login.')
			->addRule(Form::EMAIL, 'Login musí byť platný email.');
		if($this->getParameter('action')=='new'){
			$form->addPassword('password', 'Heslo:')
				->addRule(Form::FILLED, 'Prosím zadaj heslo.')
				->addRule(Form::MIN_LENGTH, 'Heslo musí byť aspoň %d znakov dlhé', 5);
			$form->addPassword('cpassword', 'Potvrď heslo:')
				->addRule(Form::FILLED, 'Prosím potvrď heslo.')
				->addRule(Form::EQUAL, 'Hesla sa nezhodujú.', $form['password']);
		}else{
			$form->addPassword('password', 'Heslo:')
				->addConditionOn($form['password'], Form::FILLED)
				->addRule(Form::MIN_LENGTH, 'Heslo musí byť aspoň %d znakov dlhé', 5);
			$form->addPassword('cpassword', 'Potvrď heslo:')
				->addConditionOn($form['password'], Form::FILLED)
				->addRule(Form::FILLED, 'Prosím potvrď heslo.')
				->addRule(Form::EQUAL, 'Hesla sa nezhodujú.', $form['password']);
		}

		$form->addSelect('role', 'Typ:', $users->roles)
			->addRule(Form::FILLED, 'Prosím zadaj obchodný názov firmy.');

		$form->addTextArea('comment', 'Poznámka:');

		$table = 'users';
		if($this->getParameter('action')!='new'){
			if($this->getParameter('action')=='edit')
				$table = 'users';
			elseif($this->getParameter('action')=='editReg')
				$table = 'registrations';
			$data = $users->getData($table, $this->getParameter('id'), true);
			$form->setDefaults($data);
		}

		$form->addHidden('table', $table);
		$form->addHidden('action', $this->getParameter('action'));
		$form->addHidden('id', $this->getParameter('id'));

		$form->addSubmit('send', 'Odoslať');
		$form->onSuccess[] = $this->usersSucceeded;
		return $form;

	}
vvoody
Člen | 910
+
0
-

Nezmenil sa presenter po odoslaní formu? Skontroluj debug bar pod ladenkou.

Sator
Člen | 15
+
0
-

Pozrel som to a ma ho spravny.

pepakriz
Člen | 246
+
0
-

Tipoval bych, že továrnička během procesu vytváření havaruje a tudíž se komponenta řádně nevytvoří ⇒ proto hlásí, že komponenta users neexistuje. Viz: https://api.nette.org/…ter.php.html#307

castamir
Člen | 629
+
0
-

zkus tohle

$users = new \Users;
//...
$table = 'users';
if($this->getParameter('action')!='new'){
    if($this->getParameter('action')=='edit')
        $table = 'users';
    elseif($this->getParameter('action')=='editReg')
        $table = 'registrations';
    $data = $users->getData($table, $this->getParameter('id'), true);
    $form->setDefaults($data);
}

přepsat do patřičných action metod (edit a editReg) např. nějak takto:

public function actionEdit($id) {
    $users = new \Users;
    $data = $users->getData("users", $id, true);
    if (!is_array($data)) { // nevim, co vracis, ale setDefaults pozaduje pole nebo neco, co si to pole umi vytvorit
        throw new \Nette\Application\ForbiddenRequestException;
    }
    $this['users']->setDefault($data);
}

Editoval castamir (26. 1. 2013 12:14)

Sator
Člen | 15
+
0
-

Skusal som to debuggovat a vzdy ked som v componente dal $form->setDefaults($data) alebo $form->setValues($data) to padlo po submite.

Takze som to prerobil tak ze som spravil action pre oba edity a tam do templatu davam data a v template davam $form->setDefaults($data)

Toto riesenie sice funguje, ale bol som zvyknuty to riesit v componente. Tento web mam ako prvy na nette 2.0.8, zeby sa zmenilo nieco co to crashuje?

vvoody
Člen | 910
+
0
-

Môžeš ukázať ladenku?

Paradiso
Člen | 101
+
0
-

měl jsem stejný problém. Vyřešilo to to, že jsem defaultní hodnoty naplnil až v action metodě

$this['myForm']->setDefaults();

Editoval Paradiso (3. 3. 2013 10:43)