2010-03-06 10 views
13

मेरे पास मेरे ज़ेंड फॉर्म में दो फ़ील्ड हैं, और मैं सत्यापन नियम लागू करना चाहता हूं जो उपयोगकर्ता को इन दोनों क्षेत्रों में से किसी एक में प्रवेश करता है।ज़ेंड फॉर्म वैलिडेटर: एलिमेंट ए या एलिमेंट बी

$companyname = new Zend_Form_Element_Text('companyname'); 
    $companyname->setLabel('Company Name'); 
    $companyname->setDecorators($decors); 
    $this->addElement($companyname); 

    $companyother = new Zend_Form_Element_Text('companyother'); 
    $companyother->setLabel('Company Other'); 
    $companyother->setDecorators($decors); 
    $this->addElement($companyother); 

मैं एक सत्यापनकर्ता कैसे जोड़ सकता हूं जो दोनों फ़ील्ड को देखेगा?

उत्तर

12

इस page पर 'नोट: सत्यापन संदर्भ' देखें। Zend_Form प्रत्येक Zend_Form_Element :: isValid कॉल के साथ दूसरे पैरामीटर के रूप में संदर्भ पास करता है। तो बस अपना खुद का सत्यापनकर्ता लिखें जो संदर्भ का विश्लेषण करता है।

संपादित करें:
ठीक है, मैंने सोचा था कि I'ld इस पर अपने आप को एक शॉट ले लो। यह परीक्षण नहीं किया जाता है, न ही यह सभी सिरों का साधन है, लेकिन यह आपको एक बुनियादी विचार देगा।

class My_Validator_OneFieldShouldBePresent extend Zend_Validator_Abstract 
{ 
    const NOT_PRESENT = 'notPresent'; 

    protected $_messageTemplates = array(
     self::NOT_PRESENT => 'Field %field% is not present' 
    ); 

    protected $_messageVariables = array(
     'field' => '_field' 
    ); 

    protected $_field; 

    protected $_listOfFields; 

    public function __construct(array $listOfFields) 
    { 
     $this->_listOfFields = $listOfFields; 
    } 

    public function isValid($value, $context = null) 
    { 
     if(!is_array($context)) 
     { 
      $this->_error(self::NOT_PRESENT); 

      return false; 
     } 

     foreach($this->_listOfFields as $field) 
     { 
      if(isset($context[ $field ])) 
      { 
       return true; 
      } 
     } 

     $this->_field = $field; 
     $this->_error(self::NOT_PRESENT); 

     return false; 
    } 
} 

उपयोग:

$oneOfTheseFieldsShouldBePresent = array('companyname', 'companyother'); 

$companyname = new Zend_Form_Element_Text('companyname'); 
$companyname->setLabel('Company Name'); 
$companyname->setDecorators($decors); 
$companyname->addValidator(new My_Validator_OneFieldShouldBePresent($oneOfTheseFieldsShouldBePresent)); 
$this->addElement($companyname); 

$companyother = new Zend_Form_Element_Text('companyother'); 
$companyother->setLabel('Company Other'); 
$companyother->setDecorators($decors); 
$companyname->addValidator(new My_Validator_OneFieldShouldBePresent($oneOfTheseFieldsShouldBePresent)); 
$this->addElement($companyother); 
0

मुझे इस तरह के समाधान में नहीं आया है, लेकिन यह पूरी तरह मान्य है इसलिए +1।

मैं Your_Form::isValid() का विस्तार उन दो तत्वों के मूल्यों के लिए एक मैनुअल जांच शामिल करने के लिए होगा।

सभी क्षेत्रों अपने व्यक्तिगत प्रमाणकों पार कर लेते हैं, इस मान्यता शायद फार्म के रूप में एक पूरी है और इस तरह यह क्षेत्रों के बजाय फार्म के सत्यापन पर रखा जा सकता है पर अंतर्गत आता है। क्या आप इस सोच की रेखा से सहमत हैं?

0

मैं @helmertz से सहमत हूं कि इस तरह की एक सुविधा मौजूद नहीं है।

जो मैं सहमत नहीं हूं Your_Form::isValid() का विस्तार कर रहा है। इसके बजाय, मैं write a custom Validator चाहता हूं जो दोनों तत्व तत्वों के मान स्वीकार करता है जिनके पास मूल्य होना चाहिए। इस तरह मैं इसे मनमानी रूप तत्वों पर पुन: उपयोग कर सकता हूं। यह कुछ समान वैलिडेटर के समान है।

1

समाधान @fireeyedboy द्वारा प्रदान की आसान लेकिन इस सटीक मुद्दे के लिए काम नहीं कर रहा है।

Zend_Validate_Abstract संदर्भ का उपयोग कर रहा है, जिसे isValid() पर चर के रूप में पारित नहीं किया जा सकता है। इस तरह isValid() विधि का उपयोग करते समय (कोई फर्क नहीं पड़ता कि मूल या अधिलेखित एक) खाली फ़ील्ड पारित नहीं हो जाते हैं और मान्य नहीं होते हैं (जब तक आपके पास setRequired(true) या setAllowEmpty(false) नहीं है, जिसे हम नहीं चाहते हैं)। तो इस मामले में जब आप दोनों दो फ़ील्ड्स (companyname और companyother) खाली छोड़ते हैं, तो कोई कार्रवाई नहीं होगी। एकमात्र समाधान जिसे मैं जानता हूं, Zend_Validate कक्षा को विस्तारित करने के लिए खाली फ़ील्ड को सत्यापित करने की अनुमति है।

अगर आपको बेहतर समाधान पता है तो कृपया मुझे बताएं क्योंकि मैं भी इसी तरह की समस्या से जूझ रहा हूं।

संबंधित मुद्दे