Submit s labelem '' (ne null) je vždy FALSE
- pidiclovek
- Člen | 91
Hola, objevil jsem zajímavou feature/bug :)
Nepodařilo se mi najít, kde v Nette se tomu tak děje, ale pokud mám následující formulářík a v něm tyto tři submity, liší se chováním (viz níže) a já nemohu najít logický důvod proč.
class ProductsSortingForm extends Form {
public function __construct($parent, $name,$productStores,$productCategories) {
parent::__construct($parent, $name);
$this->addSubmit('reset', 'Zrušit třídění');
$this->addSubmit('test', '');
$this->addSubmit('nic');
}
reset submit
funguje jak má, nic
submit má
nahrazený label textem „submit“ ale submit test vrací vždy!
FALSE, můžeme jím formulář odesílat třeba do halelůja, true tam
nikdy nebude. Proč? :)
Vždyť tohle je to první, co by člověka napadlo, pokud by chtěl udělat
button s obrázkem na pozadí a chtěl ho stylovat přes css, tedy nechtěl by
použít addImage
(o čemž si do teď myslím, že z názvu
metody nikdo nemůže na poprvé pochopit, co že to přidáváme… ).
Pokud jde o vlastnost, jaký to má důvod? Díky :)
EDIT:// S mezerou to jede, s prázdným stringem nikoliv. Což je divné :)
Editoval pidiclovek (4. 3. 2012 20:13)
- duke
- Člen | 650
Nejspíš je to tak proto, že pokud nenastavíš value, tak Nette nemá jak detekovat, že byl formulář odeslán právě tím tlačítkem. Myslím, že se to řeší tak, že value nastavíš a přes css zajistíš, aby nebyla vidět na samotném tlačítku, pokud nemá být vidět.
Pravdou je, že je to trochu WTF a pokud člověk nezná omezení html formulářů, tak ho toto nenapadne.
- pidiclovek
- Člen | 91
No že by to bylo takhle mě teda nenapadlo, nejdivnější mi na tom připadá, že by nette detekovalo submit button podle hodnoty value a ne id, či name. Už jen z toho důvodu, že pokud si vytvořím x submitů s rozlišnými name a jako $caption dám mezeru všem, nette je spolehlivě rozezná.
- duke
- Člen | 650
Tak jsem si schválně otestoval chování browserů pro odesílání
submitů (testoval jsem FF, Chrome, IE8 a IE6) a zdá se, že v nich lze
jednoznačně identifikovat použitý submit button i když má value
nastavenou na prázdný řetězec. Takže se přiznám, že je pro mě záhadou,
proč Nette trvá na tom, že musí být hodnota nastavena (ve skutečnosti by
v Nette nefungovalo ani value="0"
).
Může za to tento řádek v souboru Forms\Controls\SubmitButton.php:
if ($this->value = is_scalar($value) && (bool) $value) {
… konkrétně ta část „&& (bool) $value
“.
Takže buď je to bug, nebo feature kvůli kompatibilitě s bůhví čím.