Může callback vracet zpracovaná data?
- Tomáš Votruba
- Moderator | 1114
Chci mít možnost do vlastního formuláře přidat callback, který by předzpracoval data k vložení. Nějak takto:
// při použití formuláře
protected function createComponentMyForm()
{
$form = new myForm();
// ...
$form->onProcessValues[] = callback($this, "processValuesAnotherWay");
return $form;
}
// ona pomocná funkce
public function processValuesAnotherWay($values)
{
unset($values["password2"]);
$values["register_date"] = date("Y-m-d");
// etc.
return $values;
}
Třída s formulářem:
public function process($form)
{
$values = $form->getValues(TRUE);
if ($this->onProcessValues) {
$values = $this->onProcessValues($values);
// vrací null
// možné řešení je použít $this->onProcessValues jako string požadované funkce
$values = $this->parent->{$this->onProcessValues}($values);
// ale to mi přijde blbé
}
}
Díky za nasměrovaní.
- Vojtěch Dobeš
- Gold Partner | 1316
Myslím, že to možné není: https://api.nette.org/…xin.php.html#58
Ale proč to vůbec chceš takto řešit? Nestačí metoda, který by byla přímo zavolána?
- Morlok
- Člen | 26
spravit to mozes takto:
<?php
// registracia callbacku
$form->onProcessValues = callback($this, "processValuesAnotherWay");
// vo formulari
if($this->onProcessValues) {
$values = $this->onProcessValues->invokeArgs($values);
}
?>
Jasne ze callback moze vracat hodnoty, ale ked ho pouzijes ako „listener“ (registrovane cez onProcessValues[]), tak zavolanie onProcessValues() ti vracia NULL
Editoval Morlok (14. 6. 2012 15:08)
- Tomáš Votruba
- Moderator | 1114
vojtech.dobes napsal(a):
Myslím, že to možné není: https://api.nette.org/…xin.php.html#58
Ale proč to vůbec chceš takto řešit? Nestačí metoda, který by byla přímo zavolána?
Stačí, jen chci mít možnost tu metodu nastavit/nenastavit (tedy použít defaultní zpracování formulářem).
Morlok napsal(a):
spravit to mozes takto:
<?php // registracia callbacku $form->onProcessValues = callback($this, "processValuesAnotherWay"); // vo formulari if($this->onProcessValues) { $values = $this->onProcessValues->invokeArgs($values); } ?>
Jasne ze callback moze vracat hodnoty, ale ked ho pouzijes ako „listener“ (registrovane cez onProcessValues[]), tak zavolanie onProcessValues() ti vracia NULL
Vypadá to dobře. InvokeArgs mi nicméně předá jen první hodnotu z pole
$values
. Zkusil jsem func_get_args
, ale ta mi vezme
hodnoty bez klíčů.
- Morlok
- Člen | 26
Vypadá to dobře. InvokeArgs mi nicméně předá jen první hodnotu z pole
$values
. Zkusil jsemfunc_get_args
, ale ta mi vezme hodnoty bez klíčů.
Jo to je mozne, treba to zabalit do pola, cize takto:
<?php
$values = $this->onProcessValues->invokeArgs(array($values));
?>
ono to vlastne tebe predalo tie values ako parametre do funkcie, cize
spravilo toto:
funkce($value1, $value2…), lebo do invokeArgs sa dava pole
„parametrov“ callbacku.
Editoval Morlok (14. 6. 2012 20:33)
- Tomáš Votruba
- Moderator | 1114
@Morlok: Jaj, to mě teda mohlo napadnout :). Díky moc, hodně jsi mi pomohl.
- jtousek
- Člen | 951
Připadá mi špatně prefixovat to tím „on“, protože se vlastně nejedná o událost tak jak je chápe Nette\Object, ale pouze o callback. Vyřešil jsem to takto:
class BaseForm extends Form
{
/** @var callable */
protected $processor;
public function getProcessedValues()
{
if (is_callable($this->processor)) {
return call_user_func($this->processor, $this->getValues());
}
return $this->getValues();
}
/**
* @param callable $processor
* @return BaseForm
*/
public function setProcessor($processor)
{
$this->processor = $processor;
return $this;
}
/**
* @return callable
*/
public function getProcessor()
{
return $this->processor;
}
}