2011-11-17 10 views
13

पर आधारित सिम्फनी 2 फॉर्म सत्यापन मैं वर्तमान में एक वेबसाइट विकसित कर रहा हूं जिसमें उपयोगकर्ता उपहार कार्ड खरीद सकता है। मैं CraueFormFlow बंडल का उपयोग करके एक तीन चरण का उपयोग कर रहा हूं और सबकुछ चरणों से संबंधित है। मैं हर साधारण आवेषण (जैसे रिक्त, ईमेल, दोहराए गए फ़ील्ड इत्यादि) को मान्य करने में सक्षम हूं लेकिन मुझे उस स्थिति का सामना करना पड़ रहा है जहां उपयोगकर्ता 0 उपहार कार्ड का चयन कर सकता है और अगले पृष्ठ पर जा सकता है।दो फ़ील्ड

उपयोगकर्ता गिफ्टकार्ड की मात्रा चुन सकते हैं जो वे दो अलग-अलग उपयोग करके खरीदना चाहते हैं: एक 25 $ उपहार कार्ड के लिए और एक $ 50 उपहार कार्ड के लिए। तो मैं सिर्फ एक वैधता नहीं कह सकता कि "मूल्य 0 की अनुमति नहीं है"। सत्यापनकर्ता को उपयोगकर्ता को दोनों राशि (25 $ और 50 $) में मात्रा "0" छोड़ने से रोकना चाहिए।

क्या कोई जानता है कि कस्टम फ़ील्ड को दो क्षेत्रों में मूल्यों की तलाश कैसे करें?

अग्रिम धन्यवाद!

उत्तर

30

आपके पास इसके लिए कई समाधान हैं।

सबसे आसान एक है अपने मॉडल वर्ग में Callback constraint जोड़ने के लिए।

ऐसा करने का एक और तरीका आपकी कस्टम बाधा और उसके संबंधित सत्यापनकर्ता को बनाना होगा। आपके पास cookbook explaining how to create a custom validation constrain है। यह करने के लिए यह सबसे अच्छा तरीका है।

अपने बाधा एक संपत्ति के लिए, लेकिन एक वर्ग पर लागू नहीं होता है, तो आप इसे अपने बाधा वर्ग के ->getTargets() विधि अधिभावी उल्लेख करना होगा:

class MyConstraint extends Constraint 
{ 
    // ... 

    public function getTargets() 
    { 
     return Constraint::CLASS_CONSTRAINT; 
    } 
} 

तो मूल्य ->isValid() विधि के $value तर्क के रूप में पारित कर दिया पूरे वर्ग के मूल्य और न केवल एक संपत्ति के मूल्य होंगे।

+3

क्या आप कृपया मुझे बता सकते हैं कि कॉलबैक बाधा को कैसे कार्यान्वित किया जाए? मैं Symfony2 दस्तावेज़ देख रहा हूं और मुझे नहीं पता कि उन मूल्यों का उपयोग कैसे किया जा सकता है जिन्हें मैं जांचना चाहता हूं [...] isValid() फ़ंक्शन। –

+0

ऐसा लगता है कि कोई डेटा क्लास नहीं होने पर यह काम नहीं करता है (जब आप सरणी के साथ काम करते हैं)। – umpirsky

3

उपयोग नियमित अभिव्यक्ति शून्य

रोकने inorder करने के लिए अपने इकाई कक्षा में नीचे नीचे ओवरराइड समारोह लिखते हैं, और अपनी संपत्ति है जो आप को मान्य करने की जरूरत है निर्दिष्ट करें।

नीचे दिया गया उदाहरण पिनकोड को मान्य करने के लिए है, यहां पिनकोड फ़ील्ड में मैं केवल 10 अंकों तक 0-9 संयोजनों को स्वीकार करता हूं।

"^ \ d + $" यह नियमित अभिव्यक्ति है जिसका उपयोग मैं अन्य पात्रों को रोकने के लिए करता था।

इस समारोह अधिभावी के लिए आप भूल जाते हैं नहीं इन सभी जरूरी

अपने इकाई वर्ग

आप को मान्य करने के लिए है कि में शामिल नीचे वर्गों

use Symfony\Component\Validator\Mapping\ClassMetadata;// for overriding function loadValidatorMetadata() 

use Symfony\Component\Validator\Constraints\NotBlank;// for notblank constrain 

use Symfony\Component\Validator\Constraints\Email;//for email constrain 

use Symfony\Component\Validator\Constraints\MinLength;// for minimum length 

use Symfony\Component\Validator\Constraints\MaxLength; // for maximum length 

use Symfony\Component\Validator\Constraints\Choice; // for choice fields 

use Symfony\Component\Validator\Constraints\Regex; // for regular expression 



