Symfony2 এ ফর্ম ক্ষেত্রের জন্য কীভাবে ডিফল্ট মান সেট করবেন?


137

পাঠ্য ফর্ম ক্ষেত্রের জন্য কোনও ডিফল্ট মান সেট করার কোনও সহজ উপায় আছে?


1
হ্যাঁ, তবে এই প্রশ্নে দেওয়া উত্তরগুলি সন্তুষ্ট নয় / কার্যকর হয় না ... আমি ব্যাখ্যা করতে একটি "সম্পাদনা" যুক্ত করব কেন :-)
Herrjeh42

দেখে মনে হচ্ছে যে আপনি 'নিখুঁত' সমাধানটি পরে কোনও ক্ষেত্রের জন্য 'ডিফল্ট_মূল্য' বিকল্পের জন্য। জিনিসটি হ'ল, বর্তমানে তা নেই , সুতরাং আপনি যে সন্ধানের সন্ধান করছেন তার সঠিক উপস্থিতি বর্তমান বলে মনে করি না। শুধু Symfony প্রদান করে (লিঙ্ক দেখুন) হয় ডেটা বিকল্পটি। সুতরাং যদি-তবে একমাত্র পন্থা যা আমি এটিএম দেখতে পারি। এমনকি যদি মাঠে নিজেই 'ডিফল্ট_মূল্য' বিকল্পটি থাকে তবে আমি ধারণা করি এটি অবশ্যই অভ্যন্তরীণভাবে একই জিনিসটি করবে।
crysallus

এছাড়াও, আমি এর নীচে আমার মতামত অনুসারে আমার উত্তরটি 2 এর সাথে সংশোধন করেছি। এটি যদি পয়েন্ট ২-এ উল্লিখিত বাক্য সিনট্যাক্স সমস্যাটি সমাধান করে তবে আপনি সেই মন্তব্যটি সম্পাদনা করতে চাইবেন। অথবা সমস্যাটি কী তা আমাকে জানান, এবং আমি আমার উত্তরটি ঠিক করব।
crysallus

1
@ ক্রোন এই প্রশ্নটি 2 বছর আগে জিজ্ঞাসা করা হয়েছিল
ওন্দ্রেজ স্লিনটেক

1
@ ওন্দ্রেজস্লিন্টাক আমি দুপকে হিসাবে বন্ধ করার পক্ষে ভোট দিইনি, তবে এফওয়াইআই: প্রথম যেটি এসেছে তা বিবেচনাধীন নয়, " যদি নতুন প্রশ্নটি আরও ভাল প্রশ্ন হয় বা এর আরও ভাল উত্তর থাকে তবে পুরানোটিটিকে সদৃশ হিসাবে বন্ধ করার জন্য ভোট দিন নতুন এক। "
জেফ Puckett

উত্তর:


105

সহজেই এর সাথে সৃষ্টির সময় ব্যবহার করা যেতে পারে:

->add('myfield', 'text', array(
     'label' => 'Field',
     'empty_data' => 'Default value'
))

11
সিমফনি ২.১-এর জন্য আমার 'data'চাবিটি পরিবর্তন করতে হবে'value'
এড্ড

175
এটি কেবল একটি ডিফল্ট মান সেট করে না, এটি সর্বদা মানকে যে কোনও প্রসঙ্গেও বাধ্য করে। আমি কী "ডিফল্ট মান" বলব না ...
হুবার্ট পেরোন

4
আমি এই সমাধানটিকে টিভোটেড করেছিলাম কারণ এটি সমস্যার সমাধান নয় (যেমন উপরে বর্ণিত হুবার্ট পেরোন)। আমি এই পোস্টে ভাল সমাধান পাওয়া পেতে চেষ্টা করছি stackoverflow.com/questions/17986481/...
herrjeh42

13
এই প্রাথমিক মান ডিফল্ট মানempty_data
পিয়ের দ্য LESPINAY

3
dataঅকেজো - এটি সংরক্ষিত মান ওভাররাইট করে। empty_dataমানটি দেখায় না, এটি এটি খালি মান জমা দেওয়ার জন্য ব্যবহার করে এবং চেক না করা পছন্দগুলি সংরক্ষণ করা অসম্ভব করে তোলে।
মোল্ডক্রাফট

115

আপনি এর সাথে ডিফল্ট মান সেট করতে পারেন empty_data

$builder->add('myField', 'number', ['empty_data' => 'Default value'])

