Výchozí hodnota v případě prázdného inputu

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

Potřeboval bych nastavit výchozí hodnotu inputu v případě, že je input prázdný. Tato hodnota by měla vycházet ze spojení hodnot z dvou předešlých hodnot inputů. Následně bych potřeboval ověřit, zda již hodnota v databázi existuje.

Existuje místo setDefaultValue u inputu login možnost jak brát hodnotu z předchozích inputů? Pokud ano, pak předpokládám, že by mělo stačit k tomu inputu přidat addRule s vlastní metodou validace.

vytvoření formuláře

<?php
protected function createComponentNewUserForm() {

        $form = new Form;
        $name = $form->addText('name', 'Name', 30, 15)
                ->addRule(Form::FILLED, "Name must be filled.");
        $surname = $form->addText('surname', 'Surname', 30, 15)
                ->addRule(Form::FILLED, "Surname must be filled.");
        $form->addText('login', 'login', 30, 35)
                ->setDefaultValue($name->getValue().".".$surname->getValue());
        $form->addPassword('password', 'Password', 30, 50)
                ->addRule(Form::MIN_LENGTH, 'Password must have atleast %d characters znaky', 4);
        $form->addPassword('passwordVerify', 'Password verify', 30, 50)
                ->addRule(Form::MIN_LENGTH, 'Password must have atleast %d characters znaky', 4)
                ->addRule(Form::EQUAL, 'Passwords are incorrect', $form['password']);
        $form->addText('email', 'Email', 30, 50)
                ->addRule(Form::EMAIL, 'Invalid email format');
        $form->addText('position', 'Position', 30, 20);

        $form->addRadioList('permission', 'Permission', $permission);


        return $form;
    }

?>
Hafran
Člen | 121
+
0
-

Jestli to chápu dobře, tak nejprve uživatel vyplní jméno a heslo (které nemá defaults) a pak teprve má vyplnit login, který když nevyplní, tak se nastaví automaticky?
Tzn. chceš aby se to vyplnilo v průběhu psaní formuláře – což myslím nepude přes Nette, ale šlo by to řešit přes JS. Anebo samozřejmě až po odeslání formuláře (login bys nechal nevyplněný) a můžeš validovat už načtené hodnoty přímo proti DB.

Muhahe
Člen | 79
+
0
-

Hafran napsal(a):

Jestli to chápu dobře, tak nejprve uživatel vyplní jméno a heslo (které nemá defaults) a pak teprve má vyplnit login, který když nevyplní, tak se nastaví automaticky?
Tzn. chceš aby se to vyplnilo v průběhu psaní formuláře – což myslím nepude přes Nette, ale šlo by to řešit přes JS. Anebo samozřejmě až po odeslání formuláře (login bys nechal nevyplněný) a můžeš validovat už načtené hodnoty přímo proti DB.

Přesně ta druhá možnost. Aby uživatel vyplnil jmeno a prijmeni a pokud by nevyplnil login, tak ten by se po submitnutí vytvořil jako jmeno.prijmeni.

Takže pokud bych ten login generoval až po submitnutí formuláře, tak by šlo také validovat?

David Matějka
Moderator | 6445
+
0
-

v nette na to zadna zkratka nebude, budes to muset udelat rucne, konkretne tenhle kod:

if($form->isSubmitted() && !$form['login']->getValue()) {
	$form['login']->setValue($form['name'] . '.' . $form['surname']);
}

je ale problem kam to umistit :) je nutno, aby se tenhle kod provedl po pripojeni formulare k presenteru, takze je nekolik moznosti:

1. v action presenteru (treba actionDefault nebo jak potrebujes):

$form = $this['newUserForm'];
//a kod

2. pripojenim formulare k presenteru ihned pri vytvareni:

protected function createComponentNewUserForm($name) {
	$form = new Form($this, $name);
	//definice controlu..
	//a na konec pred return ten kod
}

3. asi nejlepsi, ale trosku komplikovanejsi – podedit si Form a pridat tam chybejici event onAttached

class Form extends \Nette\Application\UI\Form
{

	public $onAttached = array();

	protected function attached($presenter)
	{
		parent::attached($presenter);
		if($presenter instanceof \Nette\Application\UI\Presenter)
		{
			$this->onAttached($this);
		}
	}
}

a v tovarnicce v createComponent* metode akorat:

protected function createComponentNewUserForm()
{
	$form = new Form; //ten co jsem napsal, ne UI\Form :)
	$form->onAttached[] = function($form) {
		//kod
	}
	//...
}

ten onAttached event je hodne uzitecnej i v jinych pripadech :)

Editoval matej21 (19. 9. 2013 13:46)

Muhahe
Člen | 79
+
0
-

Díky za rady, nakonec jsem to udělal přidánim metody validateLogin a použitím onValidate u formuláře.

<?php

protected function createComponentNewUserForm() {

        $form = new Form;
        $name = $form->addText('name', 'Name', 30, 15)
                ->addRule(Form::FILLED, "Name must be filled.");
        $surname = $form->addText('surname', 'Surname', 30, 15)
                ->addRule(Form::FILLED, "Surname must be filled.");
        $form->addText('login', 'login', 30, 35);

        $form->addPassword('password', 'Password', 30, 50)
                ->addRule(Form::MIN_LENGTH, 'Password must have atleast %d characters', 4);
        $form->addPassword('passwordVerify', 'Password verify', 30, 50)
                ->addRule(Form::MIN_LENGTH, 'Password must have atleast %d characters', 4)
                ->addRule(Form::EQUAL, 'Passwords are incorrect', $form['password']);
        $form->addText('email', 'Email', 30, 50)
                ->addRule(Form::EMAIL, 'Invalid email format');
        $form->addText('position', 'Position', 30, 20);

        $form->addRadioList('permission', 'Permission', $permission);
        $form->onValidate[] = callback($this, 'validateLogin');

        return $form;
    }

 private function validateLogin($form){
        $values = $form->getValues();
        if($values['login']==""){
            $values['login'] = $values['name'].".".$values['surname'];
            if($this->uzivateleRepository->loginExists($values['login'])){
                $form['login']->setValue('value');
                $form->addError('login exists');
            }
        }else{
            if($this->uzivateleRepository->loginExists($values['login'])){
                $form->addError('created login exists');
            }
        }
    }
?>

Ještě toho tam mam dost na dolaďování ale vypadá to že to bude fungovat. Jen doufám, že to neni moc velká prasečina.