Rozdílná fčnost Form::URL a Validators::isUrl
- Tomáš Votruba
- Moderator | 1114
Včera mne napadlo, proč když jsou „URL“ a „Url“ velmi podobná slova, se chovají různě.
Form::URL (používám aktuální netteForm.js, 2012–02–03)
- dokumentace tvrdí je hodnota absolutní URL?
- přitom pustí:
- http://test.cz
- www.test.cz
- test.cz
Validators::isUrl
- funguje správně:
- http://www.test.cz pustí
- www.test.cz už nepustí
Pak když ukládám URL od uživatele, musím ve formuláři použít Form::URL i Validators::isUrl() (a doplnit „http://“ na absolutní url), což je takové hloupé.
Nevím, jestli jde o feature nebo bug, tak píšu sem.
- kravčo
- Člen | 721
Podľa mňa je terajšie správanie absolútne žiaduce. Bežný
používateľ nepochopí, prečo mu po zadaní www.zoznam.sk
vyhodí chybovú hlášku, že má zadať absolútnu url.
Nenapadá mi, kedy by pri vyžadovaní validácie na url malo zmysel
rozlišovať medzi tým, či používateľ http://
napíše alebo
vynechá, takže by možno malo zmysel pridať default filter pre URL, ktorý
(ak chýba) pripojí na začiatok url http://
V tvojom prípade ti problém vyrieši manuálne pridanie takéhoto filtra, teda:
<?php
use Nette\Forms\Form,
Nette\Utils\Validators;
// predtým
$form->addText('url', 'Url:')
->addRule(Form::URL);
// potom
$urlFilter = function ($value) {
$newValue = 'http://' . $value;
return Validators::isUrl($newValue) ? $newValue : $value;
};
$form->addText('url', 'Url:')
->addFilter($urlFilter)
->addRule(Form::URL);
- Tomáš Votruba
- Moderator | 1114
@kravčo: Hodně dobré, díky. To by rozhodně nemělo chybět v dokumentaci.
- Jan Jakeš
- Člen | 177
To není problém upravit, ne? Mně šlo jen o princip – proč používat validátor na zjištění, jestli řetězec začíná nějakou sekvencí znaků. Samozřejmě:
$absoluteUrlFilter = function($url) {
return (Strings::startsWith($url, 'http://') || Strings::startsWith($url, 'https://')) ? $url : "http://$url";
};
Anebo rovnou:
$absoluteUrlFilter = function($url) {
return Strings::match($url, '^https?://#i') ? $url : "http://$url";
};
Editoval Juan (23. 2. 2012 15:20)
- motorcb
- Člen | 552
kravčo:
protected function bazarForm()
{
$form = new Form();
$form->addText('title', 'Titulek', 40, 100)
->addRule(Form::FILLED, 'Je nutné zadat titulek');
$form->addTextArea('text', 'Text:')
->addRule(Form::FILLED, 'Je nutné zadat text');
$urlFilter = function ($value) {
$newValue = 'http://' . $value;
return Validators::isUrl($newValue) ? $newValue : $value;
};
$form->addText('www', 'WWW', 40, 100)
->addCondition(Form::FILLED)
->addFilter($urlFilter)
->addRule(Form::URL, 'Nebyla zadána platná URL');
return $form;
}
Používám Nette 2.0.3 a hlásí mi to chybu:
Call to undefined method Nette\Forms\Rules::addFilter().
u řádku: ->addFilter($urlFilter)
Jak na to?
- Tomáš Votruba
- Moderator | 1114
Nemůžeš navazovat filtr na condition, zkus takto:
->addFilter($urlFilter)
->addCondition(Form::FILLED)
->addRule(Form::URL, 'Nebyla zadána platná URL');
- grandmaster
- Člen | 9
Navazu to tohoto vlakna, nebot problem mozna s nim souvisi.
Mam formularove pole, kod jsem upravil primo dle dokumentace
$form->addText('link', 'Odkaz:')
->addCondition($form::FILLED)
->addRule($form::URL, 'Nebyla zadána platná URL');
"" → projde
„a“ → neprojde
„aa“ → projde
Do validators:isUrl vstupuje hodnota 2×, jednou primo obsah input boxu, podruhe s „http://“. Nevim, zda je dle nejakeho RFC platna url http://aa ale v soucasnosti je tato validacni podminka nepouzitelna, kdyz mi projde jakekoliv viceznakove slovo.
- marten
- Člen | 2
Sice hodne stara zalezitost, ale pridam se se svoji troskou. URL je spravne
i se schematem. Tedy url je i telnet://192.168.1.1, ftp, gopher a cokoliv
dalsiho. Davat podminku na http a https je nedostatecne. Stejne jako se email
validuje podle RFC, melo by se tak validovat i URL. A ne ze projde jakekoliv
jedno slovo bez mezer jako validni adresa. Kdyz validuji string
‚google.com‘, jeste to vubec neznamena, ze si mam domyslet, ze pred to
automaticky napisu http. Stejne tak ani ted pro http nepodporuje informaci
o uzivateli a hesle. Pokud by to bylo opravdu URL, je kazdy protokol potreba
validovat jinak.
Pokud chci validovat pouze http, https, myslim, ze by bylo lepsi pro ne mit
vlastni validator (URL_HTTP).