2017-08-16 58 views
5

में चेकबॉक्स चेक किया गया है, तो फॉर्म प्रकार के लिए सत्यापन बंद करें, मैं भुगतान और शिपिंग पते के साथ एक पता फ़ॉर्म बनाने की कोशिश कर रहा हूं। जब शिपिंग पते पर एक चेकबॉक्स चेक किया जाता है, तो मैं उस पते पर होने से फॉर्म सत्यापन को छोड़ना चाहता हूं।सिम्फनी

मैंने नीचे दिए गए फॉर्म प्रकार को टॉगल विकल्प के साथ बनाया है जो चेकबॉक्स को प्रदर्शित और सौदा करेगा, हालांकि फॉर्म चेक किए जाने पर भी मान्य है।

सिम्फनी में documentation on how to implement such a form है, और भले ही मेरे पास लगभग एक ही कोड है, सत्यापन के दौरान सत्यापन बंद नहीं किया गया है। मैं सत्यापन समूहों का उपयोग नहीं कर रहा हूं, इसलिए मैं इकाई पर सत्यापन अक्षम करने के लिए डिफ़ॉल्ट समूह को अक्षम करता हूं।

AddressTypeAddress वर्ग के लिए एक फार्म (जो NotBlank और Callback जैसे कुछ क्षेत्रों पर एनोटेशन की कमी है) का निर्माण।

$addressForm = $this 
    ->createFormBuilder([ 
     "paymentAddress" => $paymentAddress, 
     "shippingAddress" => $shippingAddress 
    ]) 
    ->add("paymentAddress", AddressType::class, [ 
     "label" => false 
    ]) 
    ->add("shippingAddress", AddressType::class, [ 
     "label" => false, 
     "toggle" => "Use payment address" 
    ]) 
    ->add("submit", SubmitType::class, [ 
    ]) 
    ->getForm(); 

मैं अब कुछ घंटों के लिए इस पर चल रहा है, लेकिन मैं क्यों सत्यापन बंद नहीं किया जा रहा है अनुमान करने में सक्षम नहीं हूँ, और मैं:

class AddressType extends AbstractType 
{ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     if ($options["toggle"]) { 
      $builder->add("toggle", CheckboxType::class, [ 
       "mapped" => false, 
       "required" => false, 
       "label" => $options["toggle"] 
      ]); 
     } 

     $builder 
      ->add("name", TextType::class, [ 
       "required" => !$options["toggle"] 
      ]) 
      ->add("address", TextType::class, [ 
       "required" => !$options["toggle"] 
      ]) 
      ->add("zipcode", TextType::class, [ 
       "label" => "Postcode", 
       "required" => !$options["toggle"] 
      ]) 
      ->add("city", TextType::class, [ 
       "required" => !$options["toggle"] 
      ]) 
      ->add("countryCode", ChoiceType::class, [ 
       "choices" => Address::COUNTRY_CODES 
      ]); 
    } 

    public function configureOptions(OptionsResolver $resolver) 
    { 
     $resolver->setDefaults([ 
      "toggle" => false, 
      "data_class" => Address::class, 
      "validation_groups" => function(FormInterface $form) { 
       if ($form->has("toggle") && $form->get("toggle")->getData() === true) { 
        return []; 
       } 

       return ["Default"]; 
      } 
     ]); 

     $resolver->setAllowedTypes("toggle", ["bool", "string"]); 
    } 
} 

मैं इस तरह प्रकार का उपयोग करें मैं इस छोटे से विस्तार पर एक फार्म बनाने के लिए तैयार नहीं हूँ।

AddressType के लिए सत्यापन क्यों कॉन्फ़िगरेशन में बंद होने से बंद नहीं है? यदि यह सिर्फ यह नहीं है कि यह कैसे काम करता है, तो आंशिक रूप से एक साफ तरीके से सत्यापन को बंद करने के लिए एक बेहतर समाधान क्या होगा?

संपादित करें: भले ही "validation_groups" => false को डिफॉल्ट में, बिल्डर में बनाए गए बच्चों में या फ़ॉर्म के उपयोग में सेट करने के बावजूद सत्यापन अभी भी होगा। इसे बंद करने के साथ नहीं करना है। सिम्फनी के अपने संसाधन सहित प्रत्येक ऑनलाइन संसाधन में कहा गया है कि इसे काम करना चाहिए ...

उत्तर

2

