2014-03-04 51 views
0

在Model_Page類不工作的獨特價值,延長Kohana的ORM類,我有這樣的規則定義:的Kohana 3.3 ORM驗證 - 當值爲空

public function rules() { 
    return array(
     'url' => array(
      array('Model_Page::unique_url', array($this)), 
     ), 
    ); 
} 

爲了簡化在這裏,我將只返回從false這個功能,所以當我嘗試保存/更新頁面應該永遠不會驗證:

public static function unique_url($page) { 
    return false; 
} 

可正常工作,如果 URL值不爲NULL不是空字符串

但是,如果我已經有一個空網址的頁面,並且我嘗試添加一個空網址的新頁面,即使強制返回false,unique_url函數也會被忽略。

這可能是一個錯誤,但也許我錯過了什麼......?在Kohana文檔中,對於唯一的示例,它們使用用戶名作爲示例,但用戶名也具有not_empty規則,該規則在此不適用。

任何幫助/建議表示讚賞!

回答

0

我相信這個規則是在您設置了該值之後應用的,而不是在您保存時應用的。

我有一個類似的問題 - 過濾器不工作,如果我沒有分配任何值的字段。我寫了自己的保存方法:

public function save(Validation $validation = NULL) 
{ 
    if (!$this->loaded()) 
    { 
     $this->ordering = 0; 
    } 

    return parent::save($validation); 
} 

這樣,排序總是會被分配給新創建的對象,我的過濾器將工作。

這就是我建立另一個模型。這是一個擁有獨特公司名稱的公司模型。對於該領域規則的定義是這樣的:

'name' => array(
    array('not_empty'), 
    array('max_length', array(':value', 255)), 
    array(array($this, 'unique_name')) 
) 

而且我有一個方法:

public function unique_name($value) 
{ 
    $exists = (bool) DB::select(array(DB::expr('COUNT(*)'), 'total_count')) 
     ->from($this->_table_name) 
     ->where('name', '=', $value) 
     ->where($this->_primary_key, '!=', $this->pk()) 
     ->execute($this->_db) 
     ->get('total_count'); 

    return !$exists; 
} 

如果有任何其他公司具有相同名稱作爲當前一個它基本上檢查。也許這會讓你知道你的解決方案有什麼問題。

+0

你是什麼意思?我確實將該值設置爲空字符串,所以驗證應該反正不會。 – Piero

+0

在你的方法中嘗試死亡('XXX')。然後不同的場景 - 創建新頁面並保存它,創建新頁面,分配值並保存,加載已存在的值,然後再次保存,加載已存在的值,設置值並保存等等。您將獲得 – MaGnetas

+0

我做了所有這些。另外你的保存功能對我不起作用,我沒有必要做一個保存,但也更新,所以我的url值不能像你這樣默認設置,它是由values()函數設置的。 – Piero