পাঠ্য ফর্ম ক্ষেত্রের জন্য কোনও ডিফল্ট মান সেট করার কোনও সহজ উপায় আছে?
পাঠ্য ফর্ম ক্ষেত্রের জন্য কোনও ডিফল্ট মান সেট করার কোনও সহজ উপায় আছে?
উত্তর:
সহজেই এর সাথে সৃষ্টির সময় ব্যবহার করা যেতে পারে:
->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'])
আমি অতীতে কয়েকবার এটি নিয়ে চিন্তা করেছি তাই ভেবেছিলাম যে আমি যে বিভিন্ন ধারণা / ব্যবহার করেছি সেগুলি লিখে ফেলব। কিছু কার্যকর হতে পারে তবে কোনওটিই "নিখুঁত" সিমফনি 2 সমাধান নয়।
কনস্ট্রাক্টর সত্তায় আপনি এটি করতে পারেন> এটি-> সেটবার ('ডিফল্ট মান'); আপনি যখন সত্তাটি লোড করেন তখনই এটি ডাকা হয় (ডিবি বা না) এবং কিছুটা অগোছালো। এটি প্রতিটি ক্ষেত্রের ধরণের জন্য কাজ করে কারণ আপনি খেজুরগুলি তৈরি করতে পারেন বা আপনার যা যা প্রয়োজন প্রয়োজন।
এর মধ্যে বিবৃতি যদি না হয় আমি না, কিন্তু আপনি করতে পারেন।
return ( ! $this->hasFoo() ) ? 'default' : $this->foo;
কারখানার / উদাহরণস্বরূপ । একটি স্ট্যাটিক ফাংশন / মাধ্যমিক শ্রেণি কল করুন যা আপনাকে একটি পূর্বনির্ধারিত সত্তা ডেটা সহ প্রেরণে সরবরাহ করে। যেমন
function getFactory() {
$obj = new static();
$obj->setBar('foo');
$obj->setFoo('bar');
return $obj;
}
আপনি অতিরিক্ত ক্ষেত্র যুক্ত করলে আপনাকে এই ফাংশনটি বজায় রাখতে হবে এমন সত্যিকার অর্থে আদর্শ নয়, তবে এর অর্থ হ'ল আপনি ডেটা সেটারগুলি / ডিফল্ট এবং ডিবি থেকে উত্পন্ন যা পৃথক করছেন। একইভাবে আপনার বিভিন্ন ডিফল্ট ডেটা চাইলে একাধিক গেটফ্যাক্টরিগুলি থাকতে পারে।
বর্ধিত / প্রতিচ্ছবি সত্তা একটি প্রসারিত সত্তা তৈরি করুন (যেমন ফুকারিট ফু ফু বাড়িয়ে তোলে) যা আপনাকে তৈরির সময় (কনস্ট্রাক্টরের মাধ্যমে) ডিফল্ট ডেটা দেয়। কারখানা / উদাহরণ আইডির অনুরূপ কেবল একটি ভিন্ন পদ্ধতির - আমি ব্যক্তিগতভাবে স্থির পদ্ধতিগুলি পছন্দ করি।
বিল্ড ফর্মের আগে ডেটা সেট করুন কনস্ট্রাক্টর / সার্ভিসে, আপনি যদি জানেন যে আপনার কোনও নতুন সত্ত্বা রয়েছে বা এটি ডিবি থেকে পপুলেটেড ছিল। অতএব আপনি যখন কোনও নতুন সত্তাকে দখল করবেন তখন বিভিন্ন ক্ষেত্রে সেট ডেটা কল করা বাঞ্ছনীয়। যেমন
if( ! $entity->isFromDB() ) {
$entity->setBar('default');
$entity->setDate( date('Y-m-d');
...
}
$form = $this->createForm(...)
ফর্ম ইভেন্টগুলি আপনি ফর্মটি তৈরি করার সময় ক্ষেত্রগুলি তৈরি করার সময় আপনি ডিফল্ট ডেটা সেট করেন। আপনি এই ব্যবহারটি প্রিজেটডাটা ইভেন্ট শ্রোতাকে ওভাররাইড করে। এটির সাথে সমস্যা হ'ল আপনি ফর্ম ওয়ার্কলোড / ডুপ্লিকেট কোডটি ফর্মুলিপি করছেন এবং বজায় রাখা / বোঝা আরও শক্ত করে তুলছেন।
ফর্ম ইভেন্টগুলির অনুরূপ বর্ধিত ফর্মগুলি , তবে আপনি এটি ডিবি / নতুন সত্তা কিনা তার উপর নির্ভর করে আপনি বিভিন্ন ধরণের কল করেন। এর অর্থ হ'ল আপনার কাছে ফুটাইপ রয়েছে যা আপনার সম্পাদনা ফর্মটি সংজ্ঞায়িত করে, বারটাইপ এটিকে ফুটাইপ প্রসারিত করে এবং সমস্ত ডেটা ক্ষেত্রগুলিতে সেট করে। আপনার নিয়ামক আপনি তারপর উত্সাহিত করতে কোন ফর্ম টাইপ চয়ন করুন। যদি আপনার পছন্দসই থিম থাকে এবং ইভেন্টগুলি পছন্দ করে তবে এটি আমার স্তন্যপান করে too
টুইগ আপনি যখন প্রতি ক্ষেত্রের ভিত্তিতে এটি করেন তখন আপনি নিজের থিম তৈরি করতে এবং মান বিকল্পটি ব্যবহার করে ডেটা ডিফল্ট করতে পারেন। এটিকে কোনও ফর্ম থিমে মুড়িয়ে দেওয়ার কোনও কারণ নেই আপনার হয় যদি আপনার টেম্পলেটগুলি পরিষ্কার রাখতে চান এবং ফর্মটি পুনরায় ব্যবহারযোগ্য করে তোলা উচিত। যেমন
form_widget(form.foo, {attr: { value : default } });
জেএস ক্ষেত্রগুলি খালি থাকলে একটি জেএস ফাংশন সহ ফর্মটি পপুল করা তুচ্ছ হবে। উদাহরণস্বরূপ আপনি স্থানধারীদের সাথে কিছু করতে পারেন। যদিও এটি একটি খারাপ, খারাপ ধারণা।
একটি পরিষেবা হিসাবে ফর্মগুলি আমি তৈরি করেছিলাম এমন একটি বৃহত ফর্ম ভিত্তিক প্রকল্পগুলির জন্য, আমি একটি পরিষেবা তৈরি করেছি যা সমস্ত ফর্ম তৈরি করে, সমস্ত প্রক্রিয়াজাতকরণ ইত্যাদি করেছিল This কারণ এটি ফর্মগুলি একাধিক পরিবেশে একাধিক নিয়ামক জুড়ে ব্যবহৃত হত এবং ফর্মগুলির মধ্যে ছিল একইভাবে উত্পন্ন / পরিচালনা করা হয়েছিল, তারা ভিন্নভাবে (যেমন ত্রুটি হ্যান্ডলিং, পুনর্নির্দেশগুলি ইত্যাদি) প্রদর্শিত / ইন্টারঅ্যাক্ট করা হয়েছিল। এই পদ্ধতির সৌন্দর্যটি হ'ল আপনি ডেটা ডিফল্ট করতে পারেন, আপনার যা কিছু প্রয়োজন তা করতে পারেন, ত্রুটিগুলি সাধারণভাবে পরিচালনা করতে পারেন এবং এগুলি সমস্ত এক জায়গায় আবদ্ধ করা যায়।
উপসংহার যেমনটি আমি দেখতে পেয়েছি আপনি আবার একই সমস্যাটিতে সময় এবং সময় দৌড়াবেন - ডিফল্ট ডেটা কোথায় থাকবে?
সে লক্ষ্যে, আমি প্রতিবারই সমস্যার থেকে ভিন্নভাবে যোগাযোগ করেছি। উদাহরণস্বরূপ, একটি সাইনআপ ফর্ম "নিউজলেটার" বিকল্পটি ফর্মটি তৈরির ঠিক আগে কনস্ট্রাক্টরে সহজেই (এবং যুক্তিযুক্তভাবে) সেট করা হয়। যখন আমি ফর্ম সংগ্রহগুলি তৈরি করছিলাম যা একসাথে যুক্ত ছিল (যেমন বিভিন্ন ফর্ম ধরণের রেডিও বোতামগুলি একসাথে যুক্ত) তখন আমি ইভেন্ট শ্রোতাদের ব্যবহার করেছি। যখন আমি আরও জটিল সত্তা তৈরি করেছি (যেমন একটি যা শিশুদের বা প্রচুর ডিফল্ট ডেটা প্রয়োজন) আমি যখন প্রয়োজন তার উপাদান তৈরি করতে আমি একটি ফাংশন (উদাহরণস্বরূপ 'গেটফ্যাক্টরি') ব্যবহার করেছি।
আমি মনে করি না যে প্রতিবারই এই প্রয়োজনীয়তাটি কিছুটা আলাদা হয়ে গেছে বলে একটি "সঠিক" দৃষ্টিভঙ্গি রয়েছে।
শুভকামনা! আমি আশা করি যে কোনও হারে চিন্তাভাবনা করার জন্য আমি আপনাকে কিছু খাবার দিয়েছি এবং খুব বেশি কাঁপছি না;)
আপনার যদি ডিফল্ট মান সেট করতে হয় এবং আপনার ফর্মটি সত্তার সাথে সম্পর্কিত হয় তবে আপনার নিম্নলিখিত পদ্ধতির ব্যবহার করা উচিত:
// 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
: এই বিকল্পটি নির্ধারণ করে যে জমা দেওয়া মান খালি হলে ক্ষেত্রটি কী মান ফিরে আসবে। এটি কোনও প্রাথমিক মান সেট করে না
আপনি আপনার মডেল শ্রেণিতে সম্পর্কিত ক্ষেত্রের জন্য ডিফল্ট সেট করতে পারেন (ম্যাপিং সংজ্ঞাতে বা মানটি নিজে সেট করুন)।
তদুপরি, ফর্মবিল্ডার আপনাকে সেটডেটা () পদ্ধতিতে প্রাথমিক মান সেট করার সুযোগ দেয় । ফর্ম নির্মাতা আপনার ফর্ম শ্রেণির তৈরিফর্ম () পদ্ধতিতে পাস করা হয়েছে ।
এছাড়াও, এই লিঙ্কটি দেখুন: 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/references/forms/tyype/form.html#data
"উপস্থাপনের সময় ডেটা বিকল্পটি সর্বদা ডোমেন ডেটা (অবজেক্ট) থেকে নেওয়া মানকে ওভাররাইড করে This এর অর্থ হ'ল ফর্মটি ইতিমধ্যে স্থিত অবজেক্টের সম্পাদনা করলে বস্তুটির মানটিও ওভার্রাইড হয়ে যায়, ফর্মটি জমা দেওয়ার পরে এটি তার স্থায়ী মান হারাতে পারে।"
নিম্নলিখিত ব্যবহার:
যাক, উদাহরণস্বরূপ, আপনার একটি সত্তা ফু রয়েছে এবং একটি ক্ষেত্র "সক্রিয়" রয়েছে (উদাহরণস্বরূপ এটি চেকবক্স টাইপ, তবে প্রক্রিয়াটি অন্য সকল ধরণের সমান), যা আপনি ডিফল্টরূপে পরীক্ষা করতে চান
আপনার 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_for_modifications.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'])