2013-10-28 6 views
6

मैं विज्ञापन के लिए एक पृष्ठ बना रहा हूं। एक विज्ञापन विभिन्न प्रकार के हो सकता है और इसलिए अलग-अलग डेटा हो सकते हैं। उदाहरण के लिए, एक वाहन में make और model अतिरिक्त डेटा के रूप में होगा।गतिशील रूप (स्विच इकाई) symfony2

अभी, मेरे पास एक आधार सिद्धांत इकाई Advert है जिसमें प्रत्येक विज्ञापन की आवश्यकता होती है। बदले में अलग-अलग विज्ञापन इस डेटा को निष्क्रिय करते हैं (doctrine2 discriminatormap)

यदि उपयोगकर्ता वाहन विज्ञापन बनाने का विकल्प चुनता है तो मैं गतिशील रूप से फॉर्म (एजेक्स और सिम्फनी 2 रूपों के साथ) को पॉप्युलेट करना चाहता हूं, मैं वाहन विज्ञापन के विकल्पों को प्रदर्शित करना चाहता हूं। लेकिन मुझे इकाई को AdvertVehicle के रूप में बदलने की भी आवश्यकता है।

क्या यह संभव है? मैं symfony2 मुखपृष्ठ

पर रसोई की किताब प्रविष्टि पढ़ा है "कैसे गतिशील रूप से प्रपत्र फार्म घटनाक्रम का उपयोग करते हुए संशोधित करने के लिए": यह एक AJAX कॉल आपके आवेदन को वापस करने से संभाला जाना चाहिए। उस नियंत्रक में, आप अपना फॉर्म जमा कर सकते हैं, लेकिन इसे संसाधित करने के बजाय, अपडेट किए गए फ़ील्ड को प्रस्तुत करने के लिए सबमिट किए गए फॉर्म का उपयोग करें। AJAX कॉल से प्रतिक्रिया का उपयोग दृश्य को अद्यतन करने के लिए किया जा सकता है।

मैं समझता हूँ कि मेरे नियंत्रक करने के लिए वापस एक ajax कॉल करने के लिए, और मैं कैसे फार्म घटनाओं का उपयोग करने समझते हैं लेकिन मैं कैसे एक प्रदान की गई चुनिंदा-बॉक्स से प्रतिक्रिया प्राप्त करते हैं (उदाहरण के लिए वाहन मॉडल युक्त) वापस ? एक नया सार टाइप के साथ? या फॉर्मबिल्डर?

और फिर जब उपयोगकर्ता वास्तव में फॉर्म सबमिट करता है तो मुझे चयनित विज्ञापन प्रकार की इकाई का उपयोग करने की आवश्यकता होती है। क्या मैं इकाई के विकल्प के अनुसार गतिशील रूप से इकाई को बदल सकता हूं?

संपादित करें मैंने फ़ॉर्म को अनन्तता की जांच की है, धन्यवाद। मैं AdvertType का विस्तार करता हूं और buildForm() विधि को ओवरराइड करता हूं और इससे पहले कि मैं AdvertVehicleType के लिए आवश्यक वस्तुओं को जोड़ूं, मैं मूल विधि को कॉल करता हूं।

बारे में अन्य स्पष्टीकरण हर विज्ञापन इकाई price, description, title और category शामिल हैं। कुछ विज्ञापन में make और model जैसे अधिक शामिल हैं। वे discriminatormap (doctrine2) द्वारा विभेदित होते हैं

उदाहरण: उपयोगकर्ता श्रेणी cars मैं (मान्यता और दृढ़ता के लिए) CarAdvert इकाई का उपयोग करना चाहते का चयन करता है

// -- Entity 
class CarAdvert extends Advert { 

    protected $model; 
    protected $make; 

} 

// -- Entity 
// -- This uses discriminator mapping 
class Advert { 
    protected $title; 
    protected $description; 
    protected $price; 
    protected $category; 
} 

यदि उपयोगकर्ता घर का चयन करता है, तो itemcategory पकड़ो मैं सिर्फ सामान्य Advert इकाई का उपयोग करना चाहता हूं।

एक बड़ी समस्या अभी भी है कि मैं यह नहीं समझ सकता कि AJAX के माध्यम से विस्तारित फ़ॉर्म को कैसे प्रस्तुत किया जाए। इस भाग पर कोई सुझाव? जब उपयोगकर्ता एक श्रेणी के रूप में कार का चयन करता है, तो मैं फॉर्म को अपडेट करना चाहता हूं (jQuery/AJAX के माध्यम से) लेकिन मैं एक नियंत्रक कैसे बना सकता हूं जो केवल फॉर्म के विस्तारित भाग को पुनर्प्राप्त करता है और HTML को प्रतिक्रिया के रूप में वापस भेजता है (बिना टहलने के और इसे एक दृश्य में प्रस्तुत करना, क्या यह संभव है)?

समाधान:

देखें नीचे का जवाब!

+1

