Kde je chyba? (Form::MAX_LENGTH)

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

Ahoj,
snažím se omezit délku nového hesla v administraci mého systému na 25 znaků a to takto:

<?php
//...
$change_password_form->addPassword('password', 'Nové heslo:', 30)->addRule(Form::FILLED,
                'Heslo musí být vyplněné')->addRule(Form::MAX_LENGTH,
                'Heslo může mít nanejvýš %d znaků', 25)->setHtmlId('password');
//...
?>

Problém je ten, že při vložení delšího hesla se nevypíše při zpracování formuláře chybová zpráva, ale formulář se zpracuje a heslo se násilně osekne na 25 znaků. To je samozřejmě špatně. Nevíte někdo, kde je chyba? Díky

Etch
Člen | 403
+
0
-

co myslíš tím „vložením delšího hesla“?? Jestli myslíš to, že když tam nakopíruješ heslo ze schránky a to heslo má 30 znaků tak se ti ořízne na 25 tak to je způsobeno tím že Form::MAX_LENGTH ti přidá atribut maxlength="25" můžeš to obejít třeba takto ( předem upozorňuji, že jde tak trochu o prasárnu )

$change_password_form->addPassword('password', 'Nové heslo:', 30)->addRule(Form::FILLED,
                'Heslo musí být vyplněné')->addRule(Form::MAX_LENGTH,
                'Heslo může mít nanejvýš %d znaků', 25)->setHtmlId('password');
$change_password_form['password']->getControlPrototype()->maxlength(100);

//EDIT : Typo

Editoval Etch (23. 8. 2009 16:39)

ReshNesh
Člen | 4
+
0
-

Díky. No myslel jsem tím vložením ze schránky. Ono ale i při pouhém psaní není jasné, jestli se další znaky do inputu vkládají nebo ne, pokud je jich víc než se do inputu vleze. Pokud tak uživatel vloží dlouhé heslo, to se mu bez varování osekne a on se příště nepřihlásí…

Tvůj nápad funguje do té míry, že delší text jde vložit, ale tím to končí. Validace na délku 25 je tím pádem v pytli. No mně jde o to, že jsem si myslel, že přidání podmínky do validace bude opravdu nějak kontrolovat délku pole. Jediná věc, co se děje, je ale jenom přidání atributu maxlength k poli. Tím pádem se ale dá obejít validace formuláře tím, že se pošle přímý požadavek na adresu zpracovávajícího skriptu (u GETu jednoduše, u POSTu třeba pomocí nějakého doplňku do prohlížeče).

Asi to nechám, jak to bylo, a zobrazím uživateli jeho nové heslo ve flashmessage, pokud nepřijdu na lepší řešení.

Jenom tak pro ze zvědavosti se ještě zeptám, jakým způsobem se dá tedy dosáhnout zobrazení chybové zprávy u validačního pravidla Form::MAX_LENGTH?

ReshNesh
Člen | 4
+
0
-

Tak jsem si lehce přiohnul Nette k obrazu svému a funguje to tak, jak jsem chtěl. Následující povolí uživateli vložit jakkoli dlouhé heslo a pokud to bude delší než 25 znaků, tak se při validaci vypíše zpráva: „Nové heslo může mít nanejvýš 25 znaků“.

<?php
//...
$change_password_form->addPassword('password', 'Nové heslo:', 30)->addRule(Form::FILLED,
                'Nové heslo musí být vyplněné')->addRule(Form::PROPER_MAX_LENGTH,
                'Nové heslo může mít nanejvýš %d znaků', 25)->setHtmlId('password');
//...
?>

Pro stejnou funkčnost stačí vložit

<?php
const PROPER_MAX_LENGTH = ':properMaxLength';
?>

do souboru Nette/Forms/Form.php

a

<?php
public static function validateProperMaxLength(TextBase $control, $length) {
            return self::validateMaxLength($control, $length);
}
?>

do Nette/Forms/Controls/TextBase.php

Etch
Člen | 403
+
0
-

ReshNesh napsal(a):
Tvůj nápad funguje do té míry, že delší text jde vložit, ale tím to končí. Validace na délku 25 je tím pádem v pytli.

No teda nevim jak u tebe, ale u mě to validuje délku i když tam nastavíš ten maxlength tak jak sem psal výše.

ReshNesh
Člen | 4
+
0
-

Tak jsem to znovu zkusil a šlo to i s tím ručním nastavením maxlength. Zajímavý, že předtím, kdy jsem to zkoušel, se tomu moc nechtělo. Teď to jde. Tak díky.