Vlastne validacne pravidlo pre datumovnik

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

Ahojte, vztvoril som si vlastne pravidlo na zadanie datumu vacsieho ako dnesny, ale nefunguje mi javascript. Ked pouzijem napriklad:

->addRule(self::INTEGER, 'Váha musí byť číslo')

Cela validacia prebehne vporiadku aj s alertom, ale pri vlastnom mi len vytvori

<span class='error'>message...</span>

Neviete v com by mohol byt problem? Preco pri vlastnom pravidle mi nevybehne alert okno?

$this->addText('weight', 'Váha (kg)')
	->addRule(self::INTEGER, 'Váha musí byť číslo')
	->addRule(self::RANGE, 'Váha musí byť od 1 do 1000', array(1, 1000))
	->setRequired();
$this->addDate('date', 'Dátum doručenia')
	->addRule(function($item) {
		if ($item->value > new DateTime())
		{
			return true;
		}
		return false;
		}, 'Zadali ste nevalidný dátum')
		->setRequired();
David Matějka
Moderator | 6445
+
+1
-

jelikoz ta validacni funkce nema v JS ekvivalentni validator. A s closurou to nepujde, musi to byt funkce nebo staticka metoda. Mrkni do doc: https://doc.nette.org/cs/forms#…

Juraj_
Člen | 22
+
0
-

Postupoval som podla tohoto(https://doc.nette.org/…s/validation), ale hadze mi to:

Unknown validator ‚ProductFormRules::validateDate‘ for control ‚date‘.

Nemas prosimta nejaku ukazku podla ktorej by som si to spojazdnil? Dakujem

David Matějka
Moderator | 6445
+
0
-

nemas tu tridu ProductFormRules v nejakem namespace?

Juraj_
Člen | 22
+
0
-

Nie hodil som ju do formu:

<?php

namespace FrontModule\Forms;

use FRI\Application\UI\Form,
	\Nette\Utils\DateTime;

final class ProductForm extends Form
{
	const PRIORITY = array(
	    1 => '1',
	    2 => '2',
	    3 => '3',
	    4 => '4',
	    5 => '5',
	);

	private $cities;

	public function __construct($cities)
	{
		parent::__construct();

		$this->cities = $cities;
	}

	/**
	 * @param Nette\Application\UI\Presenter $presenter
	 */
	protected function configure(\Nette\Application\UI\Presenter $presenter)
	{
		parent::configure($presenter);

		$this->addText('name', 'Názov produktu')
			->setRequired();
		$this->addText('amount', 'Počet')
			->addRule(self::INTEGER, 'Počet musí byť číslo')
			->addRule(self::RANGE, 'Počet musí byť od 1 do 1000000', array(1, 1000000))
			->setRequired();
		$this->addText('size', 'Veľkosť (m³)')
			->addRule(self::INTEGER, 'Veľkosť musí byť číslo')
			->addRule(self::RANGE, 'Veľkosť musí byť od 1 do 100', array(1, 100))
			->setRequired();
		$this->addText('weight', 'Váha (kg)')
			->addRule(self::INTEGER, 'Váha musí byť číslo')
			->addRule(self::RANGE, 'Váha musí byť od 1 do 1000', array(1, 1000))
			->setRequired();
		$this->addDate('date', 'Dátum doručenia')
			->addRule(ProductFormRules::DATE, 'Zadali ste nevalidný dátum')
			->setRequired();
		$this->addSelect('from', 'Doručenie z mesta')
			->setItems($this->cities)
			->setRequired();
		$this->addSelect('to', 'Doručenie do mesta')
			->setItems($this->cities)
			->setRequired();
		$this->addSelect('priority', 'Priorita', self::PRIORITY)
			->setPrompt('Vyberte prosím')
			->setRequired();
		$this->addTextArea('info', 'Informácie o produkte');
	}

}
class ProductFormRules
{
    const DATE = 'ProductFormRules::validateDate';

    public static function validateDate(IControl $control)
    {
		dump($control);die();
    }
}
Aurielle
Člen | 1281
+
+1
-

Deklarace namespace na začátku souboru je globální, v tom je chyba.

Juraj_
Člen | 22
+
0
-

Vytvoril som si v Admin/Forms novu triedu:

use Nette\Utils\DateTime;

class ProductFormRules
{
	const DATE = 'ProductFormRules::validateDate';

    public static function validateDate($form)
    {
		if($form->value > new DateTime()) return true;
		return false;
    }
}

kontrola mi vsak funguje rovnako, nevybehne javascript, ale sa mi len pod polickom zobrazi

<span class="error"> Zadali ste nevalidný dátum </span>

pritom som do netteForms.js pridal

Nette.validators.ProductFormRules_validateDate = function (elem, arg, value) {
    alert('asd');
};

Ako by sa mal nazvat validator? Podla navodu si myslim ze to mam spravne…