To jest stara wersja strony!
Spis treści
Walidacja
NIP
function isNipValid(string $nip): bool { $nip = preg_replace('/[\s-]/', '', $nip); if (preg_match('/^[0-9]{10}$/', $nip) !== 1) { return false; } $sum = 0; $weights = [6, 5, 7, 2, 3, 4, 5, 6, 7]; for ($i = 0; $i < 9; $i++) { $sum += $nip[$i] * $weights[$i]; } return $sum % 11 === (int) $nip[9]; }
Walidacja waluty
W modelu
poniższa reguła dopuszcza tylko liczby dodatnie z max 2 miejsca po przecinku
[['wplata', 'dofinansowanie'], 'match', 'pattern' => '/^\d+(\.\d{1,2})?$/'],
poniższa reguła dopuszcza liczby dodatnie i ujemne z max 2 miejsca po przecinku
[['wplata', 'dofinansowanie'], 'match', 'pattern' => '/^-?\d+(\.\d{1,2})?$/'],
Dodatkowo część całkowita od dziesiętnej powinna być oddzielona kropką. W formularzu należy dopisać kod JavaScript zamieniający przecinek na kropkę w locie
... <?= $form->field($model, 'wplata', ['addon' => ['append' => ['content' => ' zł.']]])->textInput(['maxlength' => true, 'class' => 'coma']) ?> <?= $form->field($model, 'dofinansowanie', ['addon' => ['append' => ['content' => ' zł.']]])->textInput(['maxlength' => true, 'class' => 'coma']) ?> ... <?php $this->registerJS(<<<JS $('.coma').on('keyup', function(e){ $(this).val($(this).val().replace(/[,]/g, '.')); }); JS);
Validacja pola checkbox (wymagane)
<?= $form->field($model, 'zgoda')->checkbox(['uncheck' => false]) ?>
Validacja przeciw atakom XSS
Metoda polega na filtrowaniu (validacji) atrybutów modelu
przed ich zapisaniem.
W modelu należy dodać funkcję:
public function beforeValidate() { foreach (array_keys($this->getAttributes()) as $attr) { if (!empty($this->$attr)) { $this->$attr = \yii\helpers\HtmlPurifier::process($this->$attr); } } return parent::beforeValidate(); }
HtmlPurifier to klasa, która usuwa z danych podejrzane fragmenty
Rejestracja użytkownika
Reguły walidacji podczas rejestracji użytkownika
public function rules() { return [ ['username', 'trim'], ['username', 'required', 'message' => 'Login jest wymagany'], ['username', 'unique', 'targetClass' => '\common\models\User', 'message' => 'Wpisany login jest już zajęty !'], ['username', 'string', 'min' => 2, 'max' => 255], ['email', 'trim'], ['email', 'required', 'message' => 'E-mail jest wymagany'], ['email', 'email','message' => 'Błędny adres e-mail'], ['email', 'string', 'max' => 255], ['email', 'unique', 'targetClass' => '\common\models\User', 'message' => 'Wpisany adres e-mail jest już używany w systemie'], ['password', 'required', 'message' => 'Musisz wpisać hasło'], ['password', 'string', 'min' => 8, 'message' => 'Hasło musi mieć minimum 8 znaków'], [['password'], 'match', 'pattern' => '/^.*(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).*$/', 'message' => 'Hasło musi zawierać, małą i dużą literę oraz cyfrę'], ['repassword', 'compare', 'compareAttribute'=>'password', 'skipOnEmpty' => false, 'message'=>"Hasło i Powtórz hasło nie są identyczne"], ['captcha', 'required'], ['captcha', 'captcha'] ]; }
Hasło
Walidacja hasła i powtórzenia hasła
public function rules() { return [ ... [['password'], 'match', 'pattern' => '/^.*(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).*$/', 'message' => 'Hasło musi zawierać, małą i dużą literę oraz cyfrę'], ['repassword', 'compare', 'compareAttribute'=>'password', 'skipOnEmpty' => false, 'message'=>"Hasło i Powtórz hasło nie są identyczne"], ... ]; }
Litera, cyfra, spacja, - _ . ,
Litera cyfra spacja, - _ . ,
/^[a-zA-Z0-9.,\-\/\s]+$/
+ polskie znaki
/^[a-zA-Z0-9ąćęłńóśźżĄĘŁŃÓŚŹŻ.,\-\/\s]+$/
Zastosowanie w modelu
public function rules() { return [ [['nazwa'], 'required'], [['nazwa'], 'string', 'max' => 10], [['nazwa'],'match','pattern'=>'/^[a-zA-Z0-9.,\-\/\s]+$/','message'=>'Niedozwolone znaki'], [['aktywne'], 'integer'], ]; }
Validacja - unikalne wartości pól
a1 ma być unikalne
['a1', 'unique']
a1 i a2 mają być unikalne razem (obydwa generują błąd)
[['a1', 'a2'], 'unique', 'targetAttribute' => ['a1', 'a2']]
Warunkowa reguła walidacji
Problem:
pole data w modelu jest wymagane lub nie w zależności od wartości pola typ
jeśli typ == 1 to data jest wymagana a dla innych wartości nie jest.
W modelu:
public function rules() { return [ ['data', 'required', 'when' => function($model) {return $model->typ == 1;}, 'enableClientValidation' => true ], ... ]
Validacja dat
Walidacja dat uwzględniająca format oraz kolejność dat od ⇐ do
W modelu:
public function rules(){ return [ ... [['data_od','data_do'], 'date', 'format' => 'php:Y-m-d'], ['data_do', 'compare', 'compareAttribute' => 'data_od', 'operator' => '>=', 'message' => 'Zła kolejność dat' ], ... ]
Unikalny login
Walidacja loginu pod względem jego unikalności
funkcja rules w modelu
['username', 'unique', 'message' => 'Ten login jest już zajęty'],
Walidacja hasła
długość min 8 max 16 znaków musi zawierać minimum
1 mała litera 1 duża litera 1 cyfra
W modelu funkcja rules
[['password'], 'string', 'length' => [8, 16]], [['password'], 'match', 'pattern' => '/^.*(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).*$/', 'message' => 'Hasło musi zawierać, małą i dużą literę oraz cyfrę'],
Walidacja numeru PESEL
function CheckPESEL($str) { //sprawdzamy czy ciąg ma 11 cyfr if (!preg_match('/^[0-9]{11}$/', $str)) { return false; } // tablica z wagami dla liczby kontrolnej $wagi = [1, 3, 7, 9, 1, 3, 7, 9, 1, 3, 1]; $sumaKT = 0; //Obliczamy sumę kontrolną for ($i = 0; $i < 11; $i++) { $sumaKT += $wagi[$i] * $str[$i]; } $reszta = $sumaKT % 10; if ($reszta == 0) { return true; } return false; }
Walidacja 11 cyfr
[['pesel'],'match','pattern'=>'/^[0-9]{11}$/','message'=>'Powinno być 11 cyfr'],