29
ডেটা সেট করা ডিফল্ট সেট করছে না। এই উত্তরটি সঠিক।
আলেক্সি টেনিটস্কি

9
এটি কেবল ক্ষেত্রটিকে 1 তে নির্ধারণ করা হয় যখন এটি কোনও মূল্য ছাড়াই জমা দেওয়া হয়। আপনি যখন কোনও মূল্য উপস্থিত না থাকায় ইনপুটটিতে 1 প্রদর্শন করতে ফর্মটি ডিফল্ট করতে চান তখন কী হবে?
ব্রায়ান

আমার পরীক্ষায় খালি_ডেটা খালি জমা দেওয়া ক্ষেত্র থেকে আমাকে ডিফল্ট মান ওভাররাইড করার অনুমতি দেয় না, উদাহরণস্বরূপ যদি আপনি ডাটাবেসে NULL এর পরিবর্তে 0 হিসাবে সংরক্ষণ করতে চান। যতক্ষণ আমি বলতে পারি এই বাগটি এখনও অসামান্য: github.com/symfony/symfony/issues/5906
চাদউইক মেয়ার

63

আমি অতীতে কয়েকবার এটি নিয়ে চিন্তা করেছি তাই ভেবেছিলাম যে আমি যে বিভিন্ন ধারণা / ব্যবহার করেছি সেগুলি লিখে ফেলব। কিছু কার্যকর হতে পারে তবে কোনওটিই "নিখুঁত" সিমফনি 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 কারণ এটি ফর্মগুলি একাধিক পরিবেশে একাধিক নিয়ামক জুড়ে ব্যবহৃত হত এবং ফর্মগুলির মধ্যে ছিল একইভাবে উত্পন্ন / পরিচালনা করা হয়েছিল, তারা ভিন্নভাবে (যেমন ত্রুটি হ্যান্ডলিং, পুনর্নির্দেশগুলি ইত্যাদি) প্রদর্শিত / ইন্টারঅ্যাক্ট করা হয়েছিল। এই পদ্ধতির সৌন্দর্যটি হ'ল আপনি ডেটা ডিফল্ট করতে পারেন, আপনার যা কিছু প্রয়োজন তা করতে পারেন, ত্রুটিগুলি সাধারণভাবে পরিচালনা করতে পারেন এবং এগুলি সমস্ত এক জায়গায় আবদ্ধ করা যায়।

উপসংহার যেমনটি আমি দেখতে পেয়েছি আপনি আবার একই সমস্যাটিতে সময় এবং সময় দৌড়াবেন - ডিফল্ট ডেটা কোথায় থাকবে?

  • আপনি যদি এটি ডিবি / মতবাদ স্তরে সঞ্চয় করেন আপনি প্রতিবার ডিফল্ট সঞ্চয় করতে চান না তবে কি হবে?
  • আপনি যদি এটি সত্ত্বা স্তরে সংরক্ষণ করেন আপনি যদি কোনও সত্তায় কোনও ডেটা ছাড়াই পুনরায় ব্যবহার করতে চান তবে কী হবে?
  • আপনি যদি এটি সত্ত্বা স্তরে সঞ্চয় করেন এবং একটি নতুন ক্ষেত্র যুক্ত করেন, আপনি কি সম্পাদনা করার পরে পূর্ববর্তী সংস্করণগুলির সেই ডিফল্ট মান রাখতে চান? একই ডিবিতে ডিফল্ট হয়ে যায় ...
  • আপনি যদি ফর্ম পর্যায়ে এটি সঞ্চয় করেন তবে আপনি পরে কোডটি বজায় রাখার সময় এটাই সুস্পষ্ট?
  • যদি এটি কনস্ট্রাক্টরে থাকে তবে আপনি যদি একাধিক জায়গায় ফর্মটি ব্যবহার করেন তবে কী হয়?
  • যদি আপনি এটিকে জেএস স্তরে নিয়ে যান তবে আপনি খুব বেশি এগিয়ে গেছেন - তথ্যটি জেএস-এর কিছু মনে করবেন না (এবং আমরা সামঞ্জস্যতা, রেন্ডারিং ত্রুটি ইত্যাদি) উপস্থাপন করব না)
  • আপনি যদি একাধিক জায়গায় এটি ব্যবহার করেন তবে পরিষেবাটি দুর্দান্ত but তবে এটি একটি সাইটে সাধারণ অ্যাড / সম্পাদনা ফর্মের জন্য ওভারকিল ...

