Znovupouzitelne formulare WEB/RPC/API
- skrivy
- Člen | 51
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?
- skrivy
- Člen | 51
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.
- Jiří Nápravník
- Člen | 710
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
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());
}