vlastné validačné pravidlá

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

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

tu tridu mas v namespace, takze do ty konstanty PHONE ho musis uvest

newPOPE
Člen | 648
+
0
-

David Matějka napsal(a):

tu tridu mas v namespace, takze do ty konstanty PHONE ho musis uvest

Ako pozeram tak pozeram ale vidim tam ze su v spolocnom namespace.

David Matějka
Moderator | 6445
+
0
-

@newPOPE to je jedno, v tomhle kontextu se to nedokaze resolvnout – je to jen callback v retezci

newPOPE
Člen | 648
+
0
-

@DavidMatějka ej to mi nedoplo. Mas pravdu.

account23
Člen | 36
+
0
-

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

tim IControl je mysleno https://api.nette.org/…Control.html, takze opravit NS…