সে লক্ষ্যে, আমি প্রতিবারই সমস্যার থেকে ভিন্নভাবে যোগাযোগ করেছি। উদাহরণস্বরূপ, একটি সাইনআপ ফর্ম "নিউজলেটার" বিকল্পটি ফর্মটি তৈরির ঠিক আগে কনস্ট্রাক্টরে সহজেই (এবং যুক্তিযুক্তভাবে) সেট করা হয়। যখন আমি ফর্ম সংগ্রহগুলি তৈরি করছিলাম যা একসাথে যুক্ত ছিল (যেমন বিভিন্ন ফর্ম ধরণের রেডিও বোতামগুলি একসাথে যুক্ত) তখন আমি ইভেন্ট শ্রোতাদের ব্যবহার করেছি। যখন আমি আরও জটিল সত্তা তৈরি করেছি (যেমন একটি যা শিশুদের বা প্রচুর ডিফল্ট ডেটা প্রয়োজন) আমি যখন প্রয়োজন তার উপাদান তৈরি করতে আমি একটি ফাংশন (উদাহরণস্বরূপ 'গেটফ্যাক্টরি') ব্যবহার করেছি।

আমি মনে করি না যে প্রতিবারই এই প্রয়োজনীয়তাটি কিছুটা আলাদা হয়ে গেছে বলে একটি "সঠিক" দৃষ্টিভঙ্গি রয়েছে।

শুভকামনা! আমি আশা করি যে কোনও হারে চিন্তাভাবনা করার জন্য আমি আপনাকে কিছু খাবার দিয়েছি এবং খুব বেশি কাঁপছি না;)


আপনি 'একটি পরিষেবা যা সমস্ত ফর্ম উত্পন্ন করেছে' এর অর্থ কী ছিল সে সম্পর্কে আপনি আরও কিছুটা বিশদ দিতে পারেন? আমি এখনই একটি সত্যিকারের ফর্ম কেন্দ্রিক প্রকল্পেও কাজ করছি এবং এ সম্পর্কে বিভিন্ন দৃষ্টিভঙ্গি রাখাই দুর্দান্ত হবে।
ব্যবহারকারী 2268997

2
মতবাদ ব্যবহার করার সময়, কোনও সত্তা ডিবি থেকে লোড করা হলে কনস্ট্রাক্টরদের ডাকা হয় না।
এনডিএম

43

আপনার যদি ডিফল্ট মান সেট করতে হয় এবং আপনার ফর্মটি সত্তার সাথে সম্পর্কিত হয় তবে আপনার নিম্নলিখিত পদ্ধতির ব্যবহার করা উচিত:

// 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']
GGG

3
অ্যাড / আপডেট উভয়ের পক্ষে এটিই সঠিক উপায় I তবে আমি সিমফোনিকে ঘৃণা করি এটি এটিকে আরও জটিল করে তোলে।
ইয়ারকো

এই একমাত্র ভাল উত্তর। আমি ডকটির দিকে তাকালে অন্যান্য উত্তরগুলি বুঝতে পারি না। empty_data: এই বিকল্পটি নির্ধারণ করে যে জমা দেওয়া মান খালি হলে ক্ষেত্রটি কী মান ফিরে আসবে। এটি কোনও প্রাথমিক মান সেট করে না
ভিনসেন্ট ডেকাউক্স

19

আপনি আপনার মডেল শ্রেণিতে সম্পর্কিত ক্ষেত্রের জন্য ডিফল্ট সেট করতে পারেন (ম্যাপিং সংজ্ঞাতে বা মানটি নিজে সেট করুন)।

তদুপরি, ফর্মবিল্ডার আপনাকে সেটডেটা () পদ্ধতিতে প্রাথমিক মান সেট করার সুযোগ দেয় । ফর্ম নির্মাতা আপনার ফর্ম শ্রেণির তৈরিফর্ম () পদ্ধতিতে পাস করা হয়েছে ।

এছাড়াও, এই লিঙ্কটি দেখুন: http://symfony.com/doc/current/book/forms.html# using-a-form-without-a-class


16

যদি আপনার ফর্মটি কোনও সত্তার সাথে আবদ্ধ থাকে তবে কেবল নির্মাণের পদ্ধতিটি ব্যবহার করে সত্তার উপর ডিফল্ট মানটি সেট করুন:

