Rozdílná fčnost Form::URL a Validators::isUrl

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Tomáš Votruba
Moderator | 1114
+
0
-

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)

Validators::isUrl

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.

Tomáš Votruba
Moderator | 1114
+
0
-

Ping, nikdo nemá podobnou zkušenost? I taková reakce by pomohla :)

kravčo
Člen | 721
+
0
-

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

@kravčo: Hodně dobré, díky. To by rozhodně nemělo chybět v dokumentaci.

Jan Jakeš
Člen | 177
+
0
-

Ten filtr se mi ale vůbec nelíbí. Proč to neudělat takto?

$absoluteUrlFilter = function($url) {
    return Nette\Utils\Strings::startsWith($url, 'http://') ? $url : "http://$url";
};
OK3
Člen | 91
+
0
-

A co https:// ? :)

Jan Jakeš
Člen | 177
+
0
-

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)

OK3
Člen | 91
+
0
-

No jasně, jen jsem rejpal.
Oba ve finále dojdete ke stejnému výsledku (vrátí se správně adresa), ale pro tebe je důležitá i ta cesta. Někdo to holt neřeší.

motorcb
Člen | 551
+
0
-

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

Nemůžeš navazovat filtr na condition, zkus takto:

	->addFilter($urlFilter)
	->addCondition(Form::FILLED)
		->addRule(Form::URL, 'Nebyla zadána platná URL');
grandmaster
Člen | 9
+
0
-

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

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).