public static function loadValidatorMetadata(ClassMetadata $metadata) 
    { 
     $metadata->addPropertyConstraint('pincode', new NotBlank(array('message' => 'Does not blank'))); 
     $metadata->addPropertyConstraint('pincode', new Regex(array('pattern'=>'/^\d+$/','message' => 'must be number'))); 
     $metadata->addPropertyConstraint('pincode', new MaxLength(array('limit'=>'6','message' => 'must maximum 6 digits'))); 
     $metadata->addPropertyConstraint('pincode', new MinLength(array('limit'=>'6','message' => 'must minimum 6 digits'))); 


    } 

शामिल करना चाहिए। तो आपके मामले में एक उचित नियमित अभिव्यक्ति का उपयोग करें जो '0' की अनुमति नहीं देता है।

मुबारक

12

कोडिंग आप अपने फ़ॉर्म से जुड़ी एक डेटा वर्ग आप इस तरह रूपों में निर्भर बाधाओं लागू कर सकते हैं की जरूरत नहीं है जब:

$startRangeCallback = function ($object, ExecutionContextInterface $context) use ($form) 
    { 
     $data = $form->getData(); 
     $rangeEnd = $data['range_end']; 
     if($object && $rangeEnd){ 
      if ($object->getTimestamp() > $rangeEnd->getTimestamp()) { 
       $context->addViolation('Start date should be before end date!', array(), null); 
      } 
     } 

    }; 

    $form->add('range_start', 'bootstrap_datepicker', array(
      'format' => 'dd-MM-yyyy', 
      'required' => false, 
      'attr' => array('class' => "col-xs-2"), 
      'calendar_weeks' => true, 
      'clear_btn' => true, 
      'constraints' => array(
       new Callback(array($startRangeCallback)), 
      ) 
     ) 
    ); 

    $form->add('range_end', 'bootstrap_datepicker', array(
      'format' => 'dd-MM-yyyy', 
      'required' => false, 
      'attr' => array('class' => "col-xs-2"), 
      'calendar_weeks' => true, 
      'clear_btn' => true, 

     ) 
    ); 
+0

और अगर मुझे इकाई प्रबंधक भी एक्सेस करने की आवश्यकता है तो क्या होगा? –

5

यह मैं कैसे में ऐसा करने के बाद किया जाता है मेरी समाप्ति महीने और वर्ष गुणों के साथ क्रेडिट कार्ड वैधता की जांच करने के लिए सत्यापन बाधाएं।

इस कक्षा में, मैं समाप्ति का मूल्य जांचता हूं और संपत्ति की समाप्ति के साथ इसकी तुलना करता हूं मासिक संपत्ति संदर्भ से प्राप्त होती है। ऑब्जेक्ट।

/** 
* Method to validate 
* 
* @param string         $value  Property value  
* @param \Symfony\Component\Validator\Constraint $constraint All properties 
* 
* @return boolean 
*/ 
public function validate($value, Constraint $constraint) 
{ 
    $date    = getdate(); 
    $year    = (string) $date['year']; 
    $month    = (string) $date['mon']; 

    $yearLastDigits  = substr($year, 2); 
    $monthLastDigits = $month; 
    $otherFieldValue = $this->context->getRoot()->get('expirationMonth')->getData(); 

    if (!empty($otherFieldValue) && ($value <= $yearLastDigits) && 
      ($otherFieldValue <= $monthLastDigits)) { 
     $this->context->addViolation(
      $constraint->message, 
      array('%string%' => $value) 
     );    
     return false;    
    } 

    return true; 
} 
बेशक

, आप अपने getTargets विधि में वर्ग और गुण की कमी को अधिकृत करने के लिए है, मुख्य बाधा फ़ाइल के रूप में।

/** 
* Get class constraints and properties 
* 
* @return array 
*/ 
public function getTargets() 
{ 
    return array(self::CLASS_CONSTRAINT, self::PROPERTY_CONSTRAINT); 
} 

आगे स्पष्टीकरण और पूरा ट्यूटोरियल यहाँ: http://creativcoders.wordpress.com/2014/07/19/symfony2-two-fields-comparison-with-custom-validation-constraints/

3

मैं Expression constraint उपयोग करने का सुझाव चाहते हैं। इस बाधा को फॉर्म फ़ील्ड या (अधिमानतः) इकाई पर लागू किया जा सकता है:

/** 
    * @var int 
    * @Assert\Type(type="integer") 
    */ 
    private $amountGiftCards25; 

    /** 
    * @var int 
    * @Assert\Type(type="integer") 
    * @Assert\Expression(expression="this.getAmountGiftCards25() > 0 or value > 0", message="Please choose amount of gift cards.") 
    */ 
    private $amountGiftCards50; 
संबंधित मुद्दे