public function __construct()
{
    $this->field = 'default value';
}

তবুও, আপনার ফর্মটিতে অতিরিক্ত ক্ষেত্রগুলি আপনার সত্তা ( 'mapped' => false) এ ম্যাপ করা যায় না । setData(...)এই জন্য ব্যবহার করুন ।
ডিজলি

12

পন্থা 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'
        )
    );
}

প্রথমটি কাজ করে (ধন্যবাদ!), দ্বিতীয়টি (আমার জন্য নয়): $ বিকল্পগুলি ["ডেটা] সর্বদা সেট করা থাকে, তাই ডিফল্ট মানটি কখনই ব্যবহার করা হবে না I আমি এখনও ভাবছি যে সমাধান নম্বর 1 হ'ল উদ্দেশ্যযুক্ত উপায় কিনা? এটি করতে ...
herrjeh42

আপনি সর্বদা সেট হয়ে থাকা 'বিকল্পগুলি [' ডেটা '] সম্পর্কে ঠিক বলেছেন। আপনি যদি সত্তা ক্ষেত্রটি আরম্ভ না করেন তবে আপনি ক্ষেত্রটির শূন্যতার জন্য পরীক্ষা করতে পারেন, উদাহরণস্বরূপ। 'ডেটা' => $ অপশন ['ডেটা'] -> গিটারকালার ()! == নাল? ইত্যাদি ... এটি ধরে নিয়েছে যে রঙ ক্ষেত্রের জন্য নাল একটি বৈধ মান নয়, সুতরাং বিদ্যমান সত্তাগুলির সেই ক্ষেত্রের জন্য কোনও নাল মান হবে না।
crysallus

আহ, আমাকে বোকা: আমি এটি 'আইসেট ($ $ বিকল্পগুলি [' ডেটা '] -> গীতকালার ())' দিয়ে চেষ্টা করেছি, "প্রসঙ্গে লিখিতভাবে এটি ব্যবহার করার অনুমতি নেই" সম্পর্কে একটি ত্রুটি বার্তা পেয়েছি এবং ভুলে গেছি যে আমাকে করতে হবে এটি
অন্যভাবে দেখুন

1
আসলে ডেটা এন্ট্রি সেট না করা হয় এমন উপলক্ষগুলি মনে হয়। উভয়টির জন্য পরীক্ষার চেয়ে নিরাপদ যেমন আইসেট ($ বিকল্পগুলি ['ডেটা']] এবং&& $ বিকল্পগুলি ['ডেটা'] -> গেটকালার ()! == নাল? ...
crysallus

9

আপনি একটি ডিফল্ট মান সেট করতে পারেন, যেমন ফর্মের জন্য 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();

2
আমি এই পদ্ধতিটি পছন্দ করি, বিশেষত যেহেতু বেশিরভাগ অ্যাপ্লিকেশনগুলিতে আপনি একটি ফর্ম তৈরি করছেন এবং এমন কোনও সত্তায় যাচ্ছেন যা ফর্মটির সাথে সম্পর্কিত।
skrilled

9

কোনও ক্ষেত্রে / পদ্ধতির জন্য একটি সাধারণ সমাধান, মূলত কোনও শ্রেণিবিহীন ফর্ম ব্যবহার করে বা যখন আমাদের কোনও পরিষেবাতে ডিফল্ট মান সেট করার প্রয়োজন হয়:

// 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'));

এটিকে সেরা উত্তর হিসাবে গ্রহণ করা উচিত (আপ টু ডেট)
মেডুনস ২

7

ব্যবহার করবেন না:

'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',
    ));
}

এই এখানে টাকা !! ফর্ম ইভেন্ট শ্রোতাদের আপনার মানগুলি ডিফল্ট করার আগে তা পরীক্ষা করতে ব্যবহার করুন। আপনার ফর্মগুলির ডিফল্ট মানগুলির জন্য এটি গ্রহণযোগ্য উত্তর হওয়া উচিত কারণ এটি নতুন ক্রিয়া এবং সম্পাদনা ক্রিয়া উভয়ের পক্ষে কাজ করে।
45 এ tlorens

এটি হ্যান্ডেল করার সঠিক উপায় এবং এটি গ্রহণযোগ্য উত্তর হওয়া উচিত।
বেটিনজ

আপনি শুরুতে যা উল্লেখ করেন তা সত্য নয় যদি আপনি শর্তাধীন / তিন্নি ব্যবহার করেন। এটার মত:'data' => $data['myfield'] ?? 'Default value'
এটির

