2009-07-12 86 views
1

我使用在線參考文檔中的Zend_Form_SubForm示例創建了一個3屏幕「嚮導」。如何在Zend子表單中一次驗證> 1個字段?

我在遇到問題時遇到的要求如下: 如果第一個屏幕的字段1,2,& 3已經在數據庫中,請通知用戶他們正試圖添加重複記錄。每個字段都有自己的驗證器。不知怎的,我需要添加這個「組驗證器」。

因此,在最基本的層面上,我試圖做的事:

if($field_1_not_in_db && $field_2_not_in_db && $field_3_not_in_db){ 
    return true;//validation OK 
} else { 
    return false;//invalid data 
} 

我來面對幾個問題,雖然: 1)因爲它適用於多個領域,我不知道附加到哪個字段。錯誤信息出現在它們所連接的字段旁邊,所以這很重要......除非我可以讓這些「多字段驗證程序」錯誤出現在屏幕的頂部,這很理想。 2)我的驗證器只接收一個值(我附加到的字段的值,而不是它應該驗證的多個字段的值)。 3)我提供了錯誤信息中原始(非重複)記錄的鏈接,但是它轉義了鏈接,我無法弄清楚如何解決這個問題。

我正在使用的設置(下面)實際上執行得很好,但NewPlace驗證器接收$ _POST ['city_fk']作爲$ fields,而不是所需的發佈值組。

$city_fk = new Zend_Form_Element_Select('city_fk'); 
$cities = array(); 
$city_fk->setMultiOptions($cities) 
     ->setLabel('City') 
     ->setDescription('The city this place is in') 
     ->setRequired(true); 

$v = array(
     'place_is_unique' => array(
       'NewPlace', 
       'fields' => array('place_name','phone_number','phone_extension','street','post_code_name'), 
     ) 
    ); 
$city_fk->addValidators($v); 

$addressSubForm->addElement($city_fk); 

class My_Validate_NewPlace extends Zend_Validate_Abstract 
{ 
    public function isValid($fields) 
    { 
     $result = false; 

    if(!$result) 
     { 
      $this->_error('sorry, this is duplicate data. see it <a href="linktoduplicate">here</a>'); 
     return false; 
     } 

     return true; 
    } 
} 

回答

1

這不會幫助你決定附加驗證到現場,但... 有一種被稱爲「validation context」,可以幫助的事情。 當您創建自定義驗證器或表單時,如果您指定了第二個可選參數($ context = null),那麼Zend將自動填充整個發佈數據數組,您可以使用它將其他字段值合併到驗證中。這裏有一個非常基本的例子:

$city_name = new Zend_Form_Element_Text('city_name'); 

$place_name = new Zend_Form_Element_Text('place_name'); 
$place_name->addValidator('NewPlace'); 

class My_Validate_NewPlace extends Zend_Validate_Abstract 
{ 
    public function isValid($value, **$context = null**) 
    { 
     if(trim($value)!='' && trim($context['city_name']) != '') 
     { 
      return true; 
     } 

     return false; 
    } 
}