आप अपने फॉर्म प्रकारों में विरासत का उपयोग कर सकते हैं, यह 2 समान रूपों के लिए कोड डुप्लिकेट करने से बचाता है। उदाहरण: 'विज्ञापन प्रकार' 2 फ़ील्ड है 2 विज्ञापन जोड़ने के लिए 'AdvertVehicleType'' AdvertType' बढ़ा सकता है। कृपया हमें अपनी संस्थाओं के बारे में और बताएं, उन्हें कैसे घोषित किया जाता है, आप दो प्रकार के 'विज्ञापन' इत्यादि को कैसे अलग करते हैं, –

+0

इस प्रश्न @ एस्बेस्टोस पर कोई भी अपडेट? मुझे एक समान समस्या का सामना करना पड़ रहा है, इसलिए मुझे इस मुद्दे के साथ एक संभावित समाधान या अनुभव में दिलचस्पी है .. धन्यवाद! – acrobat

+1

मुझे आशा है कि अद्यतन उत्तर पर्याप्त है @acrobat यदि आपको अधिक जानकारी चाहिए तो एक और टिप्पणी छोड़ने में संकोच नहीं करें! – Asbestos

उत्तर

2

समाधान:

मेरी समस्या का हल मुद्दा जहां मैं एक से "मक्खी पर" इकाई और फार्म को बदलने में सक्षम होना चाहता हूँ हल करने के लिए नियंत्रक में कुछ अतिरिक्त कार्यों का निर्माण करना था उपयोगकर्ता द्वारा चयन ..

public function indexAction(Request $request) 
{ 
    $form = $this->getForm($request); 
    $form->handleRequest($request); 

    return array(
      'form' => $form->createView(), 
      'request' => $request->request, 
    ); 
} 

कहाँ getForm (एक "डिफ़ॉल्ट" विज्ञापन के लिए वाहनों के लिए जैसे AdvertVehicleType या AdvertType) रूप है, प्राप्त करता है।

getForm विधि इस प्रकार है:

private function getForm(Request $request) 
{ 
    $categoryTitle = 'NONE'; 
    $categoryId = $request->request->get('advert', false)['category']; 

    if ($categoryId) { 
     $categoryTitle = $this->getDoctrine()->getRepository('Bundle:Category')->find($categoryId)->getTitle(); 
    } 

    return $this->createForm($this->getFormType($categoryTitle), $this->getEntity($categoryTitle)); 

}

यहाँ

मैं categoryID (उस अनुरोध में रूप में चयन किया जाता है) को पुनः प्राप्त और getFormTypeand getEntity साथ संस्था के साथ formType retreives।

private function getEntity($categoryTitle) 
{ 
    $entity = new Advert(); 
    switch ($categoryTitle) { 
     case Category::CARS: 
      $entity = new AdvertCar(); 
    } 

    return $entity; 
} 

private function getFormType($categoryTitle) 
{ 
    switch ($categoryTitle) { 
     case Category::CARS: 
      return new AdvertCarType(); 
     default: 
      return new AdvertType(); 
    } 
} 

(लेकिन यह भी उपयोगकर्ता फ़ॉर्म सबमिट करने की कोशिश करता है, तो काम करता है) ajax के साथ "मक्खी पर" इस ​​अद्यतन करने के लिए सक्षम होने के लिए मैं नियंत्रक में एक और कार्रवाई बनाया।

यह क्रिया उस फ़ॉर्म के हिस्सों को प्रस्तुत करती है जिसे मैं अपडेट करना चाहता हूं (AJAX कॉल पर), मैं वास्तव में यह चुनता हूं कि मुझे फॉर्म में क्या जरूरत नहीं है, जिससे फ़ॉर्म ऑब्जेक्ट्स को इस तरह प्रस्तुत करने के लिए सेट किया गया है:

{% do form.title.setRendered %} 

(यह सिर्फ एक उदाहरण मैं वास्तव में सभी प्रपत्र वस्तुओं है कि मैं रेंडर करने के लिए नहीं करना चाहते हैं के लिए ऐसा है

मैं तो बस सिर्फ फोन:।

{{ form_rest(form) }} 

जो विभिन्न श्रेणियों के लिए अलग-अलग रूप के "आराम" को पुनर्प्राप्त करेगा।

अब मान लें कि आपके पास राज्य और शहर चुनने के लिए है। सबसे पहले राज्य का चयन करें, फिर आप उस राज्य के लिए शहरों को ट्रिग में प्रस्तुत करते हैं (लेकिन फिर आप वास्तव में केवल उस भाग को प्रस्तुत कर सकते हैं, उदाहरण के लिए {{ form_row(form.towns) }} और आप इस प्रस्तुत टेम्पलेट को जेसन-प्रतिक्रिया के रूप में वापस कर दें और इसे उस div में डालें जो आप चाहते हैं jQuery।

$html = $this->renderView('@Bundle/NewAddPage/filter_area.twig', array('form' => $form->createView())); 

और फिर जवाब में $ एचटीएमएल चर लौटने।

मुझे आशा है कि इस मदद करता है, और स्पष्टीकरण काफी अच्छा, यह है कि अगर सिर्फ एक टिप्पणी कर नहीं है और मैं के साथ इस अपडेट कर देंगे मेरा जवाब!

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