2012-10-19 41 views
1

我想通過控制器而不是模型中的條件使字段無效。控制器中的CakePHP驗證錯誤?

$this->Model->invalidate('check_out_reason', __('Please specify check out reason.', true)); 

以上將無法使字段無效。相反,我需要如下:

$this->Model->invalidate('Model.check_out_reason', __('Please specify check out reason.', true)); 

不過,如果我希望得到的錯誤消息中的「場」本身顯示($這個 - >模型 - > validationErrors),它必須是「check_out_reason」,而不是「Model.check_out_reason」。這意味着,如果我希望使控制器中的輸入無效,則無法在字段中顯示錯誤消息。

我可以知道這是CakePHP中的一個錯誤嗎?

+0

對我來說這似乎是一個主要的聯盟bug,特別是因爲我們已經在特定模型上稱「無效」。我們不需要在「field」參數中重複它。 – Brade

回答

1

我創建了一個名爲「發票」測試控制器,只是爲了測試,我制定了以下功能

public function index(){ 
      if (!empty($this->request->data)) { 
       $this->Invoice->invalidate('nombre', __('Please specify check out reason.')); 
       if ($this->Invoice->validates()) { 
       // it validated logic 
         if($this->Invoice->save($this->request->data)){ 
          # everthing ok 
         } else { 
          # not saved 
         } 
       } else { 
        // didn't validate logic 
        $errors = $this->Invoice->validationErrors; 

       } 
      } 
     } 

我認爲它爲我工作 enter image description here

變化領域的「農佈雷」爲您的字段名爲「check_out_reason」以使函數適應您的代碼

+0

嗨,佩德羅,不適合我。你的index.ctp是什麼? 這是我的: <?php echo $ this-> Form-> create('invoices')?> <?php echo $ this-> Form-> input('invoices.nombre')?> <? php echo $ this-> Form-> end('submit')?> – neobie

+0

我試着用cakephp 2.2.0/2.2.3 – neobie

+0

<?php echo $ this-> Form-> create(); echo $ this-> Form-> input('nombre'); // echo $ this-> Form-> error('nombre'); echo $ this-> Form-> end('Add'); ?> – elpeter

1

我找到了解決方法,用於處理來自控制器的手動失效。在這個問題上讀了很多,我發現save()函數沒有考慮通過在controller中調用的invalidate()函數設置的失效,但是如果直接從模型函數調用beforeValidate(這非常重要) ()它的工作完美。

所以我建議去AppModel.php文件,並創建一個公開的方法:

public $invalidatesFromController = array(); 

public function beforeValidate($options = array()) { 
    foreach($this->invalidatesFromController as $item){ 
     $this->invalidate($item['fieldName'], $item['errorMessage'], true); 
    }   
    return parent::beforeValidate($options); 
} 

public function invalidateField($fieldName, $errorMessage){ 
    $this->invalidatesFromController[] = array(
     'fieldName' => $fieldName, 
     'errorMessage' => $errorMessage 
    ); 
} 

之後,請確保您的模型beforeValidate()函數調用父類的一個:

public function beforeValidate($options = array()) { 
    return parent::beforeValidate($options); 
} 

在你的控制器無效場使用下一行:

$this->MyModel->invalidateField('fieldName', "error message"); 

希望它他LPS!對我來說它工作正常!