FormControl::__toString()

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

Zdravím,
momentálně poměrně často pracuji s formuláři ve spojení s vlastní validací přes callbacky na model (pro představu například zda není email registrován). Nyní to řeším v příslušné validační metodě takto:

$email = $email instanceof FormControl ? $email->getValue() : $email;

a následně použiji v dibi.

je ale celkem otrava psát to několikrát v různých metodách, proto bych rád navrhl přidání metody __toString() pod FormControl, která by vracela hodnotu:

public function __toString()
{
	return $this->getValue();
}

Šlo by to? ;)

Editoval Majkl578 (9. 10. 2009 8:49)

sodae
Nette Evangelist | 250
+
0
-

__toString by se spíše hodil pro rendrovani controlu a ne pro jeho obsah ;-)

Honza Kuchař
Člen | 1662
+
0
-

tak tohle je dilema. Obsah x render. popravde jsem spise pro ten value. a to protoze renderovat label nebo control? tohle by mel podle me mit na starost az render.

DocX
Člen | 154
+
0
-

Tak vždycyk si můžeš udělat něco jako

<?php

class Tools
{
	function GetString($object)
	{
		return $object instanceof FormControl ? $object->getValue() : $object;
	}
}

?>

a pak volat jen Tools::GetString($email) ;)

Otázka je, jestli je to zlechčení práce :D Ale pokud bys to potřeboval u více různých objektů, můžeš funkci rozšířit o rozpoznávání toho, o co jde a pak už by to asi práci usnadnilo :)

PetrP
Člen | 587
+
0
-

A nevadilo by ze musí vrátit string, tedy nemuze null ani bool?

Jinak jsem asi pro.

Honza Kuchař
Člen | 1662
+
0
-

Jo to je pravda, ale zpět k tomu __toString().

Teď jsem nad tím přemýšlel, ale __toString() by stejně nepomohlo. Říkal jsem si, že by to zkrátilo zápis v nových formulářích.

if($form["neco"]->value === "test") {
	// Bla bla bla
}
// na
if($form["neco"] === "test") { // Ale to je blbost, protože to by srovnalo ten původní objekt
	// Bla bla bla
}
// a tohle by mělo velký wtf faktor (a mimochodem by to nic neulehčilo):
if((string)$form["neco"] === "test") {
	// Bla bla bla
}

Tzn. vracet value je opravdu blbost. Renderovat control?

kravčo
Člen | 721
+
0
-

Podľa mňa je jediné čo dáva zmysel renderovanie. Tak ako používame echo $form, v podobnom duchu by mali fungovať i prvky, t.j. echo $form['date']. Avšak volanie echo $form znamená zhruba:

try {
    echo $form->renderer->render($form);
} catch (Exception $e) {
    echo '';
}

Ak by sme chceli zaviesť takúto funkcionalitu i na úrovni prvku (ja osobne si myslím, že nie je potrebná), znamenalo by to potrebu rozhrania IFormControlRenderer + ďalších vecí. Už dávnejšie David naznačil, že napr. taký ConventionalRenderer – akokoľvek je dobrý – nedokáže poňať rôzne požiadavky každého z nás a zrejme časom umrie v prospech 20 riadkov kódu.