Vkládání do databáze bez nutnosti unsetovat data polí formuláře

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

Dobrý den / Ahoj,
mám dotaz, který je zpočátku celkem stupidní, ale velice by mi pomohlo jej vyřešit nějak inteligentně.

Mám registrační formulář ve kterém vyplňuji několik položek, které se ukládají do tabulky uživatelů, některé do tabulky poštovních adres a některé se vůbec neukládají.
např:

// vytvoření componenty signInForm

$form->addText('username'); // ukládá se do USER
$form->addText('passwd'); // ukládá se do USER
$form->addText('passwd2'); // neukládá se vůbec jde jen o validaci hesla
$form->addText('street'); // ukládá se do ADDRESS
$form->addText('city'); // ukládá se do ADDRESS

Po úspěšném odeslání jej zpracovávám:

// formSubmitted

$formData = $form->getValues(TRUE);

// unsetnu pole které v DB není
unset($formData['passwd2']);

// tady si ještě data pro adresu ukládám do jiného pole, které pak uložím do databáze do tabulky ADDRESS
// dále je unsetnu
unset($formData['street']);
unset($formData['city']);

a tyto data následně zapíši do databáze:
$user = $this->context->createUsers()->insert($formData);

// P.S. psáno z hlavy jedná se jen o ukázku

Vše funguje, ale chtěl bych abych nemusel tyto hodnoty unsetovat a do databáze by se mi zapsali pouze pole, pro které existuje v databázi sloupec(atribut).

tj. abych dal třídě Users všechna data z formuláře a dotaz by se provedl bez problému, v tuto chvíli pokud odešlu data do databáze, Nette vyhodí vyjímku, že sloupec neexistuje a SQL není možno provést. Ono je to vlastně správně, ale hodnot ve formulářích které se musí unsetovat je poměrně hodně, tak se chci zeptat zda to nejde nějak obejít (vyhnout se několika unsetům po sobě).

Jan Endel
Člen | 1016
+
0
-

Kontejnery:

protected createComponentForm() {
	$form = new \Nette\Application\UI\Form();

	$conData = $form->addContainer('data');

	$conData->addText('jmenoDoDb', 'Jméno:');

	$form->addText('textMimoDb', 'Text:');
	$form->addSubmit('send', 'Odeslat');

	$form->onSuccess[] = callback($this, 'formSubmitted');
}

public function formSubmitted(\Nette\Application\UI\Form $form)
{
	$vals = $form->getValues();

	$this->context->fooModel->saveToDb($vals['data']);
}
bojovyletoun
Člen | 667
+
0
-

Samotná metoda na získání sloupců může vypadat takhle. Nebo to můžeš číst z anotací, pokud máš „entity“ --

$a = new \Nette\Database\Connection('mysql:host=localhost;dbname=test', 'root', 'root');
$r = $a->supplementalDriver->getColumns('tablo');
dump($r);
koprkuba
Člen | 24
+
0
-

Díky moc,
zítra to vyzkouším, zatím se mi nejvíc líbí varianta konteinerů, ale uvidím jestli to bude fungovat i pro můj případ. Elegantní by na tom bylo, že bych k tomuto konteineru mohl přistoupit jako k skupině prvků pro Entitu adresy.

juzna.cz
Člen | 248
+
0
-

Na svem blogu jsem psal, jak to delam ja.
Pouzivam to s Doctrine, ale slo by to asi i s Nette Database (nebo i jinym pristupem).