Stratené hodnoty po submite formulára
- _rasel^
- Člen | 59
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
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?
- _rasel^
- Člen | 59
@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)