Submit s labelem '' (ne null) je vždy FALSE

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

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

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

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

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.

David Grudl
Nette Core | 8228
+
0
-

fixed