2011-07-18 32 views
2

我使用sfGuard插件作爲教條。Symfony - 在不重寫其他驗證器的情況下更改驗證器的錯誤消息?

我想覆蓋唯一用戶名的默認錯誤消息。

我目前得到的是:「具有相同」用戶名「的對象已經存在。」

於是,我試着這樣做:

$this->validatorSchema->getPostValidator('username')->setMessage('invalid', 'The username is already taken.'); 

,沒有工作。

然後我也試過

$this->mergePostValidator(
    new sfValidatorDoctrineUnique(
    array(
     'model' => 'sfGuardUser', 
     'column' => array('username'), 
     'throw_global_error' => false 
    ), 
    array(
     'invalid' => 'The username is already taken.' 
    ) 
) 
); 

,現在我得到2個錯誤outputed:礦山和默認的。

我該如何修復代碼的第二部分才能獲得1個消息輸出?

編輯:http://trac.symfony-project.org/ticket/9426

回答

5

添加此方法BaseDoctrineForm。然後,在你的配置方法(或任何esle),你可以這樣做:

public function configure() 
{ 
    $this->getPostValidatorUnique(array('username'))->setMessage('invalid', 'IN YOUR FACE'); 
} 

的方法:

/** 
* @param array $columns 
* @param sfValidatorBase $validator 
* @return sfValidatorDoctrineUnique 
*/ 
public function getPostValidatorUnique($columns, $validator = null) 
{ 
    if ($validator === null) 
    { 
    $validator = $this->getValidatorSchema()->getPostValidator(); 
    } 
    if ($validator instanceof sfValidatorDoctrineUnique) 
    { 
    if (!array_diff($validator->getOption('column'), $columns)) 
    { 
     return $validator; 
    } 
    } 
    elseif (method_exists($validator, 'getValidators')) 
    { 
    foreach($validator->getValidators() as $childValidator) 
    { 
     if ($matchingValidator = $this->getPostValidatorUnique($columns, $childValidator)) 
     { 
     return $matchingValidator; 
     } 
    } 
    } 
    return null; 
} 
+0

哇,這真的不錯,謝謝:)。 – Tool

+0

放下男人的手!即使它與Propel一起工作(只需更換類名稱)。 – mppfiles

相關問題