Automaticky dělat trim a vyházet white space znaky z čísel
- Petr Motejlek
- Člen | 293
Ahoj,
chtěl bych se zeptat, zda-li současný stav Nette\Forms počítá například
s tím, že uživatel do fomulářového input boxu napíše do pole pro
číslo (AppForm::FLOAT, AppForm::INTEGER) řetězec ve tvaru „1 500“ (bez
uvozovek samozřejmě)? Co jsem zkoušel, tak to vyhodí chybu, že input box
není číslo. Mě by docela zajímalo, zda-li by bylo možné to chování
trošku pozměnit a to tak, aby jak validace na straně PHP, tak v klientském
JavaScriptu automaticky trimovala a vymazávala všechny whitespace znaky ze
zadaného řetězce, který má být číslo?
Použití: např. chci po někom telefonní číslo, nebo jen jeho část, řekněmě, že ho nechám v selectboxu vybrat předvolbu jeho země a pak ho nechám vyplnit do input boxu zbytek toho jeho telefonního čísla (můžu ten inputbox třeba omezit podle nejdelšího tel. čísla, se kterým jsem se setkal, na tom nesejde) — myslím, že dost lidí napadne tam vepsat zbytek toho telefonního čísla ve tvaru XXX XXX XXX (protože to třeba odněkud kopírují, nebo jen slepě přepisují a ty mezery se jim tam prostě vloudily). V takovou chvíli jim validace jak na straně serveru, tak na straně klienta, zaječí, že jsou hloupí, že nezadali číšlo. Ten stejný problém se vyskytne i např. u jiných služeb, kde je identifikátorem člověka nějaké číslo (např. ICQ, apod.).
Šlo by tohle nějak do Nette\Forms dostat? Nemusí to být aktivované pro všechny inputy, někomu se to třeba nemusí hodit; stačí, když se to bude aktivovat nějakou metodou nad inputem, u kterého chci trimování a mazání whitespace znaků dělat automaticky.
P. S. : Pokud už tam něco takového je, omlouvám se, a očekávám výsměch :).
EDIT: Zkoušel jsem to ještě jednou a zdá se, že trim se dělá, ale vyházení těch whitespace znaků se bohužel neděje :(.
Editoval m0t3jl (21. 7. 2009 23:14)
- Patrik Votoček
- Člen | 2221
Jsem pro…
Mimochodem (je pokročilejši noční hodina tak prosím nekamenovat) je
pomlčka/spojovník taky whitespace (např. ICQ). Ale dělal bych to
s nějákým zapínátkem nebo napsat si na to vlastní validátor
((My)Form::WSFLOAT / (My)Form::WSNUMBER)
- Petr Motejlek
- Člen | 293
vrtak-cz napsal(a):
Jsem pro…
Mimochodem (je pokročilejši noční hodina tak prosím nekamenovat) je pomlčka/spojovník taky whitespace (např. ICQ). Ale dělal bych to s nějákým zapínátkem nebo napsat si na to vlastní validátor ((My)Form::WSFLOAT / (My)Form::WSNUMBER)
Super, na to jsem si vůbec nevzpomněl. Myslím, že by to klidně mohlo vyhazovat jak běžné white space (mezera, atd.) i ty ‐, – a —. Je fakt, že zrovna u toho ICQ se to používá. Mě osobně by taky nevadilo, kdyby se vyhazovaly tyhle paznaky.
Docela to i vypadá, že by se hodilo, kdyby Nette\Forms měli možnost nastavení předzpracování argumentů (v našem případě trim, whitespace znaků, ‐, – a — ;).
Třeba rozhýbeme Davida, aby v tomto podnikl nějaké kroky :D
Editoval m0t3jl (22. 7. 2009 9:33)
- Petr Motejlek
- Člen | 293
PetrP napsal(a):
Jsem pro, napadá mě ještě tecky mezi tisíci
1.000.000
a co římské čísla?
To je otázka ;). Co je potom takové číslo typu 1.000 ? Je to jeden tisíc, nebo to je jedna celá nula nula nula :D. Původně me to nenapadlo, ale docela by to chtělo, aby Nette\Forms zohledňoval nastavené locales při detekci čísel: tzn. neměl by např. Čechovi dovolit vstup pro číslo ve formě „1,000.2“ (což je pro en správně jeden tisíc a dvě desetiny), a zároveň Angličanovi by neměl dovolit vstup pro číslo ve formě „1 000,2“ (což je por cs správně jedna a dvě desetiny).
Zajímavá myšlenka, teď je na čase implementace :D. Myslím ale, že by se to docela hodilo.
- PetrP
- Člen | 587
m0t3jl napsal(a):
To je otázka ;). Co je potom takové číslo typu 1.000 ? Je to jeden tisíc, nebo to je jedna celá nula nula nula :D.
V případě že Form::INTEGER tak je to tisic.
U Form::FLOAT to asi musi bejt 1
ale 1.000.000
uz je milion
a 1.000,50
je taky čitelné
Původně me to nenapadlo, ale docela by to chtělo, aby Nette\Forms zohledňoval nastavené locales při detekci čísel: tzn. neměl by např. Čechovi dovolit vstup pro číslo ve formě „1,000.2“ (což je pro en správně jeden tisíc a dvě desetiny), a zároveň Angličanovi by neměl dovolit vstup pro číslo ve formě „1 000,2“ (což je por cs správně jedna a dvě desetiny).
David se snaží vyhnout zohledňování jazyků, takže by to asi neprošlo.
Ono spíš to vydím, že až přijde davit tak celou tuhle diskuzi utne dvěma slovama. ;]
- Petr Motejlek
- Člen | 293
PetrP napsal(a):
m0t3jl napsal(a):
To je otázka ;). Co je potom takové číslo typu 1.000 ? Je to jeden tisíc, nebo to je jedna celá nula nula nula :D.
V případě že Form::INTEGER tak je to tisic.
U Form::FLOAT to asi musi bejt
1
ale1.000.000
uz je milion
a1.000,50
je taky čitelnéPůvodně me to nenapadlo, ale docela by to chtělo, aby Nette\Forms zohledňoval nastavené locales při detekci čísel: tzn. neměl by např. Čechovi dovolit vstup pro číslo ve formě „1,000.2“ (což je pro en správně jeden tisíc a dvě desetiny), a zároveň Angličanovi by neměl dovolit vstup pro číslo ve formě „1 000,2“ (což je por cs správně jedna a dvě desetiny).
David se snaží vyhnout zohledňování jazyků, takže by to asi neprošlo.
Ono spíš to vydím, že až přijde davit tak celou tuhle diskuzi utne dvěma slovama. ;]
Proč by to u Form::FLOAT MUSELA být 1? Form::FLOAT pouze říká, že číslo má i desetinnou část. Myslím, že zrovna u tohoto je zohledňování prostředí NUTNOST. Pokud si někdo nastaví v prohlížeči, nebo někde na úrovni aplikace, že vstup a výstup chce pokud možno v cs_CZ, tak mu musím umožnit psát česky formátovaná čísla a zároveň ho musím pokárat za paskvily typu 1,002.1 — to přece není česky a nikdo to za český tvar čísla nemůže chtít prohlásit. Pro anglický text platí to samé — tam přeci nemůže být správně napsat 1 002,1 a předpokládát, že to stroj na druhé straně správně vyhodnotí jako anglické číslo ;).
- jasir
- Člen | 746
Já jsem se o něco podobného pokoušel, ale pak se mi to moc nelíbilo. Nakonec jsem šel cestou validace a manuální úpravy vstupů / výstupů při vytváření / onSubmit.
- h4kuna
- Backer | 740
Zdravim nez jsem poznal nette mel jsem napsany vlastni form script a moje koncepce byla:
1)rozdeleni zakladnich datovych typu coz v nette taky najdem
* string
* int
* float
* bool
* files
* date
* datetime
* time
2)validacni prvky
* obligate (povinne)
* text =array(neformatovany, bez html, pouze znaky abecedy, abeceda +
cisla, abeceda + mezera, abeceda + mezera + cisla)
* psc
* icq (udrztuje format xxx-xxx-xxx)
* telephone (udrztuje format xxx-xxx-xxx)
* min (minimalni poce znaku)
* max
* ucfirst
* text2int (pomoci regularu odstrani vse mimo cislic) treba pro telefon nebo pcs
a pak to formatuje viz vyse
* email
* datum
3)toto jsou veci ktere najdete ve vetsine formularu a abych to nemusel
pokazdy kombinovat tak mam skupiny validacnich prvku
‚name‘ =>array(typ=>‚string‘, min=>2,
max=>30, small=>1, ucfirst=>1, text=>2) prijmeni je stejny
jako jmeno na validaci, rika typ string, minimalne 2 znaky, maximalne 30, prvni
si sam upravi na velke, pouze znaky abecedy
‚town‘ =>array(typ=>‚string‘, min=>2,
max=>50, ucfirst=>1, text=>1),
‚street‘ =>array(typ=>‚string‘, min=>2,
max=>50, ucfirst=>1, text=>3),//spolecnost stejny jako ulice
‚psc‘ =>array(typ=>‚int‘, min=>5, max=>5,
text2int=>1, psc=>1),
‚icq‘ =>array(typ=>‚int‘, min=>7, max=>9,
text2int=>1, icq=>1),
‚telefon‘ =>array(typ=>‚int‘, min=>9,
max=>12,text2int=>1, telefon=>1),
‚nick‘ =>array(typ=>‚string‘, min=>4,
max=>25, text=>3),
‚skype‘ =>array(typ=>‚string‘, min=>6,
max=>25, text=>3),
‚password‘ =>array(typ=>‚string‘, min=>6,
max=>20, text=>4),
‚email‘ =>array(typ=>‚string‘, min=>6,
max=>100, small=>1, email=>1),
‚text‘ =>array(typ=>‚string‘, min=>1,
textSpecial=>1),
Myslim si ze by bylo dobry udelat nejaky takovyto skupiny pro nette
<?php
$form->addText('jmeno')->validace('name');//proste se jenom odkazovat na bod 3)
$form->addText('prijmeni')->validace('name');
?>
a tim by bylo hotovo
Podotykam ze jsem 3) bod zkopiroval z kodu a body 1) a 2) opsal tudiz nemusi uplne sedet indexy mimo ‚name‘ jinak myslenka by mela byt zachycena.
Editoval matata (22. 7. 2009 13:08)
- Petr Motejlek
- Člen | 293
matata napsal(a):
Zdravim nez jsem poznal nette mel jsem napsany vlastni form script a moje koncepce byla:
1)rozdeleni zakladnich datovych typu coz v nette taky najdem
* string
* int
* float
* bool
* files
* date
* datetime
* time2)validacni prvky
* obligate (povinne)
* text =array(neformatovany, bez html, pouze znaky abecedy, abeceda + cisla, abeceda + mezera, abeceda + mezera + cisla)
* psc
* icq (udrztuje format xxx-xxx-xxx)
* telephone (udrztuje format xxx-xxx-xxx)
* min (minimalni poce znaku)
* max
* ucfirst
* text2int (pomoci regularu odstrani vse mimo cislic) treba pro telefon nebo pcs a pak to formatuje viz vyse
* datum3)toto jsou veci ktere najdete ve vetsine formularu a abych to nemusel pokazdy kombinovat tak mam skupiny validacnich prvku
‚name‘ =>array(typ=>‚string‘, min=>2, max=>30, small=>1, ucfirst=>1, text=>2) prijmeni je stejny jako jmeno na validaci, rika typ string, minimalne 2 znaky, maximalne 30, prvni si sam upravi na velke, pouze znaky abecedy
‚town‘ =>array(typ=>‚string‘, min=>2, max=>50, ucfirst=>1, text=>1),
‚street‘ =>array(typ=>‚string‘, min=>2, max=>50, ucfirst=>1, text=>3),//spolecnost stejny jako ulice
‚psc‘ =>array(typ=>‚int‘, min=>5, max=>5, text2int=>1, psc=>1),
‚icq‘ =>array(typ=>‚int‘, min=>7, max=>9, text2int=>1, icq=>1),
‚telefon‘ =>array(typ=>‚int‘, min=>9, max=>12,text2int=>1, telefon=>1),
‚nick‘ =>array(typ=>‚string‘, min=>4, max=>25, text=>3),
‚skype‘ =>array(typ=>‚string‘, min=>6, max=>25, text=>3),
‚password‘ =>array(typ=>‚string‘, min=>6, max=>20, text=>4),
‚email‘ =>array(typ=>‚string‘, min=>6, max=>100, small=>1, email=>1),
‚text‘ =>array(typ=>‚string‘, min=>1, textSpecial=>1),Myslim si ze by bylo dobry udelat nejaky takovyto skupiny pro nette
<?php $form->addText('jmeno')->validace('name');//proste se jenom odkazovat na bod 3) $form->addText('prijmeni')->validace('name'); ?>
a tim by bylo hotovo
Podotykam ze jsem 3) bod zkopiroval z kodu a body 1) a 2) opsal tudiz nemusi uplne sedet indexy mimo ‚name‘ jinak myslenka by mela byt zachycena.
S tím telefonním číslem by jsi umřel. Některý země mají míň / víc čísel ;). Ale jako český to stačí bohatě :D
- Ondřej Brejla
- Člen | 746
Šmajra, když odpovídám na celý předcházející post, tak ho celý necituji…zvlášť, když je takhle dlouhej, kdo to má scrollovat ;-)
- h4kuna
- Backer | 740
m0t3jl napsal(a):
S tím telefonním číslem by jsi umřel. Některý země mají míň / víc čísel ;). Ale jako český to stačí bohatě :D
Neber to do slova :) tam slo o to seskupeni validaci minimalne se stale opakuje nick, jmeno, prijmeni, mesto, ulice s popisnym cislem a to ma stale stejny pravidla a pokud vim telefoni cisla by meli mit minimalne devet cisel plus predvolacka statu a tady to neni uvedene ale i to je osetrene
- Patrik Votoček
- Člen | 2221
Ještě mě napadlo u té pomlčky se musí hlídat jestli to není první znak (např. –200) aby to nebylo pak bráno jako +200… :-)
Jinak co se týká teček a čárek mezi čísly tak to bych řešil pouze u INTegeru kde je to jedno…
Editoval vrtak-cz (22. 7. 2009 18:19)
- Petr Motejlek
- Člen | 293
vrtak-cz napsal(a):
Ještě mě napadlo u té pomlčky se musí hlídat jestli to není první znak (např. –200) aby to nebylo pak bráno jako +200… :-)
Jinak co se týká teček a čárek mezi čísly tak to bych řešil pouze u INTegeru kde je to jedno…
No uvidíme, jak se k tomu vyjádří David.
- na1k
- Člen | 288
No a nestačí si na ty telefonní, icq a jiné čísla jednoduše napsat callback? Pokud čtu kód správně, tak to callbacky baští.
A u obyčejných čísel bych se přikláněl ke striktnímu výkladu, tedy že „1 200“ není číslo. Tak jako tak ale stejně zůstává otázka, jaké hodnoty vracet. Zdrojáky jsem nezkoumal, ale zřejmě tam bude nějaká funkce, která hodnotu z políčka přinejmenším přetypuje na požadovaný (a validovaný) typ. Jak to ale může fungovat bez zohlednění locale?
Editoval na1k (22. 7. 2009 20:33)
- Petr Motejlek
- Člen | 293
na1k napsal(a):
No a nestačí si na ty telefonní, icq a jiné čísla jednoduše napsat callback? Pokud čtu kód správně, tak to callbacky baští.
A u obyčejných čísel bych se přikláněl ke striktnímu výkladu, tedy že „1 200“ není číslo. Tak jako tak ale stejně zůstává otázka, jaké hodnoty vracet. Zdrojáky jsem nezkoumal, ale zřejmě tam bude nějaká funkce, která hodnotu z políčka přinejmenším přetypuje na požadovaný (a validovaný) typ. Jak to ale může fungovat bez zohlednění locale?
Že by to nezohledňovalo locale si nemyslím. Co jsem si kdysi zkoušel, tak PHP je schopné například při echo $cislo, kde číslo je nějaký float, vyhodit to číslo formátované podle locales (tady se bavíme jen o tečce/čárce jako desetinném oddělovačí, třeba ty české mezery jako oddělovače tisíců locales nezná). Na vstupu ale jako číslo potřebuje anglický formát – tedy číslo 1,2 zpracuje jako 1 ;).