Může callback vracet zpracovaná data?

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Tomáš Votruba
Moderator | 1114
+
0
-

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

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

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

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

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íčů.

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

@Morlok: Jaj, to mě teda mohlo napadnout :). Díky moc, hodně jsi mi pomohl.

jtousek
Člen | 951
+
0
-

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;
	}

}