Ako zakázať znaky vo formulári pri registrácii
- SontoEremo
- Člen | 341
Zdravím ľudia,
Rád by som sa opýtal Vás ako riešite špeciálne znaky vo formulároch
(mekčene, medzeri, a špeciálne znaky napr. {}, -, _,
atď…)?
$registerForm->addText('username')
->setAttribute('placeholder', 'Užívateľské meno')
->setAttribute('class', 'form-control')
->addRule(Form::MIN_LENGTH, 'Užívateľské meno musí obsahovať aspoň %d znaky', 4)
->addRule(Form::MAX_LENGTH, 'Užívateľské meno môže obsahovať max. %d znakov', 32)
Neviem akým príkazom a kam to dať.
Vopred všetkým ďakujem.
- jiri.pudil
- Nette Blogger | 1032
Regulárem:
->addRule(Form::PATTERN, 'uživatelské jméno nesmí obsahovat divné znaky', '[a-zA-Z0-9]+');
- SontoEremo
- Člen | 341
jiri.pudil napsal(a):
Regulárem:
->addRule(Form::PATTERN, 'uživatelské jméno nesmí obsahovat divné znaky', '[a-zA-Z0-9]+');
Takže týmto sa zakáže všetko špeciálne a ostane iba male-Veľke a
číslice? čo to plus nakonci?
A dík za pomoc :)
- Michal Vyšinský
- Člen | 608
Ano. v hranatých závorkách je výčet povolených znaků, pomlčka mezi dvěma znaky znamená interval.
Plus na konci reguláru znamená alespoň jeden znak: dobrý zdroj na regulární výrazy: http://www.regularnivyrazy.info/
Editoval Michal Vyšinský (30. 6. 2014 9:42)
- SontoEremo
- Člen | 341
->addRule(Form::PATTERN, 'Špeciálne znaky sú zakázané', '[a-zA-Z0-9]+');
Ako to, že pri odoslaní nevypíše chybu Špeciálne znaky sú zakázané ale vyhodí mi to v inpute Hodnota nie je v požadovanom formate
$registerForm->addText('username')
->setAttribute('placeholder', 'Užívateľské meno')
->setAttribute('class', 'form-control')
->addRule(Form::MIN_LENGTH, 'Užívateľské meno musí obsahovať aspoň %d znaky', 4)
->addRule(Form::MAX_LENGTH, 'Užívateľské meno môže obsahovať max. %d znakov', 32)
->addRule(function($input) use($repository)
{
return !$repository->userexists($input->value);
}, 'Toto užívateľské meno je obsadené prosím vyberte si iné!')
->addRule(Form::PATTERN, 'Špeciálne znaky sú zakázané', '[a-zA-Z0-9]+');
Ostatné chyby to vypisuje v
$registerForm->addError($this->getMessage());
- saimons
- Člen | 293
Tahle validace je pomerne dobra, ale ne vzdy se hodi na vsechno co clovek potrebuje (napriklad ruzne hacky, carky atd.). Na mezinarodnim webu pouzivam pro validaci uzivatelkseho jmena toto:
namespace UserFormRules;
use Nette\Forms\IControl;
class FormRules {
const USERNAME = '\UserFormRules\FormRules::validateUsername';
/**
* Zvaliduje vlozene uzivatelske jmeno
* @param \Nette\Forms\IControl $control
* @return bool
*/
public static function validateUsername(IControl $control) {
return self::matchUsername($control->value);
}
/**
* Vyhleda znaky ktere nepatri do uzivatelskeho nazvu
* @param string $value
* @return bool
*/
private static function matchUsername($value) {
return !preg_match('/[^\p{L}\p{Nd}\p{Zs}\-\ ]/u', $value);
}
}
Formular
$form->addText('username', 'Username:')
->setRequired('Insert username.')
->addRule(UserFormRules\FormRules::USERNAME, 'Username can contain only letters, numbers, space and dash.');
Editoval saimons (30. 6. 2014 10:33)
- SontoEremo
- Člen | 341
@saimons
Tvoj kód mi nefunguje alebo, že by zle zadané cesty?
Môj RegisterForm.php
<?php
namespace App\Components;
use Nette\Application\UI\Form;
use Nette\Utils\Html;
use Nette\Security as NS;
use Nette\Mail\Message;
use Nette\Mail\SmtpMailer;
use Nette\Utils;
use Nette\Templating\FileTemplate;
use Nette\Latte\Engine;
use Nette\Templating\Helpers;
use App\Model\UserRepository;
use App\Model\UserManager;
use App\Components\FormRules;
class RegisterForm extends BaseControl {
public function render() {
$this->template->setFile(__DIR__ . '/registerForm.latte');
$this->template->render();
}
/** @persistent */
public $backlink = '';
protected $userRepository;
protected $userManager;
protected $formRules;
public function __construct(UserRepository $userRepository, UserManager $userManager) {
$this->userRepository = $userRepository;
$this->userManager = $userManager;
}
/**
* RegisterForm factory.
* @return Form
*/
protected function createComponentRegisterForm() {
$repository = $this->userRepository;
$registerForm = new Form();
$registerForm->addProtection();
$registerForm->addText('username')
->setAttribute('placeholder', 'Užívateľské meno')
->setAttribute('class', 'form-control')
->addRule(Form::MIN_LENGTH, 'Užívateľské meno musí obsahovať aspoň %d znaky', 4)
->addRule(Form::MAX_LENGTH, 'Užívateľské meno môže obsahovať max. %d znakov', 32)
->addRule(FormRules::USERNAME, 'Špeciálne znaky sú zakázané')
->addRule(function($input) use($repository) {
return !$repository->userexists($input->value);
}, 'Toto užívateľské meno je obsadené prosím vyberte si iné!');
$registerForm->addText('email')
->setAttribute('placeholder', 'Emailová adresa')
->setAttribute('class', 'form-control')
->addRule(Form::EMAIL, 'Zadajte prosím, platnú emailovú adresu!')
->addRule(function($input) use($repository){
return !$repository->usermailexists($input->value);
}, 'Táto emailová adresa je už v systéme zaregistrovaná!');
$registerForm->addPassword('password')
->setAttribute('placeholder', 'Heslo')
->setAttribute('class', 'form-control')
->addRule(Form::MIN_LENGTH, 'Heslo musí obsahovať aspoň %d znaky', 4)
->addRule(Form::MAX_LENGTH, 'Heslo môže obsahovať max. %d znakov', 32);
$registerForm->addPassword('confirm_password')
->setAttribute('placeholder', 'Potvrďe Heslo')
->setAttribute('class', 'form-control')
->addRule(Form::EQUAL, 'Zadané heslá nie sú zhodné!', $registerForm['password']);
$registerForm->addSubmit('signUp', 'Vytvoriť účet');
$registerForm->onSuccess[] = $this->success;
return $registerForm;
}
/**
* @param Form $registerForm
*/
public function success($registerForm) {
$values = $registerForm->getValues();
if ($values->password === $values->confirm_password){
$user = $this->userManager;
$token = Utils\Random::generate(32);
$userip = $_SERVER['REMOTE_ADDR'];
$user->add($values->username, $values->email, $values->password, $token, $userip);
$template = new FileTemplate(__DIR__ . '/Activate/email.latte');
$template->registerFilter(new Engine);
$template->registerHelperLoader('\Nette\Templating\Helpers::loader');
$template->user = $user;
$template->verifyLink = $this->presenter->link('//Sign:verify', array(
'token' => $token,
));
$mail = new Message;
$mail->setFrom('VistmoLabs <vistmolabs@vistmolabs.org>')
->addTo($values['email'])
->setSubject('Aktivácia účtu')
->setHtmlBody($template);
$mailer = new SmtpMailer(array(
'host' => 'smtp.vistmolabs.org',
'port' => 465,
'username' => 'vistmolabs@vistmolabs.org',
'password' => 'WS83ZYF6427g5G9',
'secure' => 'ssl',
));
$mailer->send($mail);
$this->presenter->flashMessage(Html::el('div')
->setHtml('Registrácia prebehla úspešne. Na zadanú Emailovú adresu <strong class="email-strong"><br>' . $values->email . '<br></strong> Vám bol zaslaný aktivačný link, po úspešnej aktivácii sa budete môcť prihlásiť.'));
$this->presenter->redirect('finish');
} else {
$registerForm->addError($this->getMessage());
}
}
}
A tvoj FormRules.php
<?php
namespace App\Components;
use Nette\Forms\IControl;
class FormRules {
const USERNAME = '\App\Components\FormRules::validateUsername';
/**
* Zvaliduje vlozene uzivatelske jmeno
* @param IControl $control
* @return bool
*/
public static function validateUsername(IControl $control) {
return self::matchUsername($control->value);
}
/**
* Vyhleda znaky ktere nepatri do uzivatelskeho nazvu
* @param string $value
* @return bool
*/
private static function matchUsername($value) {
return !preg_match('/[^\p{L}\p{Nd}\p{Zs}\-\ ]/u', $value);
}
}
Podotíkam, že obe sú v zložke App\Components\RegisterForm\…
Ale v zdrojovom kóde to ukáže
{"op":"\\App\\Components\\FormRules::validateUsername","msg":"Špeciálne znaky sú zakázané"}]
Editoval SontoEremo (30. 6. 2014 11:40)
- David Matějka
- Moderator | 6445
@SontoEremo:
Ako to, že pri odoslaní nevypíše chybu Špeciálne znaky sú zakázané ale vyhodí mi to v inpute Hodnota nie je v požadovanom formate
tu hlasku pravdepodobne vyhazuje html5 validace prohlizece. vypnes ji
nastavenim atributu novalidate="novalidate"
tomu formulari
Ale v zdrojovom kóde to ukáže
ano, to je v pripade custom validacnich pravidel spravne chovani. Pokud chces, aby dochazelo k validaci i v klientovi, musis si napsat to validacni pravidlo v JS. Ale je to zbytecne, protoze – viz nize
@saimons proc pouzivas vlastni validacni fci? Melo by stacit
$form->addRule(Form::PATTERN, 'Jméno není v požadovaném formátu', '[^\p{L}\p{Nd}\p{Zs}\-\ ]')
- SontoEremo
- Člen | 341
Díky všetkým @matej21 máš pravdu stačilo
$registerForm->getElementPrototype()->novalidate = 'novalidate';
a
->addRule(Form::PATTERN, 'Užívateľské meno môže obsahovať iba písmena a číslice', '[a-zA-Z0-9]+')
A všetko pekne funguje :)
- saimons
- Člen | 293
@matej21: Ted si uplne nejsem jist, ale zil jsem v domeni, ze je to
pak zavisle i na prohlizeci, ktery tento regulrani vyraz nemusi umet rozpoznat
a ze by s tim mohl byt problem?
@SontoEremo: Ten kod jsem vykopiroval z funkcniho projektu, takze by tam
problem byt nemel. Tvoje jednoducha validace je dostacujci, ale jen do te doby
nez zjistis, ze potrebujes, aby ti tam nekdo mohl napsat treba v Azbuce.
Editoval saimons (30. 6. 2014 14:34)