Stratené hodnoty po submite formulára

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

Ahojte, na vytvorenie formulára používam klasickú továrničku. Formulár sa vyrenderuje správne vo všetkých prípadoch nižšie. Lámem si s tým hlavu dlho a nechápem ako je možné, že sa formulár so všetkými položkami vyrenderuje vždy správne a iba položky, ktoré sú pridané z databázy foreachom sa po odoslaní formulára stratia a nie sú vo $values. Problematický je príklad č. 3 ku ktorému som zo zúfalosti pridal aj perzistentný parameter.

Presenter:

	/** @var SourceFormFactory @inject */
	public $factory;

	...

	public function createComponentSourceForm() {
		$form = $this->factory->create();
		$form->onSuccess[] = function ($form) {
			$this->redirect('this');
		};
		return $form;
	}

Príklady:

/** @persistent */
private $_columns;

public function create() {

	$form = $this->factory->create();

	// 	1. príklad

	$array = [
	['name' => 'titul', 'label' => 'Titul:'],
	['name' => 'meno', 'label' => 'Meno:'],
	['name' => 'priezvisko', 'label' => 'Priezvisko:'],
	];

	$hash_array = Nette\Utils\ArrayHash::from($array);

	Debugger::barDump($hash_array, 'hash_array');

	foreach ($hash_array as $h) {
		$form->addText($h->name, $h->label);
	}

	// 	2. príklad

	$pairs = [
	'ulica' => 'Ulica:',
	'cislo' => 'Číslo:',
	'mesto' => 'Mesto:',
	];

	Debugger::barDump($pairs, 'pairs');

	foreach ($pairs as $name => $label) {
		$form->addText($name, $label);
	}

	// 	3 príklad.

	$this->_columns = $this->source->getColumnsForCurrentSource()->fetchPairs('column_name', 'friendly_column_name');

	Debugger::barDump($this->_columns, 'columns');

	foreach ($this->_columns as $name => $label) {
		$form->addText($name, $label);
	}

	Debugger::barDump($form, 'form create()');

	$form->addSubmit('save', 'Pridať');

	$form->onSuccess[] = [$this, 'formSucceeded'];

	return $form;
}

public function formSucceeded(Form $form, $values) {
	Debugger::barDump($form, 'form success');
	Debugger::barDump($values, 'hodnoty formulara');

	$this->source->table($this->url_table)->insert($values);
}

Insert vyzerá takto – chýbajú v ňom položky z príkladu č. 3 napriek tomu, že vo formulári obsiahnuté sú…

INSERT INTO `CFG_Vzdelanie` (`titul`, `meno`, `priezvisko`, `ulica`, `cislo`, `mesto`)
VALUES ('x', 'x', 'x', 'x', 'x', 'x')

Viem mi prosím niekto pomôcť kde robím chybu?

Editoval _rasel^ (24. 8. 2017 12:36)

_rasel^
Člen | 59
+
0
-

Teoretické rozuzlenie: Komplikácia bola niekde v získavaní stĺpcov. Napriek tomu, že formulár sa vyrenderoval správne, tak po odoslaní formulára zrejme nette vyhodnotilo, že prvky nie sú súčasťou formulára a došlo k ich zahodeniu.

Ako je možné takéto správanie debugovať a zistiť dôvod na strane nette forms?

CZechBoY
Člen | 3608
+
0
-

Třeba prvky, které mají být vyplněny označit jako ->setRequired(true).

_rasel^
Člen | 59
+
0
-

@CZechBoY Áno, to tam určite chýba a je to dôležité, ale nie je to dôvod vzniku komplikácie. Pravdepodobne mám nelogickú chybu v návrhu… musím naplno vyžiť DI pretože jeden dôležitý perzistatný param. odovzdávam z presenteru do form factory cez konštruktor ale tento param. sa používa aj v db modeli a tam ho pomerne nešťastne dostávam z render presentera čo je pomerne mätúce – radšej ho bude db modelu odovzdávať form factory čo bude isto čistejšie a jasnejšie (keďže tam vlastne už je). Každopádne nechápem prečo to nezarevalo na nejakej chybe a namiesto toho sa tie položky po odoslaní stratili aj keď boli vyplnené…

Editoval _rasel^ (30. 8. 2017 12:42)