मेरे पास एक इकाई Product
है। मेरे उत्पाद में विभिन्न भाषाओं में कई नाम हो सकते हैं। फ्रेंच में एक नाम, अंग्रेजी में एक नाम, आदि। मैं एक स्वचालित अनुवाद का उपयोग नहीं करना चाहता।Symfony3: ऑब्जेक्ट्स की सरणी से भरा विकल्प प्रकार फ़ील्ड
उपयोगकर्ता को उत्पाद फ़ॉर्म में नाम लिखना होगा और इसी भाषा का चयन करना होगा। वह बहुत सारे नाम जोड़ सकता है क्योंकि वह एक ऐड बटन के लिए धन्यवाद चाहता है।
सभी भाषाएं व्यवस्थापक उपयोगकर्ता (किसी अन्य रूप में) द्वारा बनाई गई हैं। तो, Language
भी एक संस्था है जिसका नाम (पूर्व: अंग्रेजी) और एक कोड (पूर्व: एन) है।
मैंने एंटिटी ProductName
बनाया है जिसमें एक नाम और एक भाषा है (जो उत्पाद के रूप में उपयोगकर्ता लिखता है)।
उस स्थिति में, मुझे इकाई ProductName
एंटिटी Language
के साथ संबद्ध करने की आवश्यकता नहीं है। मुझे बस भाषा कोड चाहिए।
/**
* @ORM\Column(name="Language_Code", type="string", length=2)
*/
private $language;
मेरे उत्पाद फार्म (ProductType) कई नाम जोड़ने के लिए एक CollectionType क्षेत्र है: तो, मेरी ProductName
इकाई में, मैं इस संपत्ति है।
// Form/ProductType.php
->add('infos', CollectionType::class, array(
'entry_type' => ProductInfosType::class,
'allow_add' => true,
'allow_delete' => true,
'prototype' => true,
'label' => false,
'mapped' => false
))
और ProductInfosType प्रपत्र 2 फ़ील्ड होते हैं:
// Form/ProductInfosType.php
->add('name', TextType::class, array(
'attr' => array('size' => 40)
))
->add('language', EntityType::class, array(
'placeholder' => '',
'class' => 'AppBundle:Language',
'choice_label' => 'code',
'attr' => array('class' => 'lang'),
'query_builder' => function (EntityRepository $er) {
return $er->createQueryBuilder('l')->orderBy('l.code', 'ASC');
}
))
तो, जब मैं अपने प्रपत्र पृष्ठ पर जाओ, मैं एक ब्लॉक है जो एक इनपुट पाठ फ़ील्ड (नाम) और कुछ चुने हुए क्षेत्र शामिल है (भाषा)। चुनिंदा क्षेत्र इस तरह है:
<select id="product_infos_0_language" required="required" name="product[infos][0][language]">
<option value=""></option>
<option value="DE">DE</option>
<option value="EN">EN</option>
<option value="ES">ES</option>
<option selected="selected" value="FR">FR</option>
</select>
इस बिंदु पर, सब कुछ अच्छी तरह से काम करता है। मैंने एक एड बटन बनाया है ताकि उपयोगकर्ता अन्य नाम, आदि ...
पर, लेकिन जब मैं फॉर्म सबमिट करता हूं, जब मैं अपने उत्पाद नियंत्रक में फॉर्म डेटा जांचता हूं, तो मैंने देखा कि यह मेरे अनुरूप नहीं है। डेटाबेस में स्टोर करना चाहते हैं।
print_r($form->get('infos')->getData());
// returns :
Array
(
[0] => AppBundle\Entity\ProductName Object
(
[language:AppBundle\Entity\ProductName:private] => AppBundle\Entity\Language Object
(
[code:AppBundle\Entity\Language:private] => FR
[name:AppBundle\Entity\Language:private] => Français
)
[name:AppBundle\Entity\ProductName:private] => Ceinture lombaire LombaSkin
)
)
क्या मैं चाहते हैं:
Array
(
[0] => AppBundle\Entity\ProductName Object
(
[language:AppBundle\Entity\ProductName:private] => FR
[name:AppBundle\Entity\ProductName:private] => Ceinture lombaire LombaSkin
)
)
मैं भाषा वस्तु नहीं करना चाहती लेकिन सीधे भाषा कोड!
यही कारण है कि मुझे लगता है कि मुझे ProductNameType रूप में EntityField
का उपयोग नहीं करना चाहिए, लेकिन ChoiceType
फ़ील्ड।
मैं पसंद क्षेत्र में डीबी में संग्रहीत सभी भाषाओं को कैसे लोड कर सकता हूं? मुझे आशा है कि इस स्पष्टीकरण अधिक समझ में आता है ;-)
यदि मैं अच्छी तरह से समझता हूं: क्या आपने '__toString()' विधि बनाने की कोशिश की है जो आपकी 'कोड' इकाई 'भाषा' इकाई को वापस लाती है? – Delphine
नहीं। मुझे नहीं लगता कि यह मेरी मदद करता है। मेरी भाषा का कोड पहले से ही एक स्ट्रिंग है। पूर्व: नाम = अंग्रेजी और कोड = एन। जब मैं अपना फॉर्म सबमिट करता हूं तो ऑब्जेक्ट प्राप्त करने के बजाय, मुझे बस उस सूची को चाहिए जो मैंने अपनी सूची में चुना था। – Felurian
मुझे वास्तव में समझ में नहीं आता है कि – Delphine