Ako zakázať znaky vo formulári pri registrácii

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

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
+
+1
-

Regulárem:

->addRule(Form::PATTERN, 'uživatelské jméno nesmí obsahovat divné znaky', '[a-zA-Z0-9]+');
SontoEremo
Člen | 341
+
0
-

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
+
0
-

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
+
0
-
->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
+
0
-

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
+
0
-

@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
+
0
-

@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
+
0
-

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
+
0
-

@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)