2011-07-14 4 views
5
$this->setValidator('website', new sfValidatorAnd(array(
      $this->validatorSchema['website'], 

      new sfValidatorUrl(array(), array(
      'invalid' => 'This is not website', 
     )),  
))); 

symfonyにおいて、この検証http://google.comが、google.comありません。私はhttp://を使わずに、どのように検証することができますか?検証のURL://

+2

ユーザーに適切なURLを入力してもらうことをおすすめします。または、URLにプロトコルが含まれていない場合は、http://のプリプロセッサにJavaScriptを追加します。それから彼らはそれがそこに属していることを知っていました。 – ThiefMaster

+0

ThiefMasterでは、データベースのURLプロトコルをハードコードしたくない場合があります。 – Acyra

答えて

4

私はあなたがあなた自身のカスタムバリデータを作成する必要があります怖いです:

class myCustomValidatorUrl extends sfValidatorRegex 
{ 
    const REGEX_URL_FORMAT = '~^ 
    ((%s)://)?         # protocol 
    (
     ([a-z0-9-]+\.)+[a-z]{2,6}    # a domain name 
     |         # or 
     \d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3} # a IP address 
    ) 
    (:[0-9]+)?        # a port (optional) 
    (/?|/\S+)        # a /, nothing or a/with something 
    $~ix'; 

    protected function configure($options = array(), $messages = array()) 
    { 
    parent::configure($options, $messages); 

    $this->addOption('protocols', array('http', 'https', 'ftp', 'ftps')); 
    $this->setOption('pattern', new sfCallable(array($this, 'generateRegex'))); 
    } 

    public function generateRegex() 
    { 
    return sprintf(self::REGEX_URL_FORMAT, implode('|', $this->getOption('protocols'))); 
    } 
} 

ここ((%s)://)?は今のプロトコルがオプションであることを意味します。 元のパターン(REGEX_URL_FORMAT const)はsfValidatorUrlを参照してください。

+0

ありがとうございます!私はクールです:) – denys281

-1

"必須"オプションをfalseに設定するだけです(デフォルトではtrueです)。あなたはフラグFILTER_VALIDATE_URLでネイティブPHP関数filter_varを使用することができます検証するための

$this->setValidator('url', 
    new sfValidatorUrl(array('required' => false), array(
    'invalid' => 'invalid url'))); 
+2

申し訳ありませんが、-1になっていました。これは問題を回避して解決していません。 sfValidatorPass()を使うこともできます。次に。 – Inoryy