क्या टेक्स्ट फ़ॉर्म फ़ील्ड के लिए डिफ़ॉल्ट मान सेट करने का एक आसान तरीका है?
क्या टेक्स्ट फ़ॉर्म फ़ील्ड के लिए डिफ़ॉल्ट मान सेट करने का एक आसान तरीका है?
जवाबों:
निर्माण के दौरान आसानी से उपयोग किया जा सकता है:
->add('myfield', 'text', array(
'label' => 'Field',
'empty_data' => 'Default value'
))
'data''value'
empty_data
dataबेकार है - यह सहेजे गए मूल्य को अधिलेखित करता है। empty_dataमान प्रदर्शित नहीं करता है, यह खाली मान सबमिट पर इसका उपयोग करता है और अनियंत्रित विकल्पों को सहेजना असंभव बनाता है।
आप के साथ डिफ़ॉल्ट मान सेट कर सकते हैं empty_data
$builder->add('myField', 'number', ['empty_data' => 'Default value'])
मैंने अतीत में कुछ बार इस पर विचार किया है, इसलिए मैंने सोचा है कि मैंने उन विभिन्न विचारों को दबा दिया है जिनका मैंने उपयोग / उपयोग किया है। कुछ का उपयोग हो सकता है, लेकिन कोई भी "सही" Symfony2 समाधान नहीं हैं।
कंस्ट्रक्टर एंटिटी में आप $ यह कर सकते हैं-> सेटबार ('डिफ़ॉल्ट मान'); लेकिन यह हर बार आपको इकाई को लोड करने के लिए कहा जाता है (डीबी या नहीं) और थोड़ा गड़बड़ है। हालाँकि यह हर क्षेत्र के प्रकार के लिए काम करता है क्योंकि आप तिथियां बना सकते हैं या आपको और कुछ भी चाहिए।
अगर बयान के भीतर मैं नहीं होगा, लेकिन आप कर सकते हैं।
return ( ! $this->hasFoo() ) ? 'default' : $this->foo;
फैक्टरी / उदाहरण । एक स्थिर फ़ंक्शन / द्वितीयक वर्ग को कॉल करें जो आपको डेटा के साथ एक डिफ़ॉल्ट एंटिटी पूर्व-आबादी प्रदान करता है। उदाहरण के लिए
function getFactory() {
$obj = new static();
$obj->setBar('foo');
$obj->setFoo('bar');
return $obj;
}
यदि आप अतिरिक्त फ़ील्ड जोड़ते हैं तो वास्तव में आदर्श नहीं है, तो आपको इस फ़ंक्शन को बनाए रखना होगा, लेकिन इसका मतलब यह है कि आप डेटा सेटर्स / डिफ़ॉल्ट को अलग कर रहे हैं और जो db से उत्पन्न होता है। इसी तरह आपके पास कई getFactories हो सकते हैं, जिन्हें आपको अलग-अलग डिफ़ॉल्ट डेटा चाहिए।
विस्तारित / परावर्तन संस्थाएं एक विस्तारित इकाई बनाएँ (जैसे FooCreate Foo का विस्तार करता है) जो आपको समय पर (निर्माणकर्ता के माध्यम से) डिफ़ॉल्ट डेटा देता है। फैक्टरी / उदाहरण के विचार के समान ही एक अलग दृष्टिकोण है - मैं व्यक्तिगत रूप से स्थिर तरीकों को पसंद करता हूं।
बिल्ड फॉर्म से पहले डेटा सेट करें कंस्ट्रक्टर्स / सर्विस में, आप जानते हैं कि क्या आपके पास एक नई इकाई है या यदि यह डीबी से पॉपुलेटेड है। जब आप एक नई इकाई को पकड़ते हैं तो यह विभिन्न क्षेत्रों पर सेट डेटा को कॉल करने के लिए प्रशंसनीय है। उदाहरण के लिए
if( ! $entity->isFromDB() ) {
$entity->setBar('default');
$entity->setDate( date('Y-m-d');
...
}
$form = $this->createForm(...)
प्रपत्र घटनाएँ जब आप प्रपत्र बनाते हैं तो आप फ़ील्ड बनाते समय डिफ़ॉल्ट डेटा सेट करते हैं। आप PreSetData इवेंट श्रोता इस उपयोग को ओवरराइड करते हैं। इसके साथ समस्या यह है कि आप फॉर्म वर्कलोड / डुप्लिकेटिंग कोड को डुप्लिकेट कर रहे हैं और इसे बनाए रखना / समझना कठिन बना रहे हैं।
विस्तारित प्रपत्र प्रपत्र ईवेंट के समान, लेकिन यदि आप एक db / नई निकाय है, तो इसके आधार पर आप भिन्न प्रकार को कॉल करते हैं। इससे मेरा मतलब है कि आपके पास FooType है जो आपके एडिट फॉर्म को परिभाषित करता है, BarType FooType को बढ़ाता है और सभी डेटा को फ़ील्ड्स पर सेट करता है। अपने कंट्रोलर में आप फिर से टाइप करने के लिए कौन सा फॉर्म चुनें। यह बेकार है अगर आपके पास एक कस्टम विषय है और घटनाओं की तरह, मेरी पसंद के लिए बहुत अधिक रखरखाव बनाता है।
Twig आप अपना स्वयं का विषय बना सकते हैं और मूल्य विकल्प का उपयोग करके डेटा को डिफ़ॉल्ट कर सकते हैं जब आप इसे प्रति-क्षेत्र के आधार पर करते हैं। फॉर्म थीम में इसे लपेटने से कुछ भी नहीं होता है या तो आपको अपने टेम्प्लेट को साफ रखना चाहिए और फॉर्म को फिर से उपयोग करना चाहिए। जैसे
form_widget(form.foo, {attr: { value : default } });
जे एस यह एक जे एस समारोह के साथ फार्म को भरने के लिए है, तो फ़ील्ड रिक्त हैं तुच्छ होगा। आप उदाहरण के लिए प्लेसहोल्डर्स के साथ कुछ कर सकते हैं। यह एक बुरा, बुरा विचार है।
एक सेवा के रूप में फ़ॉर्म जो मैंने किए बड़े प्रोजेक्ट्स में से एक के लिए, मैंने एक ऐसी सेवा बनाई जो सभी रूपों को उत्पन्न करती है, सभी प्रसंस्करण आदि करती है। ऐसा इसलिए था क्योंकि रूपों का उपयोग कई वातावरणों में कई नियंत्रकों में किया जाना था और प्रपत्रों के अनुसार एक ही तरीके से उत्पन्न / संभाला गया, उन्हें अलग तरह से प्रदर्शित किया गया / बातचीत की गई (जैसे त्रुटि से निपटने, पुनर्निर्देशन आदि)। इस दृष्टिकोण की सुंदरता यह थी कि आप डेटा को डिफ़ॉल्ट कर सकते हैं, आपको जो कुछ भी चाहिए, वह सब कुछ सामान्य रूप से त्रुटियों को संभालना होगा और यह सभी एक ही स्थान पर एन्क्रिप्टेड हैं।
निष्कर्ष जैसा कि मैंने इसे देखा है, आप एक ही मुद्दे पर समय और समय में फिर से चलेंगे - जहां डिफ़ॉल्ट डेटा रहने के लिए है?
उस अंत तक, मैं हर बार समस्या से अलग तरीके से संपर्क करता हूं। उदाहरण के लिए, एक साइनअप फॉर्म "न्यूज़लेटर" विकल्प आसानी से (और तार्किक रूप से) फॉर्म बनाने से ठीक पहले कंस्ट्रक्टर में सेट किया गया है। जब मैं फॉर्म कलेक्शन बना रहा था जो एक साथ जुड़े हुए थे (जैसे अलग-अलग प्रकार के रेडियो बटन एक साथ जुड़े हुए हैं) तो मैंने इवेंट श्रोताओं का उपयोग किया है। जब मैंने एक अधिक जटिल इकाई (उदाहरण के लिए जिसे बच्चों या बहुत से डिफ़ॉल्ट डेटा की आवश्यकता होती है) बनाया है, तो मैंने इसे बनाने के लिए एक फ़ंक्शन (उदाहरण के लिए 'getFactory') का उपयोग किया है क्योंकि मुझे इसकी आवश्यकता है।
मुझे नहीं लगता कि हर बार जब मैंने यह आवश्यकता की है तो एक "सही" दृष्टिकोण है, यह थोड़ा अलग है।
सौभाग्य! मुझे आशा है कि मैंने आपको किसी भी दर पर कुछ खाने के लिए दिया है और बहुत अधिक नहीं हुआ है;)
यदि आपको डिफ़ॉल्ट मान सेट करने की आवश्यकता है और आपका फॉर्म इकाई से संबंधित है, तो आपको निम्नलिखित दृष्टिकोण का उपयोग करना चाहिए:
// buildForm() method
public function buildForm(FormBuilderInterface $builder, array $options) {
$builder
...
->add(
'myField',
'text',
array(
'data' => isset($options['data']) ? $options['data']->getMyField() : 'my default value'
)
);
}
अन्यथा, myFieldहमेशा इकाई से मान प्राप्त करने के बजाय, डिफ़ॉल्ट मान पर सेट किया जाएगा।
$options['data']->getMyField()साथ बदलें$option['data']['myField']
empty_data: यह विकल्प निर्धारित करता है कि जमा मूल्य खाली होने पर फ़ील्ड किस मूल्य पर लौटेगी। यह एक प्रारंभिक मान सेट नहीं करता है
आप अपने मॉडल वर्ग में संबंधित फ़ील्ड के लिए डिफ़ॉल्ट सेट कर सकते हैं (परिभाषा मैपिंग में या स्वयं मान सेट करें)।
इसके अलावा, FormBuilder आपको सेटडेटा () विधि के साथ प्रारंभिक मान सेट करने का मौका देता है । फॉर्म बिल्डर को आपके फॉर्म वर्ग के createForm () पद्धति में पास किया जाता है।
इसके अलावा, इस लिंक की जाँच करें: http://symfony.com/doc/current/book/forms.html#using-a-form-without-a-class
यदि आपका फॉर्म किसी इकाई के लिए बाध्य है, तो निर्माण विधि का उपयोग करके इकाई पर डिफ़ॉल्ट मान को निर्धारित करें:
public function __construct()
{
$this->field = 'default value';
}
'mapped' => false)। setData(...)इनके लिए उपयोग करें ।
दृष्टिकोण 1 ( http://www.cranespud.com/blog/dead-simple-default-values-on-symfony2-forms/ )
बस अपनी इकाई में डिफ़ॉल्ट मूल्य निर्धारित करें, या तो चर घोषणा या निर्माणकर्ता में:
class Entity {
private $color = '#0000FF';
...
}
या
class Entity {
private $color;
public function __construct(){
$this->color = '#0000FF';
...
}
...
}
उपरोक्त लिंक में एक टिप्पणी से 2 दृष्टिकोण, और यह भी दिमित्री के जवाब (स्वीकार नहीं किया गया) से सिम्फनी 2 में फॉर्म फ़ील्ड के लिए डिफ़ॉल्ट मान कैसे सेट करें?
दिमित्री के जवाब से अनुकूलित, फॉर्मब्युलर के साथ फ़ील्ड को जोड़ते समय डेटा विशेषता के लिए डिफ़ॉल्ट मान जोड़ें।
ध्यान दें कि यह मान लेता है कि संपत्ति तभी होगी और जब वह नया होगा, और मौजूदा, इकाई नहीं, तो उसका मूल्य शून्य होगा ।
public function buildForm(FormBuilderInterface $builder, array $options) {
$builder->add('color', 'text', array(
'label' => 'Color:',
'data' => (isset($options['data']) && $options['data']->getColor() !== null) ? $options['data']->getColor() : '#0000FF'
)
);
}
आप डिफ़ॉल्ट मान सेट कर सकते हैं, उदाहरण के लिए, जैसे message:
$defaultData = array('message' => 'Type your message here');
$form = $this->createFormBuilder($defaultData)
->add('name', 'text')
->add('email', 'email')
->add('message', 'textarea')
->add('send', 'submit')
->getForm();
यदि आपका फॉर्म किसी एंटिटी के लिए मैप किया जाता है, तो आप इस तरह जा सकते हैं (जैसे डिफ़ॉल्ट उपयोगकर्ता नाम):
$user = new User();
$user->setUsername('John Doe');
$form = $this->createFormBuilder($user)
->add('username')
->getForm();
किसी भी मामले / दृष्टिकोण के लिए एक सामान्य समाधान, मुख्य रूप से एक वर्ग के बिना एक फॉर्म का उपयोग करके या जब हमें डिफ़ॉल्ट मूल्य निर्धारित करने के लिए किसी भी सेवाओं तक पहुंच की आवश्यकता होती है:
// src/Form/Extension/DefaultFormTypeExtension.php
class DefaultFormTypeExtension extends AbstractTypeExtension
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
if (null !== $options['default']) {
$builder->addEventListener(
FormEvents::PRE_SET_DATA,
function (FormEvent $event) use ($options) {
if (null === $event->getData()) {
$event->setData($options['default']);
}
}
);
}
}
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefault('default', null);
}
public function getExtendedType()
{
return FormType::class;
}
}
और फॉर्म एक्सटेंशन को पंजीकृत करें:
app.form_type_extension:
class: App\Form\Extension\DefaultFormTypeExtension
tags:
- { name: form.type_extension, extended_type: Symfony\Component\Form\Extension\Core\Type\FormType }
उसके बाद, हम defaultकिसी भी रूप में विकल्प का उपयोग कर सकते हैं :
$formBuilder->add('user', null, array('default' => $this->getUser()));
$formBuilder->add('foo', null, array('default' => 'bar'));
उपयोग न करें:
'data' => 'Default value'
यहां पढ़ें: https://symfony.com/doc/current/reference/forms/types/form.html#data
"डेटा विकल्प हमेशा प्रस्तुत करते समय डोमेन डेटा (ऑब्जेक्ट) से लिया गया मूल्य को ओवरराइड करता है। इसका मतलब है कि ऑब्जेक्ट वैल्यू भी ओवरराइड होती है जब फॉर्म पहले से ही बनी हुई ऑब्जेक्ट को एडिट करता है, जिससे फॉर्म सबमिट होने पर यह अपने निरंतर मूल्य को खो देता है।"
निम्न का उपयोग करें:
कहते हैं, इस उदाहरण के लिए, आपके पास एक इकाई फू है, और एक फ़ील्ड "सक्रिय" है (इस उदाहरण में चेकबॉक्स टाइप है, लेकिन प्रक्रिया हर दूसरे प्रकार के लिए समान है), जिसे आप डिफ़ॉल्ट रूप से जांचना चाहते हैं।
अपने FooFormType वर्ग में जोड़ें:
...
use Symfony\Component\Form\FormEvent;
use Symfony\Component\Form\FormEvents;
...
public function buildForm( FormBuilderInterface $builder, array $options )
{
...
$builder->add('active', CheckboxType::class, array(
'label' => 'Active',
));
$builder->addEventListener(
FormEvents::PRE_SET_DATA,
function(FormEvent $event){
$foo = $event->getData();
// Set Active to true (checked) if form is "create new" ($foo->active = null)
if(is_null($foo->getActive())) $foo->setActive(true);
}
);
}
public function configureOptions( OptionsResolver $resolver )
{
$resolver->setDefaults(array(
'data_class' => 'AppBundle:Foo',
));
}
'data' => $data['myfield'] ?? 'Default value'
->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event) {
$form = $event->getForm();
$data = $event->getData();
if ($data == null) {
$form->add('position', IntegerType::class, array('data' => 0));
}
});
$event->setData()फ़ील्ड पढ़ने के बजाय कॉल करने से यह और बेहतर हो सकता है।
बस इसलिए मैं समस्या को समझता हूं।
आप अपनी इकाई में डेटा के आधार पर फ़ॉर्म को बनाने के तरीके को समायोजित करना चाहते हैं। यदि इकाई बनाई जा रही है, तो कुछ डिफ़ॉल्ट मान का उपयोग करें। यदि इकाई मौजूदा है तो डेटाबेस मान का उपयोग करें।
व्यक्तिगत रूप से, मुझे लगता है कि @ मॉलीक्यूलरमैन्स सॉल्यूशन जाने का रास्ता है। मैं वास्तव में कंस्ट्रक्टर में या संपत्ति स्टेटमेंट में डिफ़ॉल्ट मान सेट करूंगा। लेकिन आप उस दृष्टिकोण को पसंद नहीं करते हैं।
इसके बजाय आप इसका अनुसरण कर सकते हैं: http://symfony.com/doc/current/cookbook/form/dynamic_form_od_odification.html
आप अपने प्रपत्र प्रकार पर एक श्रोता को लटकाते हैं और फिर आप अपनी इकाई की जांच कर सकते हैं और बिल्डर को समायोजित कर सकते हैं-> एक नई या मौजूदा इकाई के आधार पर बयान जोड़ सकते हैं। आपको अभी भी अपने डिफ़ॉल्ट मानों को निर्दिष्ट करने की आवश्यकता है, हालांकि आप उन्हें अपने श्रोता में कोड कर सकते हैं। या उन्हें फॉर्म के प्रकार में पास करें।
हालांकि बहुत काम की तरह लगता है। पहले से तय मानों के साथ इकाई को फॉर्म में पास करना बेहतर है।
अक्सर, मैं प्रपत्र जुड़नार का उपयोग करने के लिए डिफ़ॉल्ट मानों के लिए। इस तरह का कारण सबसे आसान नहीं है, लेकिन बहुत आरामदायक है।
उदाहरण:
class LoadSurgeonPlanData implements FixtureInterface
{
public function load(ObjectManager $manager)
{
$surgeonPlan = new SurgeonPlan();
$surgeonPlan->setName('Free trial');
$surgeonPlan->setPrice(0);
$surgeonPlan->setDelayWorkHours(0);
$surgeonPlan->setSlug('free');
$manager->persist($surgeonPlan);
$manager->flush();
}
}
फिर भी, सिम्फनी प्रकार क्षेत्र में विकल्प डेटा है ।
उदाहरण
$builder->add('token', 'hidden', array(
'data' => 'abcdef',
));
एक बहुत ही सरल तरीका है, आप यहाँ पर डिफॉल्ट सेट कर सकते हैं:
$defaults = array('sortby' => $sortby,'category' => $category,'page' => 1);
$form = $this->formfactory->createBuilder('form', $defaults)
->add('sortby','choice')
->add('category','choice')
->add('page','hidden')
->getForm();
यदि आप अपने निर्माण फ़ॉर्म में 'डेटा' सेट करते हैं, तो यह मान आपकी इकाई को संपादित करते समय संशोधित नहीं किया जाएगा।
मेरा समाधान है:
public function buildForm(FormBuilderInterface $builder, array $options) {
// In my example, data is an associated array
$data = $builder->getData();
$builder->add('myfield', 'text', array(
'label' => 'Field',
'data' => array_key_exits('myfield', $data) ? $data['myfield'] : 'Default value',
));
}
अलविदा।
'data' => $data['myfield'] ?? 'Default value',
डिफ़ॉल्ट मान संगत इकाई को कॉन्फ़िगर करके सेट किए जाते हैं। इकाई को बांधने से पहले "# 0000FF" पर अपना रंग क्षेत्र सेट करने के लिए:
// controller action
$project = new Project();
$project->setColor('#0000FF');
$form = $this->createForm(new ProjectType(), $project);
यदि वह क्षेत्र एक इकाई से जुड़ा है (उस इकाई का एक गुण है) तो आप बस इसके लिए एक डिफ़ॉल्ट मान सेट कर सकते हैं।
एक उदाहरण:
public function getMyField() {
if (is_null($this->MyField)) {
$this->setMyField('my default value');
}
return $this->MyField;
}
मैं आमतौर पर अपनी इकाई में विशिष्ट क्षेत्र के लिए डिफ़ॉल्ट मान सेट करता हूं:
/**
* @var int
* @ORM\Column(type="integer", nullable=true)
*/
protected $development_time = 0;
यह नए रिकॉर्ड के लिए काम करेगा या यदि केवल मौजूदा अपडेट कर रहा है।
'empty_data'इकाई पर कंस्ट्रक्टर परम को अनुमति देने के लिए कॉलबैक का उपयोग किया जाता है।
जैसा कि ब्रायन ने पूछा:
खाली_डेटा केवल फ़ील्ड को 1 पर सेट करने के लिए प्रकट होता है जब इसे बिना मूल्य के साथ सबमिट किया जाता है। जब कोई मूल्य मौजूद नहीं है तो आप इनपुट में 1 प्रदर्शित करने के लिए डिफ़ॉल्ट के रूप में क्या चाहते हैं?
आप के साथ डिफ़ॉल्ट मान सेट कर सकते हैं empty_value
$builder->add('myField', 'number', ['empty_value' => 'Default value'])