====== 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']) ?>
...
registerJS(<<
----
===== 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'],