Kde je chyba? (Form::MAX_LENGTH)
- ReshNesh
- Člen | 4
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
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
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
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