Znovupouzitelne formulare WEB/RPC/API

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

Posledni dobou se trapim s vytvorenim RPC/API/vzdalenym volanim/nazyvejte si to jak chcete.

Na webu mam kazdy formular ve sve komponente, coz mi otevira moznost znovupoouzitelnosti. Libi se mi myslenka, ze vsechna validacni pravidla uz mam napsana a vlastne je na to vse pripravene. Avsak nedari se mi najit zatim zadnou rozumnou cestu, u ktere bych mel dobry pocit, jak toho vyuzit.

Zatim se mi povedlo najit, ze v mem novem RPCPresenteru bych si musel v action vytvorit novy request a znovu jej nechat zpracovat, stejne jako se to dela v unit testech.

Nejaky napad, jak docilit moznosti pouzivani jiz napsanych komponent na RPC?

akadlec
Člen | 1326
+
0
-

Mít validaci oddělenou od vizuálních komponent? Já třeba provádím ještě validaci na úrovní Entity kde mám také definováno která pole sou required a jejich datový typ, takže obecné vložení záznamu mohu provést i mimo form.

skrivy
Člen | 51
+
0
-

To mi prijde hloupe, protoze ta komponenta dela vse, co uz potrebuju – je tam definovano jakej vstup potrebuju, jak se ma zvalidovat a jak se ma zpracovat. To, ze to je formular je jen vizualni podoba te komponenty, takze mam porad tiky, ze by mela fungovat samostatne a mit pripadne vice tvari, pricemz formular muze byt jedna z nich.

Navic ORM nepouzivam, takze by mi to jeste vic zkomplikovalo zivot.

akadlec
Člen | 1326
+
0
-

tak si to musis rozseknout na vizualni a nevizualni cast? a pro api pouzit nevizualni co bude spolecna pro obe?

Jiří Nápravník
Člen | 710
+
0
-

Anebo trochu prasácky, naplnit formulář těmi daty co dostaneš, zavolat na to validate a vytáhnout si error messages.

Ale uhlednejsi a spravnejsi je urcite vizualni/nevizualni cast. Jen je skoda, ze Nette nemá form validatory oddělené a nepůjde to tak hezky propojit.

skrivy
Člen | 51
+
0
-

Tady je takove demo, jak jsem to vyresil. Jeste mi zbyva doresit nekolik problemu. Jednim z nich je, ze potrebuju dostat nejak navratovou hodnotu (napr. vytvorim uzivatele a potrebuju jeho id).

Dalsi problem je, ze tam jeste chybi dodelat onError a dalsi veci, ktere jsou v puvodnim fireEvents..

public function fireEvents($data = NULL) {
	// Standart call
	if ($data === NULL) return parent::fireEvents ();

	$this->setValues($data);
	$this->validate();

	if ($this->onSuccess) {
		if (! $this->isValid() || count($this->onSuccess) == 0) return;
		if (count($this->onSuccess) > 1) trigger_error('Only first onSuccess method will be called, because we need to read return value.');
		$handler = array_shift($this->onSuccess);
		$params = \Nette\Utils\Callback::toReflection($handler)->getParameters();
		$values = isset($params[1]) ? $this->getValues($params[1]->isArray()) : NULL;
		return \Nette\Utils\Callback::invoke($handler, $this, $values);
	}
}

Volam to takto:

public function actionDefault($name = '') {
	$data = array('name' => $name);
	$form = $this['rpcForm'];
	dump($form->fireEvents($data));
	dump($form->hasError());
}