代码之家  ›  专栏  ›  技术社区  ›  lo_fye

如何在Zend子窗体中一次验证>1个字段?

  •  1
  • lo_fye  · 技术社区  · 16 年前

    我使用在线参考文档中的Zend_Form_子窗体示例创建了一个3屏“向导”。

    我无法满足的要求是: 如果第一个屏幕的字段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'u 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 回复  |  直到 14 年前
        1
  •  1
  •   lo_fye    16 年前

    这不会帮助您决定要将验证附加到哪个字段,但是… 有一种东西叫“A” 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;
        }
    }