[...] इसलिए मैं इकाई पर सत्यापन अक्षम करने के लिए डिफ़ॉल्ट समूह को अक्षम करता हूं।

यह मानते हुए कि Address गुण & की कमी इस तरह दिखेगा:

/** 
* @Assert\NotBlank() 
*/ 
private $name; 

// etc. 

"सत्यापनकर्ता" मानता है कि इन गुणों, Default समूह के साथ मूल्यांकन किया जाएगा, क्योंकि वह हमेशा मानता है खाली validation_groups (जैसे return [];) के रूप में ['Default'] (इसलिए चेक किए जाने पर सत्यापन बंद नहीं किया गया है):

https://symfony.com/doc/current/validation/groups.html: यदि कोई समूह निर्दिष्ट नहीं है, तो समूह Default से संबंधित सभी बाधाओं को लागू किया जाएगा।

एक समाधान एक सुव्यवस्थित ढंग से सत्यापन को बंद करने के लिए आंशिक रूप पूरा करने के लिए

वहाँ इसे प्राप्त करने के कई तरीके होना चाहिए, लेकिन मैं आपको उनमें से दो को दिखाने:

  1. तो कोई भी data_class रूट फॉर्म पर सेट है, तो Form समूह केवल इस स्तर को सत्यापित करने के लिए उपलब्ध है:

    $addressForm = $this 
        ->createFormBuilder([...], [ 
         'validation_groups' => 'Form', // <--- set 
        ]) 
    

    इसके बाद, configureOptions विधि में, डिफ़ॉल्ट के रूप में Address समूह और Form समूह सेट करता है, तो "टॉगल" चेक किया गया है, यह भी झरना सत्यापन के लिए Valid() बाधा जोड़ता है:,

    public function configureOptions(OptionsResolver $resolver) 
    { 
        $resolver->setDefaults([ 
         // ... 
         "validation_groups" => function(FormInterface $form) { 
          if ($form->has("toggle") && $form->get("toggle")->getData() === true) { 
           return ['Form']; // <--- set 
          } 
    
          return ['Address']; // <--- set 
         }, 
         'constraints' => [new Assert\Valid()], // <--- set 
        ]); 
    } 
    

    इसका मतलब है कि टॉगल बंद के साथ प्रस्तुत पर: Form और Address समूह पते फ़ील्ड पर लागू होते हैं, अन्यथा, केवल Form समूह लागू होता है।

  2. (एक और तरीका है) Address वर्ग ऐड में "आवश्यक" सभी बाधाओं के समूह है, यह Default समूह के साथ इन गुणों को मान्य से बचा जाता है:

    /** 
    * @Assert\NotBlank(groups={"Required"}) // <--- set 
    */ 
    private $name; 
    
    // etc. 
    

    इसके बाद, configureOptions विधि में डिफॉल्ट समूह और Default अगर के रूप में Required सेट टॉगल चेक किया गया है:

    public function configureOptions(OptionsResolver $resolver) 
    { 
        $resolver->setDefaults([ 
         // ... 
         "validation_groups" => function(FormInterface $form) { 
          if ($form->has("toggle") && $form->get("toggle")->getData() === true) { 
           return ['Default']; // <--- set 
          } 
    
          return ['Required']; // <--- set 
         }, 
         'constraints' => [new Assert\Valid()], // <--- set 
        ]); 
    } 
    

    इस मामले में, पर टॉगल बंद के साथ प्रस्तुत: Default और Required फ़ील्ड पते फ़ील्ड पर लागू होते हैं, अन्यथा केवल Default समूह, इस प्रकार आवश्यक फ़ील्ड को छोड़कर।

नेस्टेड रूपों है कि जड़ वस्तु से काट दिया वस्तुओं को शामिल करने के लिए new Valid() की कमी विकल्प सेट द्वारा मान्य किया जा सकता है।

+1

आपके विस्तृत उत्तर के लिए धन्यवाद। मैंने पहले से ही सभी बाधाओं में समूहों को जोड़ने की कोशिश की थी और डिफ़ॉल्ट रूप से उन समूहों को validation_groups बंद करने से वापस कर दिया था। मेरे लिए क्या लापता था वैध बाधा थी। यह मेरे लिए नहीं हुआ था कि जोड़े गए क्षेत्र पता टाइप के बच्चे बन जाएंगे और इस प्रकार बाधा की आवश्यकता होगी। – Villermen