6
->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()ক্ষেত্রটি পড়ার পরিবর্তে কল করা এটি আরও উন্নত করতে পারে।
ব্যবহারকারী 2268997

5

আমার সমাধান:

$defaultvalue = $options['data']->getMyField();
$builder->add('myField', 'number', array(
            'data' => !empty($defaultvalue) ? $options['data']->getMyField() : 0
        )) ;

4

ঠিক তাই আমি বুঝতে সমস্যা।

আপনার সত্তার ডেটার উপর ভিত্তি করে ফর্মটি যেভাবে তৈরি করা হয়েছে তা সামঞ্জস্য করতে চান। যদি সত্তাটি তৈরি করা হচ্ছে তবে কিছু ডিফল্ট মান ব্যবহার করুন। সত্তা বিদ্যমান থাকলে ডাটাবেস মানটি ব্যবহার করুন।

ব্যক্তিগতভাবে, আমি মনে করি @ মলিকুলার ম্যানস এর সমাধান হ'ল উপায়। আমি আসলে কনস্ট্রাক্টর বা সম্পত্তি বিবৃতিতে ডিফল্ট মান সেট করব। তবে আপনি এই পদ্ধতির পছন্দ করেন বলে মনে হয় না।

পরিবর্তে আপনি এটি অনুসরণ করতে পারেন: http://symfony.com/doc/current/cookbook/form/dynamic_for_modifications.html

আপনি আপনার ফর্মের ধরণের উপরে শ্রোতাকে ঝুলিয়ে রাখুন এবং তারপরে আপনি নিজের সত্ত্বাটি পরীক্ষা করতে পারেন এবং নির্মাতাকে সামঞ্জস্য করতে পারেন>> নতুন বা বিদ্যমান সত্তার উপর ভিত্তি করে বিবৃতি যুক্ত করতে পারেন। আপনাকে এখনও আপনার ডিফল্ট মানগুলি কোথাও নির্দিষ্ট করতে হবে যদিও আপনি সেগুলি কেবল আপনার শ্রোতার মধ্যে কোড করতে পারেন। অথবা তাদের ফর্ম টাইপ পাস।

অনেকটা কাজের মনে হলেও। ইতিমধ্যে সেট করা ডিফল্ট মানগুলির সাথে ফর্মটিতে সত্তাকে কেবল উত্তীর্ণ করা আরও ভাল।


4

আপনি যদি FormBuilderফর্মটি তৈরি করতে সিম্ফনি ২.7 ব্যবহার করেন, আপনি কনট্রোলারের createFormBuilderপদ্ধতিতে প্রাথমিক তথ্যও পাস করতে পারেন

$values = array(
    'name' => "Bob"
);

$formBuilder = $this->createFormBuilder($values);
$formBuilder->add('name', 'text');

3

প্রায়শই, ফর্মের ডিআইডি ডিফল্ট মানগুলির জন্য আমি ফিক্সচার ব্যবহার করি। কারণ হিসাবে এই উপায় সহজ নয়, কিন্তু খুব আরামদায়ক।

উদাহরণ:

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',
));

3

খুব সহজ উপায় আছে, আপনি এখানে ডিফল্ট সেট করতে পারেন:

$defaults = array('sortby' => $sortby,'category' => $category,'page' => 1);

$form = $this->formfactory->createBuilder('form', $defaults)
->add('sortby','choice')
->add('category','choice')
->add('page','hidden')
->getForm();

3

আপনি যদি নিজের সৃষ্টি ফর্মটিতে 'ডেটা' সেট করেন, আপনার সত্তাকে সম্পাদনা করার সময় এই মানটি পরিবর্তন করা হবে না।

আমার সমাধানটি হ'ল:

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',
    ));
}

বাই।


গ্রহণযোগ্য উত্তরের চেয়ে অনেক বেশি সহায়ক! আপনি যদি পিএইচপি 7 ব্যবহার করেন তবে এটিকে আরও সুন্দর করে তুলতে পারেন:'data' => $data['myfield'] ?? 'Default value',
বয়কোদেভ

আপনার অ্যারে_কি_এক্সিস্টগুলি () ফাংশনে টাইপ রয়েছে
ডেডপুল

1

