2011-12-07 13 views
21

मैं वर्तमान में सिम्फनी 2 फॉर्म घटक का उपयोग करने की कोशिश कर रहा हूं हालांकि सिलेक्स माइक्रोफ्रेमवर्क।सिम्फनी 2 फॉर्म घटक - नाम विशेषता में फॉर्म नाम के बिना फ़ील्ड बनाना

मेरा प्रवेश फार्म के रूप में उत्पन्न होता है इस प्रकार है:

$app = $this->app; 

$constraint = new Assert\Collection(array(
    'username' => new Assert\NotBlank(), 
    'password' => new Assert\NotBlank(), 
)); 

$builder = $app['form.factory']->createBuilder('form', $data, array('validation_constraint' => $constraint)); 

$form = $builder 
    ->add('username', 'text', array('label' => 'Username')) 
    ->add('password', 'password', array('label' => 'Password')) 
    ->getForm() 
; 

return $form; 

मुद्दा यह है कि जिसके परिणामस्वरूप प्रपत्र इस प्रकार बनाया जा रहा है है:

<fieldset> 
    <input type="hidden" value="******" name="form[_token]" id="form__token"> 
    <section class=""> 
     <label class=" required" for="form_username">Username</label> 
     <div><input type="text" value="" name="form[username]" id="form_username" class="text"></div> 
    </section> 
    <section class=""> 
     <label class=" required" for="form_password">Password</label> 
     <div><input type="password" value="" name="form[password]" id="form_password" class="password"></div> 
    </section> 
    <section> 
     <div><button class="fr submit">Login</button></div> 
    </section> 
</fieldset> 

जबकि मैं नाम चाहते हैं और आईडी के रूप में होने के लिए जिम्मेदार बताते हैं निम्नानुसार:

<div><input type="text" value="" name="username" id="username" class="text"></div> 
... 
<div><input type="password" value="" name="password" id="password" class="password"></div> 

मैंने वेब को खराब कर दिया है और 'property_path' opti पर सलाह खोज ली है परन्तु मेरा मानना ​​है कि यह वास्तविक सिम्फनी 2 ढांचे में उपयोग किए जाने पर डेटा को संसाधित करने के लिए उपयोग की जाने वाली कक्षा के साथ करना है।

मैं फार्म घटक फ़ाइलें और बिंदु जो के रूप में सेट किया जा रहा है में है के माध्यम से किया गया है:

Symfony/घटक/प्रपत्र/एक्सटेंशन/कोर/प्रकार/FieldType.php - लाइन 71

public function buildView(FormView $view, FormInterface $form) 
{ 
    $name = $form->getName(); 

    if ($view->hasParent()) { 
     $parentId = $view->getParent()->get('id'); 
     $parentFullName = $view->getParent()->get('full_name'); 
     $id = sprintf('%s_%s', $parentId, $name); 
     $fullName = sprintf('%s[%s]', $parentFullName, $name); 
    } else { 
     $id = $name; 
     $fullName = $name; 
    } 
    ... 

अनजाने में फॉर्मफैक्टरी फॉर्मबिल्डर का उपयोग करता है जो तब फॉर्म क्लास के साथ काम करता है और मेरे पास घटक की संपूर्ण आंतरिक कार्यप्रणाली का विश्लेषण करने के लिए पर्याप्त समय नहीं है।

मुझे पता है कि फ़ील्ड को बिल्डबिल्डर के भीतर 'बच्चों' सरणी में विकल्पों की एक समान सूची के साथ जोड़ा जाता है। जब GetForm फ़ंक्शन को कॉल किया जाता है, तो एक नया फॉर्म तत्काल होता है और प्रत्येक बच्चे फ़ील्ड टाइप को ऐड() विधि का उपयोग करके फ़ॉर्म में दर्ज किया जाता है। यह फार्म> जोड़ने() विधि स्वचालित रूप से प्रत्येक बच्चे के माता पिता के रूप पर्चा सेट:

public function add(FormInterface $child) 
{ 
    $this->children[$child->getName()] = $child; 

    $child->setParent($this); 

    if ($this->dataMapper) { 
     $this->dataMapper->mapDataToForm($this->getClientData(), $child); 
    } 

    return $this; 
} 

बस केवल फ़ील्ड नाम प्रदर्शित का सबसे अच्छा तरीका के इस करता है किसी और पता है कि दूर करने के लिए इन कक्षाओं ओवरराइड करने के लिए शुरू करने के बिना ?

form_div_layout.html.twig widget_attributes ब्लॉक में 'full_name' के बजाय 'नाम' खींचना संभव है, लेकिन मुझे यकीन नहीं था कि यह आदर्श था (जैसे आईडी अपरिवर्तित बनी हुई है) या यदि वहां था एक और तरीका या इंजेक्शन योग्य विकल्प जो चाल करेगा।

उत्तर

24
createBuilder समारोह उपयोग करने के बजाय

:

$builder = $app['form.factory']->createNamedBuilder(null, 'form', $data, array('validation_constraint' => $constraint)); 

पहले पैरामीटर प्रपत्र नाम किया जा रहा है।

https://stackoverflow.com/a/13474522/520114

+0

अहह, अब मैं जिथूब पर क्यों नहीं देखा, जो समझ में आया होगा। धन्यवाद :) – thingygeoff

+0

@thingygeoff ताकि आप इस उत्तर को स्वीकार कर सकें :) – j0k

+0

आह हे! आपने अपना उत्तर अपडेट किया है - एक आदर्श समाधान! धन्यवाद – thingygeoff

7

पर बर्नहार्ड Schussek खुद से उदाहरण आप बच्चे रूपों का उपयोग नहीं कर रहे हैं, तो आप रिक्त स्ट्रिंग के रूप में अपने फार्म की getName विधि सेट कर सकते हैं:

class FormType extend AbstractType { 
    // ... 

    public function getName() { 
     return ''; 
    } 
} 
25

Symfony3 में, AbstractType ओवरराइड :: में getBlockPrefix बच्चे की कक्षा शून्य वापस करने के लिए।

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