Výchozí hodnota v případě prázdného inputu
- Muhahe
- Člen | 79
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
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
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
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
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.