====== 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 ... field($model, 'wplata', ['addon' => ['append' => ['content' => ' zł.']]])->textInput(['maxlength' => true, 'class' => 'coma']) ?> field($model, 'dofinansowanie', ['addon' => ['append' => ['content' => ' zł.']]])->textInput(['maxlength' => true, 'class' => 'coma']) ?> ... registerJS(<< ---- ===== Validacja pola checkbox (wymagane) ===== 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'],