vlastné validačné pravidlá
- account23
- Člen | 36
zdravím,
chcel by som si spraviť vlastnú validáciu na telefónne číslo ktorú by som mohol používať naprieč celou app, v každom formulári, ale akosi nemôžem prísť nato, ako to spraviť :)
našiel som takýto návod, ale vôbec to neni zrozumiteľné, alebo mi to iba nefunguje ..
https://doc.nette.org/…s/validation
postupoval som takto:
vytvoril som teda app/forms/MyFormRules.php
<?php
namespace App\Forms;
use Nette,
Nette\Application\UI\Form;
class MyFormRules {
const PHONE = 'MyFormRules::validatePhone';
public static function validatePhone(IControl $control) {
$pattern = '~^(\+421)? ?\d{3} ?\d{3} ?\d{3}$~';
if (preg_match($pattern, $control))
return true;
else
return false;
}
}
a chcel by som ho použiť v app/forms/RezervaciaFormFactory.php
<?php
namespace App\Forms;
use Nette,
Nette\Application\UI\Form;
class RezervaciaFormFactory extends Nette\Object {
/**
* @return Form
*/
public function create() {
$form = new Form;
$form->addText('meno', 'Meno a priezvisko:')->setAttribute('class', 'form-control')
->setRequired('Prosím zadajte Vaše meno a priezvisko.');
$form->addText('email', 'Email:')->setAttribute('class', 'form-control')
->addRule(Form::EMAIL, 'Váš email má neplatný tvar.')
->setRequired('Prosím zadajte Váš email.');
$form->addText('telefon', 'Telefón:')->addRule(MyFormRules::PHONE, 'brm')
->setAttribute('class', 'form-control')->setRequired('Prosím zadajte Váše telefónne číslo.');
$form->addText('zaciatok', 'Dátum príchodu:')->setAttribute('class', 'form-control')
->setRequired('Prosím uveďte dátum začiatku pobytu.');
$form->addText('koniec', 'Dátum odchodu:')->setAttribute('class', 'form-control')
->setRequired('Prosím uveďte dátum konca pobytu.');
$form->addTextArea('text', 'Správa:')->setAttribute('class', 'form-control')->setAttribute('rows', '4');
$form->addSubmit('rezervovat', 'Rezervovať')->setAttribute('class', 'btn btn-primary');
$form->onSuccess[] = array($this, 'formSucceeded');
return $form;
}
public function formSucceeded($form, $values) {
}
}
a vypíše mi to chybu Unknown validator ‚MyFormRules::validatePhone‘ for control ‚telefon‘. class to číta pretože keď zmením class tak mi to napíše že taka class neexistuje… čo robím zle ?
Nette verzia 2.3
Editoval account23 (23. 6. 2015 16:01)
- David Matějka
- Moderator | 6445
@newPOPE to je jedno, v tomhle kontextu se to nedokaze resolvnout – je to jen callback v retezci
- account23
- Člen | 36
ok super už to ide dík moc :)
akurát ešte taký jeden poznatok, v tej funkcii validatePhone() požadujem IControl podľa toho návodu, ale mne to vracia Textinput, presnejšie hlášku
Argument 1 passed to App\Forms\MyFormRules::validatePhone() must be an instance of App\Forms\IControl, instance of Nette\Forms\Controls\TextInput given
tak som to teda vyriešil takto
<?php
namespace App\Forms;
use Nette,
Nette\Application\UI\Form;
class MyFormRules {
const PHONE = 'App\Forms\MyFormRules::validatePhone';
public static function validatePhone($control) {
$pattern = '~^(\+421)? ?\d{3} ?\d{3} ?\d{3}$~';
if (preg_match($pattern, $control->getValue()))
return true;
else
return false;
}
}
len neviem či je to správne riešenie, ale fungovať to funguje :)
- David Matějka
- Moderator | 6445
tim IControl
je mysleno https://api.nette.org/…Control.html,
takze opravit NS…