ya, tetapi jawaban yang diberikan dalam pertanyaan ini tidak memuaskan / tidak berfungsi ... Saya akan menambahkan "Sunting" untuk menjelaskan mengapa :-)
herrjeh42
Tampaknya solusi 'sempurna' yang Anda cari adalah sebuah bidang memiliki opsi 'default_value'. Masalahnya, saat ini tidak , jadi saya tidak berpikir solusi sempurna yang Anda cari saat ini ada. Satu-satunya yang disediakan symfony (lihat tautan) adalah opsi data. Jadi jika-maka adalah satu-satunya pendekatan yang bisa saya lihat atm. Bahkan jika ada opsi 'default_value' di lapangan itu sendiri, saya membayangkan itu pada dasarnya akan melakukan hal yang sama secara internal.
crysallus
Juga, saya telah melakukan koreksi terhadap jawaban saya dalam pendekatan 2 sesuai komentar saya di bawahnya. Jika itu memperbaiki masalah sintaks yang Anda sebutkan di poin 2, Anda mungkin ingin mengedit komentar itu. Atau beri tahu saya apa masalahnya, dan saya akan memperbaiki jawaban saya.
crysallus
1
@Crone pertanyaan ini ditanyakan 2 tahun sebelumnya
Untuk Symfony 2.1 saya perlu mengubah 'data'kunci untuk'value'
Edd
175
Ini tidak hanya menetapkan nilai default, itu juga akan selalu memaksa nilai dalam konteks apa pun. Bukan apa yang saya sebut "nilai default" ...
Hubert Perron
4
Saya downvoted solusi ini karena ini bukan solusi untuk masalah (seperti Hubert Perron disebutkan di atas). Saya mencoba untuk mendapatkan solusi yang lebih baik dalam posting ini stackoverflow.com/questions/17986481/…
herrjeh42
13
Ini adalah nilai awal, nilai default-nyaempty_data
Pierre de LESPINAY
3
datatidak berguna - itu menimpa nilai yang disimpan. empty_datatidak menunjukkan nilainya, ia menggunakannya pada nilai kosong yang dikirimkan dan membuatnya tidak mungkin untuk menyimpan pilihan yang tidak dicentang.
Moldcraft
115
Anda dapat mengatur nilai default dengan empty_data
Pengaturan data tidak menetapkan standar. Jawaban ini adalah yang benar.
Alexei Tenitski
9
Tampaknya ini hanya mengatur bidang ke 1 bila dikirimkan tanpa nilai. Bagaimana dengan ketika Anda ingin form secara default menampilkan 1 pada input ketika tidak ada nilai?
Brian
Dalam pengujian saya empty_data tidak memungkinkan saya untuk mengganti nilai default dari bidang yang dikirim kosong, misalnya jika Anda ingin menyimpan ke database sebagai 0 bukan NULL. Bug ini masih luar biasa sejauh yang saya tahu: github.com/symfony/symfony/issues/5906
Chadwick Meyer
63
Saya telah merenungkan ini beberapa kali di masa lalu jadi saya pikir saya akan menuliskan berbagai ide yang saya miliki / gunakan. Sesuatu mungkin berguna, tetapi tidak ada solusi Symfony2 "sempurna".
Konstruktor
Dalam Entitas Anda dapat melakukan $ this-> setBar ('nilai default'); tetapi ini disebut setiap kali Anda memuat entitas (db atau tidak) dan agak berantakan. Namun itu berfungsi untuk setiap jenis bidang karena Anda dapat membuat tanggal atau apa pun yang Anda butuhkan.
Jika pernyataan dalam get's
saya tidak akan, tetapi Anda bisa.
return(! $this->hasFoo())?'default': $this->foo;
Pabrik / contoh . Panggil fungsi statis / kelas sekunder yang memberi Anda Entitas default yang diisi sebelumnya dengan data. Misalnya
function getFactory(){
$obj =newstatic();
$obj->setBar('foo');
$obj->setFoo('bar');return $obj;}
Tidak terlalu ideal mengingat Anda harus mempertahankan fungsi ini jika Anda menambahkan bidang tambahan, tetapi itu berarti Anda memisahkan seter data / default dan apa yang dihasilkan dari db. Demikian pula Anda dapat memiliki beberapa getFactories jika Anda menginginkan data standar yang berbeda.
Entitas Extended / Refleksi
Membuat Entitas yang diperluas (mis. FooCreate extends Foo) yang memberi Anda data default pada waktu pembuatan (melalui konstruktor). Mirip dengan ide Pabrik / contoh hanya pendekatan yang berbeda - Saya lebih suka metode statis secara pribadi.
Setel Data sebelum membangun formulir
Di konstruktor / layanan, Anda tahu apakah Anda memiliki entitas baru atau jika itu diisi dari db. Oleh karena itu masuk akal untuk memanggil data yang diset pada bidang yang berbeda saat Anda mengambil entitas baru. Misalnya
Formulir Acara
Saat Anda membuat formulir, Anda menetapkan data default saat membuat bidang. Anda menimpa ini menggunakan pendengar acara PreSetData. Masalah dengan ini adalah bahwa Anda menduplikasi formulir beban kerja / duplikasi kode dan membuatnya lebih sulit untuk dipertahankan / dipahami.
Formulir yang diperluas
Mirip dengan Formulir acara, tetapi Anda memanggil jenis yang berbeda tergantung pada apakah itu db / entitas baru. Maksud saya, Anda memiliki FooType yang mendefinisikan formulir edit Anda, BarType memperluas FooType ini dan menyetel semua data ke bidang. Di controller Anda, Anda cukup memilih tipe formulir yang ingin dihasut. Ini menyebalkan jika Anda memiliki tema khusus dan suka acara, membuat terlalu banyak pemeliharaan sesuai dengan keinginan saya.
Ranting
Anda dapat membuat tema Anda sendiri dan default data menggunakan opsi nilai juga ketika Anda melakukannya berdasarkan per-bidang. Tidak ada yang menghentikan Anda membungkus ini menjadi tema formulir baik Anda ingin menjaga template Anda bersih dan formulir dapat digunakan kembali. misalnya
form_widget(form.foo,{attr:{value:default}});
JS
Akan sepele untuk mengisi formulir dengan fungsi JS jika bidang kosong. Anda dapat melakukan sesuatu dengan placeholder misalnya. Tapi ini ide yang buruk.
Formulir sebagai layanan
Untuk salah satu proyek berbasis formulir besar yang saya lakukan, saya membuat layanan yang menghasilkan semua formulir, melakukan semua pemrosesan, dll. Ini karena formulir akan digunakan di beberapa pengontrol di beberapa lingkungan dan sementara formulir dihasilkan / ditangani dengan cara yang sama, mereka ditampilkan / berinteraksi dengan berbeda (misalnya penanganan kesalahan, pengalihan dll). Keindahan dari pendekatan ini adalah bahwa Anda dapat mengatur data secara default, melakukan semua yang Anda butuhkan, menangani kesalahan secara umum, dll, dan semuanya dienkapsulasi di satu tempat.
Kesimpulan
Seperti yang saya lihat, Anda akan mengalami masalah yang sama berulang kali - di mana data default untuk hidup?
Jika Anda menyimpannya di tingkat db / doktrin apa yang terjadi jika Anda tidak ingin menyimpan default setiap saat?
Jika Anda menyimpannya di tingkat Entitas apa yang terjadi jika Anda ingin menggunakan kembali entitas itu di tempat lain tanpa data di dalamnya?
Jika Anda menyimpannya di Entity Level dan menambahkan bidang baru, apakah Anda ingin versi sebelumnya memiliki nilai default saat mengedit? Sama berlaku untuk default di DB ...
Jika Anda menyimpannya di tingkat formulir, apakah itu jelas ketika Anda datang untuk mempertahankan kode nanti?
Jika ada di konstruktor, apa yang terjadi jika Anda menggunakan formulir di banyak tempat?
Jika Anda mendorongnya ke level JS maka Anda telah melangkah terlalu jauh - data seharusnya tidak ada dalam pandangan apalagi JS (dan kami mengabaikan kompatibilitas, rendering kesalahan, dll)
Layanan ini hebat jika seperti saya Anda menggunakannya di banyak tempat, tetapi itu berlebihan untuk formulir tambah / sunting sederhana di satu situs ...
Untuk itu, saya sudah mendekati masalah secara berbeda setiap kali. Misalnya, opsi formulir "buletin" pendaftaran mudah (dan secara logis) disetel di konstruktor sebelum membuat formulir. Ketika saya sedang membangun koleksi formulir yang ditautkan bersama (mis. Tombol radio mana dalam berbagai jenis formulir ditautkan bersama) maka saya telah menggunakan Pendengar Acara. Ketika saya telah membangun entitas yang lebih rumit (misalnya entitas yang membutuhkan anak-anak atau banyak data yang gagal) saya telah menggunakan fungsi (misalnya 'getFactory') untuk membuat elemen itu sesuai kebutuhan saya.
Saya tidak berpikir ada satu pendekatan "benar" karena setiap kali saya memiliki persyaratan ini sudah sedikit berbeda.
Semoga berhasil! Saya harap saya telah memberi Anda beberapa makanan untuk dipikirkan dan tidak mengoceh terlalu banyak;)
dapatkah Anda memberikan sedikit lebih detail tentang apa yang Anda maksud tentang 'layanan yang menghasilkan semua bentuk'? Saya juga sedang mengerjakan proyek yang benar-benar berpusat pada bentuk saat ini dan akan bagus jika memiliki perspektif yang berbeda tentang itu.
user2268997
2
saat menggunakan doktrin, konstruktor tidak dipanggil ketika suatu entitas dimuat dari db.
NDM
43
Jika Anda perlu menetapkan nilai default dan formulir Anda terkait dengan entitas, maka Anda harus menggunakan pendekatan berikut:
Dalam hal array bukan entitas, ganti saja $options['data']->getMyField()dengan$option['data']['myField']
ggg
3
Ini adalah cara yang tepat untuk menambah / memperbarui, saya pikir. Tapi aku benci Symfony membuatnya terlalu rumit.
Yarco
Ini satu-satunya jawaban yang bagus. Saya tidak mengerti jawaban lain ketika saya melihat dokumen. empty_data: Opsi ini menentukan nilai apa yang akan dikembalikan bidang ketika nilai yang dikirimkan kosong. Itu tidak menetapkan nilai awal
Vincent Decaux
19
Anda dapat mengatur default untuk bidang terkait di kelas model Anda (dalam pemetaan definisi atau mengatur sendiri nilainya).
Selanjutnya, FormBuilder memberi Anda kesempatan untuk mengatur nilai awal dengan metode setData () . Pembuat formulir diteruskan ke metode createForm () dari kelas formulir Anda.
Tambahkan nilai default ke atribut data saat menambahkan bidang dengan FormBuilder, diadaptasi dari jawaban Dmitriy.
Perhatikan bahwa ini mengasumsikan bahwa properti akan dan hanya akan memiliki nilai nol ketika itu adalah entitas yang baru, dan bukan yang sudah ada.
Yang pertama berfungsi (terima kasih!), Yang kedua tidak (untuk saya): $ options ["data] selalu diset, jadi nilai default tidak akan pernah digunakan. Saya masih bertanya-tanya apakah solusi nomor 1 adalah cara yang dimaksudkan untuk melakukannya ...
herrjeh42
Anda benar tentang $ options ['data'] yang selalu disetel. Jika Anda tidak menginisialisasi bidang entitas, Anda bisa menguji nol pada bidang itu, misalnya. 'data' => $ options ['data'] -> getColor ()! == null? dll ... Itu mengasumsikan bahwa null bukan nilai yang valid untuk bidang warna, sehingga entitas yang ada tidak akan pernah memiliki nilai nol untuk bidang itu.
crysallus
ah, bodoh saya: Saya mencobanya dengan 'isset ($ $ options [' data '] -> getColor ())', saya mendapat pesan kesalahan tentang "menggunakannya dalam konteks penulisan tidak diperbolehkan" dan lupa bahwa saya harus periksa berbeda :-)
herrjeh42
1
Sebenarnya sepertinya ada saat-saat ketika entri data tidak diatur. Lebih aman untuk menguji keduanya, yaitu isset ($ options ['data']) && $ options ['data'] -> getColor ()! == null? ...
crysallus
9
Anda dapat menetapkan nilai default, misalnya untuk formulir message, seperti ini:
$defaultData = array('message'=>'Type your message here');
$form = $this->createFormBuilder($defaultData)->add('name','text')->add('email','email')->add('message','textarea')->add('send','submit')->getForm();
Jika formulir Anda dipetakan ke Entitas, Anda bisa seperti ini (mis. Nama pengguna default):
Saya lebih suka metode ini, terutama karena di sebagian besar aplikasi Anda membuat formulir dan mengirimkan entitas yang berhubungan dengan formulir.
terlatih
9
Solusi umum untuk setiap kasus / pendekatan, terutama dengan menggunakan formulir tanpa kelas atau ketika kita membutuhkan akses ke layanan apa pun untuk menetapkan nilai default:
"Opsi data selalu mengesampingkan nilai yang diambil dari data domain (objek) saat rendering. Ini berarti nilai objek juga ditimpa ketika formulir mengedit objek yang sudah ada, menyebabkannya kehilangan nilai tetapnya ketika formulir dikirimkan."
Gunakan yang berikut ini:
Katakanlah, untuk contoh ini, Anda memiliki Entity Foo, dan ada bidang "aktif" (dalam contoh ini adalah CheckBoxType, tetapi prosesnya sama untuk setiap jenis lainnya), yang ingin Anda periksa secara default
Di kelas FooFormType Anda, tambahkan:
...useSymfony\Component\Form\FormEvent;useSymfony\Component\Form\FormEvents;...publicfunction 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);});}publicfunction configureOptions(OptionsResolver $resolver ){
$resolver->setDefaults(array('data_class'=>'AppBundle:Foo',));}
Ini uang !! Gunakan pendengar acara formulir untuk memeriksa nilai Anda sebelum menyetelnya. Ini harus menjadi jawaban yang diterima untuk nilai default dalam formulir Anda karena itu berfungsi untuk tindakan baru dan tindakan Edit.
tlorens
Ini adalah cara yang tepat untuk menangani ini dan ini harus menjadi jawaban yang diterima.
Bettinz
Apa yang Anda sebutkan di awal tidak benar jika Anda menggunakan conditional / ternary. Seperti ini:'data' => $data['myfield'] ?? 'Default value'
Anda ingin menyesuaikan cara formulir dibuat berdasarkan data di entitas Anda. Jika entitas sedang dibuat maka gunakan beberapa nilai default. Jika entitas yang ada gunakan nilai database.
Secara pribadi, saya pikir solusi @ MolecularMans adalah cara untuk pergi. Saya benar-benar akan menetapkan nilai default di konstruktor atau dalam pernyataan properti. Tetapi Anda sepertinya tidak menyukai pendekatan itu.
Anda menggantung pendengar pada jenis formulir Anda dan kemudian Anda dapat memeriksa entitas Anda dan menyesuaikan pembangun-> menambahkan pernyataan sesuai berdasarkan memiliki entitas baru atau yang sudah ada. Anda masih perlu menentukan nilai-nilai default Anda di suatu tempat meskipun Anda bisa kode mereka di pendengar Anda. Atau meneruskannya ke dalam bentuk formulir.
Sepertinya banyak pekerjaan. Lebih baik hanya meneruskan entitas ke formulir dengan nilai-nilai defaultnya sudah ditetapkan.
Jika Anda menggunakan FormBuilderdalam symfony 2.7 untuk menghasilkan formulir, Anda juga dapat meneruskan data awal ke createFormBuildermetode Controler
Jika Anda menetapkan 'data' dalam formulir kreasi Anda, nilai ini tidak akan diubah saat mengedit entitas Anda.
Solusi saya adalah:
publicfunction 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',));}
Jauh lebih bermanfaat, daripada jawaban yang diterima! Jika Anda menggunakan PHP7 + Anda dapat membuatnya lebih rapi dengan:'data' => $data['myfield'] ?? 'Default value',
Boykodev
Anda memiliki fungsi salah ketik di array_key_exists ()
Deadpool
1
Nilai default ditetapkan dengan mengkonfigurasi entitas yang sesuai. Sebelum mengikat entitas ke bentuk, setel bidang warnanya ke "# 0000FF":
pendekatan ini berfungsi, tetapi memiliki kelemahan yang harus Anda lakukan setiap kali Anda menggunakan kelas bentuk & sangat verbose (banyak pernyataan yang ditetapkan). Karena komponen bentuknya sangat elegan, pasti ada sesuatu yang lain. Tapi terima kasih :-)
herrjeh42
@ jamie0726 Menurut pendapat saya adalah tanggung jawab pengontrol untuk mengatur nilai-nilai objek setiap kali itu baru atau diambil. Dengan begitu Anda dapat memiliki formulir yang digunakan dalam situasi yang berbeda dengan perilaku yang berbeda, misalnya, warna baru dapat berubah karena pengguna memiliki peran manajer atau supermanager, dan karena ini adalah logika bisnis, yang harus dikontrol oleh pengontrol atau layanan, bukan formulir. Jadi seperti yang dikatakan Cerad, saya juga lebih suka solusi ini. Anda selalu dapat membuat layanan untuk menetapkan nilai-nilai default dan dalam pengontrol menggunakan layanan itu tetap KERING.
saamorim
Ini adalah solusi yang saya pilih, karena cocok dengan logika yang saya pikir. Kontroler yang dihasilkan memiliki metode berbeda untuk membuat formulir EDIT dan BUAT, dan itulah tempat saya mengatur data default / awal untuk entitas baru.
alumi
1
Jika bidang itu terikat pada suatu entitas (adalah properti dari entitas itu), Anda dapat menetapkan nilai default untuknya.
Ini sepertinya tidak berfungsi ketika 'empty_data'sebuah panggilan balik digunakan untuk memungkinkan param konstruktor pada entitas.
NDM
1
Seperti yang Brian tanyakan:
empty_data tampaknya hanya mengatur bidang ke 1 saat itu dikirimkan tanpa nilai. Bagaimana dengan ketika Anda ingin form secara default menampilkan 1 pada input ketika tidak ada nilai?
Anda dapat mengatur nilai default dengan empty_value
Jawaban:
Dapat digunakan selama pembuatan dengan mudah dengan:
sumber
'data'
kunci untuk'value'
empty_data
data
tidak berguna - itu menimpa nilai yang disimpan.empty_data
tidak menunjukkan nilainya, ia menggunakannya pada nilai kosong yang dikirimkan dan membuatnya tidak mungkin untuk menyimpan pilihan yang tidak dicentang.Anda dapat mengatur nilai default dengan
empty_data
sumber
Saya telah merenungkan ini beberapa kali di masa lalu jadi saya pikir saya akan menuliskan berbagai ide yang saya miliki / gunakan. Sesuatu mungkin berguna, tetapi tidak ada solusi Symfony2 "sempurna".
Konstruktor Dalam Entitas Anda dapat melakukan $ this-> setBar ('nilai default'); tetapi ini disebut setiap kali Anda memuat entitas (db atau tidak) dan agak berantakan. Namun itu berfungsi untuk setiap jenis bidang karena Anda dapat membuat tanggal atau apa pun yang Anda butuhkan.
Jika pernyataan dalam get's saya tidak akan, tetapi Anda bisa.
Pabrik / contoh . Panggil fungsi statis / kelas sekunder yang memberi Anda Entitas default yang diisi sebelumnya dengan data. Misalnya
Tidak terlalu ideal mengingat Anda harus mempertahankan fungsi ini jika Anda menambahkan bidang tambahan, tetapi itu berarti Anda memisahkan seter data / default dan apa yang dihasilkan dari db. Demikian pula Anda dapat memiliki beberapa getFactories jika Anda menginginkan data standar yang berbeda.
Entitas Extended / Refleksi Membuat Entitas yang diperluas (mis. FooCreate extends Foo) yang memberi Anda data default pada waktu pembuatan (melalui konstruktor). Mirip dengan ide Pabrik / contoh hanya pendekatan yang berbeda - Saya lebih suka metode statis secara pribadi.
Setel Data sebelum membangun formulir Di konstruktor / layanan, Anda tahu apakah Anda memiliki entitas baru atau jika itu diisi dari db. Oleh karena itu masuk akal untuk memanggil data yang diset pada bidang yang berbeda saat Anda mengambil entitas baru. Misalnya
Formulir Acara Saat Anda membuat formulir, Anda menetapkan data default saat membuat bidang. Anda menimpa ini menggunakan pendengar acara PreSetData. Masalah dengan ini adalah bahwa Anda menduplikasi formulir beban kerja / duplikasi kode dan membuatnya lebih sulit untuk dipertahankan / dipahami.
Formulir yang diperluas Mirip dengan Formulir acara, tetapi Anda memanggil jenis yang berbeda tergantung pada apakah itu db / entitas baru. Maksud saya, Anda memiliki FooType yang mendefinisikan formulir edit Anda, BarType memperluas FooType ini dan menyetel semua data ke bidang. Di controller Anda, Anda cukup memilih tipe formulir yang ingin dihasut. Ini menyebalkan jika Anda memiliki tema khusus dan suka acara, membuat terlalu banyak pemeliharaan sesuai dengan keinginan saya.
Ranting Anda dapat membuat tema Anda sendiri dan default data menggunakan opsi nilai juga ketika Anda melakukannya berdasarkan per-bidang. Tidak ada yang menghentikan Anda membungkus ini menjadi tema formulir baik Anda ingin menjaga template Anda bersih dan formulir dapat digunakan kembali. misalnya
JS Akan sepele untuk mengisi formulir dengan fungsi JS jika bidang kosong. Anda dapat melakukan sesuatu dengan placeholder misalnya. Tapi ini ide yang buruk.
Formulir sebagai layanan Untuk salah satu proyek berbasis formulir besar yang saya lakukan, saya membuat layanan yang menghasilkan semua formulir, melakukan semua pemrosesan, dll. Ini karena formulir akan digunakan di beberapa pengontrol di beberapa lingkungan dan sementara formulir dihasilkan / ditangani dengan cara yang sama, mereka ditampilkan / berinteraksi dengan berbeda (misalnya penanganan kesalahan, pengalihan dll). Keindahan dari pendekatan ini adalah bahwa Anda dapat mengatur data secara default, melakukan semua yang Anda butuhkan, menangani kesalahan secara umum, dll, dan semuanya dienkapsulasi di satu tempat.
Kesimpulan Seperti yang saya lihat, Anda akan mengalami masalah yang sama berulang kali - di mana data default untuk hidup?
Untuk itu, saya sudah mendekati masalah secara berbeda setiap kali. Misalnya, opsi formulir "buletin" pendaftaran mudah (dan secara logis) disetel di konstruktor sebelum membuat formulir. Ketika saya sedang membangun koleksi formulir yang ditautkan bersama (mis. Tombol radio mana dalam berbagai jenis formulir ditautkan bersama) maka saya telah menggunakan Pendengar Acara. Ketika saya telah membangun entitas yang lebih rumit (misalnya entitas yang membutuhkan anak-anak atau banyak data yang gagal) saya telah menggunakan fungsi (misalnya 'getFactory') untuk membuat elemen itu sesuai kebutuhan saya.
Saya tidak berpikir ada satu pendekatan "benar" karena setiap kali saya memiliki persyaratan ini sudah sedikit berbeda.
Semoga berhasil! Saya harap saya telah memberi Anda beberapa makanan untuk dipikirkan dan tidak mengoceh terlalu banyak;)
sumber
Jika Anda perlu menetapkan nilai default dan formulir Anda terkait dengan entitas, maka Anda harus menggunakan pendekatan berikut:
Jika tidak,
myField
selalu akan ditetapkan ke nilai default, alih-alih mendapatkan nilai dari entitas.sumber
$options['data']->getMyField()
dengan$option['data']['myField']
empty_data
: Opsi ini menentukan nilai apa yang akan dikembalikan bidang ketika nilai yang dikirimkan kosong. Itu tidak menetapkan nilai awalAnda dapat mengatur default untuk bidang terkait di kelas model Anda (dalam pemetaan definisi atau mengatur sendiri nilainya).
Selanjutnya, FormBuilder memberi Anda kesempatan untuk mengatur nilai awal dengan metode setData () . Pembuat formulir diteruskan ke metode createForm () dari kelas formulir Anda.
Juga, periksa tautan ini: http://symfony.com/doc/current/book/forms.html#using-a-form-without-a-class
sumber
Jika formulir Anda terikat pada suatu entitas, cukup atur nilai default pada entitas itu sendiri menggunakan metode konstruk:
sumber
'mapped' => false
). GunakansetData(...)
untuk ini.Pendekatan 1 (dari http://www.cranespud.com/blog/dead-simple-default-values-on-symfony2-forms/ )
Cukup setel nilai default di entitas Anda, baik dalam deklarasi variabel atau konstruktor:
atau
Pendekatan 2 dari komentar di tautan di atas, dan juga jawaban Dmitriy (bukan yang diterima) dari Cara mengatur nilai default untuk bidang formulir di Symfony2?
Tambahkan nilai default ke atribut data saat menambahkan bidang dengan FormBuilder, diadaptasi dari jawaban Dmitriy.
Perhatikan bahwa ini mengasumsikan bahwa properti akan dan hanya akan memiliki nilai nol ketika itu adalah entitas yang baru, dan bukan yang sudah ada.
sumber
Anda dapat menetapkan nilai default, misalnya untuk formulir
message
, seperti ini:Jika formulir Anda dipetakan ke Entitas, Anda bisa seperti ini (mis. Nama pengguna default):
sumber
Solusi umum untuk setiap kasus / pendekatan, terutama dengan menggunakan formulir tanpa kelas atau ketika kita membutuhkan akses ke layanan apa pun untuk menetapkan nilai default:
dan daftarkan ekstensi formulir:
Setelah itu, kita dapat menggunakan
default
opsi di bidang formulir apa pun:sumber
Jangan gunakan:
Baca di sini: https://symfony.com/doc/current/reference/forms/types/form.html#data
"Opsi data selalu mengesampingkan nilai yang diambil dari data domain (objek) saat rendering. Ini berarti nilai objek juga ditimpa ketika formulir mengedit objek yang sudah ada, menyebabkannya kehilangan nilai tetapnya ketika formulir dikirimkan."
Gunakan yang berikut ini:
Katakanlah, untuk contoh ini, Anda memiliki Entity Foo, dan ada bidang "aktif" (dalam contoh ini adalah CheckBoxType, tetapi prosesnya sama untuk setiap jenis lainnya), yang ingin Anda periksa secara default
Di kelas FooFormType Anda, tambahkan:
sumber
'data' => $data['myfield'] ?? 'Default value'
sumber
$event->setData()
alih-alih membaca bidang mungkin membuatnya lebih baik.Solusi saya:
sumber
Jadi saya mengerti masalahnya.
Anda ingin menyesuaikan cara formulir dibuat berdasarkan data di entitas Anda. Jika entitas sedang dibuat maka gunakan beberapa nilai default. Jika entitas yang ada gunakan nilai database.
Secara pribadi, saya pikir solusi @ MolecularMans adalah cara untuk pergi. Saya benar-benar akan menetapkan nilai default di konstruktor atau dalam pernyataan properti. Tetapi Anda sepertinya tidak menyukai pendekatan itu.
Sebaliknya, Anda dapat mengikuti ini: http://symfony.com/doc/current/cookbook/form/dynamic_form_modification.html
Anda menggantung pendengar pada jenis formulir Anda dan kemudian Anda dapat memeriksa entitas Anda dan menyesuaikan pembangun-> menambahkan pernyataan sesuai berdasarkan memiliki entitas baru atau yang sudah ada. Anda masih perlu menentukan nilai-nilai default Anda di suatu tempat meskipun Anda bisa kode mereka di pendengar Anda. Atau meneruskannya ke dalam bentuk formulir.
Sepertinya banyak pekerjaan. Lebih baik hanya meneruskan entitas ke formulir dengan nilai-nilai defaultnya sudah ditetapkan.
sumber
Jika Anda menggunakan
FormBuilder
dalam symfony 2.7 untuk menghasilkan formulir, Anda juga dapat meneruskan data awal kecreateFormBuilder
metode Controlersumber
Seringkali, untuk nilai standar init saya menggunakan fixture. Tentu cara ini tidak mudah, tetapi sangat nyaman.
Contoh:
Namun, bidang tipe symfony memiliki data opsi .
Contoh
sumber
Ada cara yang sangat sederhana, Anda dapat mengatur default seperti di sini:
sumber
Jika Anda menetapkan 'data' dalam formulir kreasi Anda, nilai ini tidak akan diubah saat mengedit entitas Anda.
Solusi saya adalah:
Sampai jumpa.
sumber
'data' => $data['myfield'] ?? 'Default value',
Nilai default ditetapkan dengan mengkonfigurasi entitas yang sesuai. Sebelum mengikat entitas ke bentuk, setel bidang warnanya ke "# 0000FF":
sumber
Jika bidang itu terikat pada suatu entitas (adalah properti dari entitas itu), Anda dapat menetapkan nilai default untuknya.
Sebuah contoh:
sumber
Saya biasanya hanya menetapkan nilai default untuk bidang tertentu di entitas saya:
Ini akan berfungsi untuk catatan baru atau jika hanya memperbarui yang sudah ada.
sumber
'empty_data'
sebuah panggilan balik digunakan untuk memungkinkan param konstruktor pada entitas.Seperti yang Brian tanyakan:
Anda dapat mengatur nilai default dengan
empty_value
sumber
Saya memecahkan masalah ini, dengan menambahkan nilai dalam attr :
sumber