Ignorování validace inputu ve formuláři pomocí addRule a anonymní funkce

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

Ahoj,
nejsem si jistý, co dělám špatně. Používám anonymní funkce při kontrole formuláře a příjde mi, že je uplně jedno, jestli to vrátí true nebo false. Vždy se dostanu k succeed metodě, kde to samozřejmě spadne. Zkoušel jsem i natvrdo vracet false/true při kontrole ale je to úplně jedno.

Mimochodem, nějáké nápady na „zhezčení“ kódu?

Předem díky za pomoc. :)

		$form = new Form();
$form->addText(UserManagement::USERNAME, UserManagement::USERNAME_LABEL)
    ->setRequired(UserManagement::USERNAME_REQUIRED)
    ->addRule(Form::MIN_LENGTH, UserManagement::USERNAME_MIN_LENGTH_TEXT, UserManagement::USERNAME_MIN_LENGTH)
    ->addRule(function (\Nette\Forms\Controls\TextInput $username) {
        return $this->getUserManager()->isUsernameOk($username->getValue());
    }, UserManagement::USERNAME_ALLOWED_CHARS)
    ->addRule(function (\Nette\Forms\Controls\TextInput $username) {
        return $this->getUserManager()->isUsernameUnique($username->getValue());
    }, UserManagement::USERNAME_EXISTS)
    ->addRule(Form::MAX_LENGTH, UserManagement::USERNAME_MAX_LENGTH_TEXT, UserManagement::USERNAME_MAX_LENGTH);
$form->addEmail(UserManagement::EMAIL, UserManagement::EMAIL_LABEL)
    ->setRequired(UserManagement::EMAIL_REQUIRED)
    ->addRule(function (\Nette\Forms\Controls\TextInput $email) {
        return $this->getUserManager()->isEmailUnique($email->getValue());
    }, UserManagement::EMAIL_EXISTS)
    ->addRule(function (\Nette\Forms\Controls\TextInput $email) {
        return $this->getUserManager()->isEmailOk($email->getValue());
    }, UserManagement::EMAIL_MX_ERROR);
$form->addPassword(UserManagement::PASSWORD_1, UserManagement::PASSWORD_LABEL, null, UserManagement::PASSWORD_MAX_LENGTH)
    ->setRequired(UserManagement::PASSWORD_REQUIRED)
    ->addRule(function (\Nette\Forms\Controls\TextInput $password) {
        return $this->getUserManager()->isPasswordOk($password->getValue());
    }, UserManagement::PASSWORD_MIN_SECURITY)
    ->addRule(Form::MIN_LENGTH, UserManagement::PASSWORD_MIN_LENGTH, UserManagement::PASSWORD_MIN_LENGTH);
$form->addPassword(UserManagement::PASSWORD_2, UserManagement::PASSWORD_VERIFY_LABEL, null, UserManagement::PASSWORD_MAX_LENGTH)
    ->setRequired(UserManagement::PASSWORD_VERIFY_REQUIRED)
    ->addRule(Form::EQUAL, UserManagement::PASSWORD_MUST_MATCH, $form[UserManagement::PASSWORD_1]);
$form->addSubmit("register", UserManagement::SIGN_UP_SUBMIT_LABEL);
$form->onSubmit[] = [$this, 'signUpFormSucceeded'];
return $form;

Editoval 2bad2furious (4. 8. 2017 12:26)

David Matějka
Moderator | 6445
+
+3
-

pouzivas totiz onSubmit a ne onSuccess. onSubmit se vola vzdy, bez ohledu na to, zda se to spravne zvalidovalo

2bad2furious
Člen | 26
+
0
-

Díky za odpověď. Mám však další problém, nezobrazují se mi message z backend-checkování. V td s inputem se mi udělá span.error, je ale prázdný.

Edit–
Vyřešeno.
Proč form renderer překládá dvakrát?
Do DefaultFormRenderer::renderErrors dorazí error už přeložený, tam ho chce překládat znova.

Kde se dají dávat podměty k úpravě? Mám jich pár nashromážděno.

Editoval 2bad2furious (4. 8. 2017 14:49)

CZechBoY
Člen | 3608
+
0
-

Podněty můžeš dát na github do issues, případně rovnou upravené s pull requestem.

Ke zhezčení kodu: můžeš tam dát třeba prázdný řádky a je to už celkem čitelné.

$form = new Form();

$form->addText(UserManagement::USERNAME, UserManagement::USERNAME_LABEL)
    ->setRequired(UserManagement::USERNAME_REQUIRED)
    ->addRule(Form::MIN_LENGTH, UserManagement::USERNAME_MIN_LENGTH_TEXT, UserManagement::USERNAME_MIN_LENGTH)
    ->addRule(function (\Nette\Forms\Controls\TextInput $username) {
        return $this->getUserManager()->isUsernameOk($username->getValue());
    }, UserManagement::USERNAME_ALLOWED_CHARS)
    ->addRule(function (\Nette\Forms\Controls\TextInput $username) {
        return $this->getUserManager()->isUsernameUnique($username->getValue());
    }, UserManagement::USERNAME_EXISTS)
    ->addRule(Form::MAX_LENGTH, UserManagement::USERNAME_MAX_LENGTH_TEXT, UserManagement::USERNAME_MAX_LENGTH);

$form->addEmail(UserManagement::EMAIL, UserManagement::EMAIL_LABEL)
    ->setRequired(UserManagement::EMAIL_REQUIRED)
    ->addRule(function (\Nette\Forms\Controls\TextInput $email) {
        return $this->getUserManager()->isEmailUnique($email->getValue());
    }, UserManagement::EMAIL_EXISTS)
    ->addRule(function (\Nette\Forms\Controls\TextInput $email) {
        return $this->getUserManager()->isEmailOk($email->getValue());
    }, UserManagement::EMAIL_MX_ERROR);

$form->addPassword(UserManagement::PASSWORD_1, UserManagement::PASSWORD_LABEL, null, UserManagement::PASSWORD_MAX_LENGTH)
    ->setRequired(UserManagement::PASSWORD_REQUIRED)
    ->addRule(function (\Nette\Forms\Controls\TextInput $password) {
        return $this->getUserManager()->isPasswordOk($password->getValue());
    }, UserManagement::PASSWORD_MIN_SECURITY)
    ->addRule(Form::MIN_LENGTH, UserManagement::PASSWORD_MIN_LENGTH, UserManagement::PASSWORD_MIN_LENGTH);

$form->addPassword(UserManagement::PASSWORD_2, UserManagement::PASSWORD_VERIFY_LABEL, null, UserManagement::PASSWORD_MAX_LENGTH)
    ->setRequired(UserManagement::PASSWORD_VERIFY_REQUIRED)
    ->addRule(Form::EQUAL, UserManagement::PASSWORD_MUST_MATCH, $form[UserManagement::PASSWORD_1]);

$form->addSubmit("register", UserManagement::SIGN_UP_SUBMIT_LABEL);

$form->onSubmit[] = [$this, 'signUpFormSucceeded'];

return $form;