2011-09-28 80 views
0

我正在創建一個使用Codeigniter和php-activerecord的用戶模型,並且wiki說我可以使用'on'=>'create'來驗證只有在新記錄創建,這樣,只使用php-activerecord創建驗證

static $validates_presence_of = array(
    array('title', 'message' => 'cannot be blank on a book!', 'on' => 'create') 
); 

報告還指出,我們有機會獲得「拯救」,「更新」和「刪除」 ......

這些都不是雖然工作對我來說,我自己看着辦爲什麼,這是我的代碼,

// Validations 
static $validates_presence_of = array(
array('email', 'message' => 'Please enter a valid email address.'), 
array('password', 'message' => 'Password must be provided.', 'on' => 'create') 
); 

我想這樣設置它,以便當用戶更新他們的個人資料時,他們可以將他們的密碼保留爲空以保留他們的當前密碼。

我將不勝感激任何幫助或指導!謝謝!

回答

1

,因爲它沒有得到落實的原因是最有可能的。

相關類的lib/Model.php和lib/Validations.php

從純粹抽象的角度來看,則需要跟蹤操作的節約和創造的模式。爲此,我在lib/Model.php中創建了一個公共屬性(public $ validation_mode),並分別在私有方法Model :: insert()和Model :: update()中將該屬性設置爲'create'或'save'。這些值與您嘗試使用的'on'屬性匹配。

然後LIB內/ Validations.php,我修改了以下方法:

驗證:: validates_presence_of()

public function validates_presence_of($attrs) 
{ 
    $configuration = array_merge(self::$DEFAULT_VALIDATION_OPTIONS, array('message' => Errors::$DEFAULT_ERROR_MESSAGES['blank'], 'on' => 'save')); 

    foreach ($attrs as $attr) 
    { 
     $options = array_merge($configuration, $attr); 
     $this->record->add_on_blank($options[0], $options['message'], $options); 
    } 
} 

錯誤:: add_on_blank()

public function add_on_blank($attribute, $msg, $options = array()) 
{ 
    if (!$msg) 
     $msg = self::$DEFAULT_ERROR_MESSAGES['blank']; 

    if (($value = $this->model->$attribute) === '' || $value === null) 
      { 
        if(array_key_exists('on', $options)) 
        { 
         if($options['on'] == $this->model->validation_mode) 
         { 
          $this->add($attribute, $msg); 
         } 
        } else {        
         $this->add($attribute, $msg); 
        } 
      } 
} 

這基本上是通過你的模型中指定的所有$選項(包括('on'屬性)下拉到Errors :: add_on_blank()方法,它現在有足夠的信息來區分'on'=>'create'和默認值('on'=>'save')。使用Model類($ this-> model-> validation_mode)中的public $ validation_mode屬性,我們可以確定當前的操作模式以及我們是否希望繼續添加錯誤消息或者這次跳過它。

很明顯,你會想記錄你所做的任何更改和徹底測試。根據文檔,所有的驗證方法都支持allow_null,allow_blank這個「通用選項」,但是如果沒有實現,你必須通過做出這些必要的更改來實現。

+0

另外,爲了強調一下,目前還沒有實施最新的夜間建造。據他們的Github存儲庫報道,但我還沒有看到它的解決。請注意,這種方法要求在實例化的模型上調用save()方法(例如$ o-> save())或者validation_mode屬性不會被設置(例如$ o-> is_valid()會返回true,但是$ o-> save()在驗證時會返回false)。如果返回值爲FALSE,則相應地計劃檢查$ o-> save()的返回值並繼續進行正常的錯誤報告(print_r($ o-> errors-> full_messages()))。 – rdev5

1

應該是這樣調用驗證方法:

 #example 
$your_obj = new Instace(); 

if($your_obj->is_valid()) { 
    // if all is correct your logical code 
} 
else { 
// your logical to show the error messages 
} 
//doesnt work if you write 

if(!$your_obj->is_valid()) 

//the other way you must be use the next method 
if($your_obj->is_invalid()) 
1

我找到沒有編輯庫的問題的答案。

添加before_validation回調並在此回調中添加驗證規則。這個對我有用。

static $before_validation_on_create = array('before_validation_on_create'); 

static $validates_presence_of = array(
    array('login'), 
); 

public function before_validation_on_create() { 
    self::$validates_presence_of[] = array('password'); 
} 
相關問題