MAX_LENGTH validace na serveru nefunguje
- Franntaa
- Člen | 1
Zdravím, mám problém se serverovou validací vstupu.
Tato metoda mi vygeneruje jednoduchý formulář:
protected function createComponentEditSettingsForm() {
$form = new Form;
$form->addText('name', 'Název:', 50)
->setRequired('Vložte prosím název.')
->addRule(Form::MAX_LENGTH, 'Název je příliš dlouhý. Maximální délka je %d znaků.', 50);
$form->addSubmit('save', 'Uložit nastavení')
->setAttribute('class', 'save_article')
->onClick[] = $this->saveSettings;
$form->addProtection();
return $form;
}
Vytvoří se tento formulář:
<form action="/www/settings/?do=editSettingsForm-submit" method="post" id="frm-editSettingsForm" novalidate="true">
<table>
<tbody>
<tr class="required">
<th>
<label class="required" for="frm-editSettingsForm-name">Název:</label>
</th>
<td>
<input type="text" name="name" maxlength="50" size="50" class="text" id="frm-editSettingsForm-name" required="" data-nette-rules="[{"op":":filled","msg":"Vložte prosím název."},{"op":":maxLength","msg":"Název je příliš dlouhý. Maximální délka je 50 znaků.","arg":50}]" value="123">
</td>
</tr>
<tr>
<th></th>
<td>
<input type="submit" name="save" class="save_article button" id="frm-editSettingsForm-save" value="Uložit nastavení">
</td>
</tr>
</tbody>
</table>
<div>
<input type="hidden" name="_token_" id="frm-editSettingsForm-_token_" value="token :)">
<!--[if IE]><input type=IEbug disabled style="display:none"><![endif]-->
</div>
</form>
V tuto chvíli funguje validace na straně klienta. Pokud však u inputu odstraním data-nette-rules a maxlength atributy (ve vývojářských nástrojích), tak přestane tato validace podle očekávání fungovat.
<input type="text" name="name" size="50" class="text" id="frm-editSettingsForm-name" required="" value="123">
Když pak do inputu nacpu (normálně napíšu na klávesnici, žádná schránka apod.) hodně dlouhý text a odešlu formulář, zavolá se metoda saveSettings. K tomu by ale podle dokumentace nemělo dojít: „Handlery událostí onSuccess a onClick se volají pouze v případě, že je odeslání validní. Uvnitř obslužných metod tedy nemusíme validitu ověřovat.“ (viz https://doc.nette.org/cs/forms#…).
Podobným způsobem jsem zkoušel i required a MIN_LENGTH pravidla a validace na serveru proběhla, metoda se nezavolala a vedle inputu se zobrazilo chybové hlášení.
Jak tedy zprovoznit validaci na maximální délku řetězce na straně serveru?
_________________________
Edit 19.2. 19:30: mám ještě jeden starší projekt (verze Nette
2.0.10), kde mám podobnou validaci také, ale serverová validace na MAX_LENGTH
funguje. Zkusil jsem ten projekt spustit s novou verzí Nette (2.1.1 – na
té běží i můj nyní vytvářený projekt). Bylo nutné v modelu opravit
třídu pro zápis do databáze z Nette\Database\Connection na
Nette\Database\Context a vše šlo. Po odstranění validace u klienta jsem
zkusil odeslat dlouhý řetězec a on prošel (samozřejmě se do databáze
uložil oříznutý).
Pokud jsem u nový projekt zkusil spustit na verzi 2.0.10, tak u něho
serverová validace MAX_LENGTH zafungovala.
Editoval Franntaa (19. 2. 2014 19:31)
- Franttaa
- Člen | 1
Ano, skutečně do metody obsluhující vstup z formuláře přijde text
oříznutý. Přijde mi to ale takové nefér vůči uživateli, že jeho text
nad povolený limit je ztracen a on nemá možnost s tím nic udělat.
Samozřejmě, že uživatelů s vypnutým javascriptem moc není, ale najdou se
tací. Pokud se jedná o krátký vstup (řekněme do 30–50 znaků), tak
není problém na to upozornit a nechat uživatele si to spočítat, ale pokud
se jedná o text, který může mít tisíce znaků (jedno z mých použití),
tak je něco takového nereálné.
Navíc proč když něco takového fungovalo ve starší verzi, nyní
nefunguje?
Samozřejmě není problém si tuto kontrolu napsat sám a uživatele upozornit,
ale proč to dělat, když by to mohlo dělat Nette?
- David Grudl
- Nette Core | 8229
Řekl bych, že uživatelé si běžně neodstraňují pomocí vývojářských nástrojů atribut maxlength. Pro textareu by měla serverová validace normálně fungovat.
- xificurk
- Člen | 121
David Grudl: Nefunguje, protože to ořezání se provádí v TextBase, od
kterého TextArea dědí:
https://github.com/…TextBase.php#L58