MAX_LENGTH validace na serveru nefunguje

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

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="[{&quot;op&quot;:&quot;:filled&quot;,&quot;msg&quot;:&quot;Vložte prosím název.&quot;},{&quot;op&quot;:&quot;:maxLength&quot;,&quot;msg&quot;:&quot;Název je příliš dlouhý. Maximální délka je 50 znaků.&quot;,&quot;arg&quot;: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)

David Grudl
Nette Core | 8229
+
0
-

Na serveru se to myslím rovnou ořízne na požadovanou délku.

Franttaa
Člen | 1
+
0
-

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

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

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

David Grudl
Nette Core | 8229
+
0
-

Pak je to bug. Tedy pro TextArea, nikoliv pro TextInput.