Formulář bez MVC, jen s použitím NForm, validace,…

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

Dobrý den,
zatím nepoužívám z nette nic, ale chtěl bych se k tomu prokousat.
Mám dotaz, pokud si udělám následující formulář:

<?php

require 'Nette\loader.php';

$form = new NForm;
$form->addText('name', 'Jméno:')->addRule(NForm::FILLED, 'Zadejte jméno');
$form->addText('age', 'Věk:')
    ->addRule(NForm::FILLED, 'Zadejte věk')
    ->addRule(NForm::INTEGER, 'Věk musí být číslo')
    ->addRule(NForm::RANGE, 'Věk musí být v rozmezí od %d do %d let', array(5, 120));
$sex = array(
    'm' => 'muž',
    'f' => 'žena',
);
$form->addRadioList('gender', 'Pohlaví:', $sex);
$form->addText('email', 'E-mail:');
$form->addPassword('password', 'Heslo:');

$form->addSubmit('ok', 'Odeslat');
$form->addSubmit('cancel', 'Vymazat')
    ->setValidationScope(FALSE);

// jestliže byl formulář odeslán
if ($form->isSubmitted()) {
	// bylo zmáčkuno tlačítko cancel?
        if ($form['cancel']->isSubmittedBy()) {
              // nějak si nastavit defaultní hodnoty.... Jak??
        } elseif ($form->isValid()) {
        	echo '<h1>Formulář byl odeslán</h1>';

        	$values = $form->getValues();
        	Debug:dump($values);
        	exit;
    }
} else {
    // a jestliže nebyl odeslán, nastavíme výchozí hodnoty
	// Přednastavíme některé hodnoty (je na uživateli, zda je změní)
	$form->setDefaults(array(
	    'gender' => 'm' // Předpokládejme, že většina našich uživatelů budou muži :)
    	));
}
echo $form;

Jak mám posléze když zmáčknu tlačítko cancel promazat hodnoty do základní podoby?

Nebo jsem se taky dočetl, že jde nějak nastavovat callback, ale když jsem to zkoušel, tak se nic neděj. zkoušel jsem to podle: https://dev.nette.org/cs/nettecast/2

Kde je uvedeno:

<?php

// vytvoření dvou tlačítek
$form->addSubmit('ok', 'OK')->onClick[] = 'OkSubmitted';
$form->addSubmit('cancel', 'Cancel')->onClick[] = 'CancelSubmitted';
// napojení funkci???
function OkSubmitted($button)
{
    $form = $button->getForm();
    $values = $form->getValues();

    // Následuje zpracování dat...
    /*Debug::dump($values);*/ print_r($values); // Ukáže nám, co jsme odeslali
}
function CancelSubmitted($button)
{
    $form = $button->getForm();
    $values = $form->getValues();

    // Následuje zpracování dat...
    /*Debug::dump($values);*/ print_r($values); // Ukáže nám, co jsme odeslali
}

Můžete mě nějak nasměrovat, abych si mohl pohrát s formulářema?

Editoval kravčo (3. 11. 2010 14:59)

MilanLempera
Člen | 11
+
0
-

Zajímavý, až teď jsem si uvědomil, že nevím jak v nette udělat

<input type="reset" value="Reset" />

pak by Reset řešil klient a server by se o to nemusel starat.

Jinak mě napadají 2 možnosti:

  • přesměrování na stránku s formulářem – v novém požadavku se pak vytvoří nový formulář s default. hodnotami (to je podle mě lepší verze)

nebo

  • nastavení defaultních hodnot formuláře a vymazání ostatních (druhý parametr fce setValues )
$defaults = array(
            'gender' => 'm' // Předpokládejme, že většina našich uživatelů budou muži :)
        )

if ($form->isSubmitted()) {

	if ($form['cancel']->isSubmittedBy()) {
		$form->setValues($defaults, TRUE);

	} elseif ($form->isValid()) {
		...........
	}

} else {
	// not submitted, define default values
	$form->setDefaults($defaults);
}

Jak přesně je to v tomto případě s callback si nejsem jistej…

tatyalien
Člen | 239
+
0
-

Pěkný, to s tím defaults vypadá pěkně… ;) Ale je asi pravda, že můžu pak tím tlačítkem jen přesměrovat zpět na formulářovou stránku… ;)

No ve svejch formulářích používám ne tlačítko reset (nějak nedělá někdy co přesně chci), tak mám jiné tlačítko, které mě nastaví přesně co chci… ale tady jsem nevěděl jak…

Jen by to možná bylo lepší s tím callbackem, takhle testuji zda uživatel odeslal data, s callbeckem bych myslím jen nastavil funkci promazat jak chci a pak jednu po odeslání.

Editoval tatyalien (3. 11. 2010 18:30)