ডিফল্ট মানগুলি সংশ্লিষ্ট সত্তাটি কনফিগার করে সেট করা হয়। সত্তাকে বাঁধার আগে তার রঙের ক্ষেত্রটি "# 0000FF" এ সেট করার আগে:

// controller action
$project = new Project();
$project->setColor('#0000FF');
$form = $this->createForm(new ProjectType(), $project);

এই পদ্ধতির কাজ করে তবে আপনার অসুবিধা হ'ল প্রতিবার আপনি যখন ফর্ম শ্রেণিটি ব্যবহার করেন তখন এটি করতে হয় এবং এটি খুব ভার্জোজ (প্রচুর সেট স্টেটমেন্ট)। যেহেতু ফর্ম উপাদানটি খুব মার্জিত, তাই অন্য কিছু থাকতে হবে। তবে যাইহোক ধন্যবাদ :-)
herrjeh42

@ জ্যামি0726 আমার মতে অবজেক্টের মান যখনই নতুন বা আনতে হবে সেট করার নিয়ামক দায়িত্ব responsibility আপনি ফর্মটি বিভিন্ন পরিস্থিতিতে বিভিন্ন আচরণের সাথে ব্যবহার করতে পারেন, উদাহরণস্বরূপ, ব্যবহারকারীর ম্যানেজার বা সুপারম্যানের ভূমিকা থাকার কারণে নতুন রঙটি পরিবর্তিত হতে পারে এবং যেহেতু এটি একটি ব্যবসায়িক যুক্তি, তাই এটি নিয়ন্ত্রণ করা উচিত নিয়ামক বা পরিষেবা, ফর্ম নয়। সেরাদ যেমনটি বলেছেন, আমিও এই সমাধানটিকে পছন্দ করি। আপনি সেই ডিফল্ট মানগুলি সেট করতে সর্বদা একটি পরিষেবা তৈরি করতে পারেন এবং নিয়ামকটিতে পরিষেবাটি এটি DRY রেখে ব্যবহার করে।
সমরিম

এটি আমি সমাধানটিকে বেছে নিয়েছি কারণ এটি আমার মনে হয় যুক্তিযুক্ত। উত্পাদিত কন্ট্রোলারগুলির EDIT এবং CREATE ফর্ম তৈরির জন্য বিভিন্ন পদ্ধতি রয়েছে এবং আমি সেগুলিতে নতুন সত্তার জন্য ডিফল্ট / প্রাথমিক ডেটা সেট করি।
alumi

1

যদি ক্ষেত্রটি কোনও সত্তার সাথে আবদ্ধ হয় (সেই সত্তার একটি সম্পত্তি) আপনি কেবল এটির জন্য একটি ডিফল্ট মান সেট করতে পারেন।

একটি উদাহরণ:

public function getMyField() {
    if (is_null($this->MyField)) {
        $this->setMyField('my default value');
    }
    return $this->MyField;
}

1

আমি সাধারণত আমার সত্তায় নির্দিষ্ট ক্ষেত্রের জন্য কেবলমাত্র ডিফল্ট মান সেট করি:

/**
 * @var int
 * @ORM\Column(type="integer", nullable=true)
 */
protected $development_time = 0;

এটি নতুন রেকর্ডগুলির জন্য বা কেবল বিদ্যমান রেকর্ডগুলি আপডেট করার জন্য কাজ করবে।


'empty_data'সত্তায় কনস্ট্রাক্টর প্যারামগুলিকে অনুমতি দেওয়ার জন্য কোনও কলব্যাক ব্যবহৃত হয় তখন এটি কাজ করে না বলে মনে হয় ।
এনডিএম

1

ব্রায়ান যেমন জিজ্ঞাসা করেছিলেন:

খালি_ডেটা কেবল ক্ষেত্রটি 1 এ সেট করতে প্রদর্শিত হয় যখন এটি কোনও মূল্য ছাড়াই জমা দেওয়া হয়। আপনি যখন কোনও মূল্য উপস্থিত না থাকায় ইনপুটটিতে 1 প্রদর্শন করতে ফর্মটি ডিফল্ট করতে চান তখন কী হবে?

আপনি এর সাথে ডিফল্ট মান সেট করতে পারেন empty_value

$builder->add('myField', 'number', ['empty_value' => 'Default value'])

0

আমি এই সমস্যার সমাধান, যোগ করে মান মধ্যে ATTR :

->add('projectDeliveringInDays', null, [
    'attr' => [
          'min'=>'1',
          'value'=>'1'
          ]
     ])
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.