Metin formu alanı için varsayılan bir değer ayarlamanın kolay bir yolu var mı?
Metin formu alanı için varsayılan bir değer ayarlamanın kolay bir yolu var mı?
Yanıtlar:
Oluşturma sırasında aşağıdakilerle kolayca kullanılabilir:
->add('myfield', 'text', array(
'label' => 'Field',
'empty_data' => 'Default value'
))
'data'
anahtarı değiştirmek zorunda kaldım'value'
empty_data
data
yararsızdır - kaydedilen değerin üzerine yazar. empty_data
değeri göstermez, boş değer gönderimi üzerinde kullanır ve denetlenmeyen seçimlerin kaydedilmesini imkansız hale getirir.
ile varsayılan değeri ayarlayabilirsiniz empty_data
$builder->add('myField', 'number', ['empty_data' => 'Default value'])
Bunu geçmişte birkaç kez düşündüm, bu yüzden kullandığım / kullandığım farklı fikirleri not edeceğim. Bir şey işe yarayabilir, ancak hiçbiri "mükemmel" Symfony2 çözümleri değildir.
Oluşturucu Varlıkta $ this-> setBar ('default value'); ancak bu, varlığı her yüklediğinizde (db veya değil) çağrılır ve biraz dağınıktır. Bununla birlikte, tarihler veya ihtiyacınız olan başka şeyler oluşturabildiğiniz için her alan türü için çalışır.
Eğer get içindeki ifadeler yapmazdım, ama yapabilirsin.
return ( ! $this->hasFoo() ) ? 'default' : $this->foo;
Fabrika / örnek . Verilerle önceden doldurulmuş varsayılan bir Varlık sağlayan statik bir işlevi / ikincil sınıfı çağırın. Örneğin
function getFactory() {
$obj = new static();
$obj->setBar('foo');
$obj->setFoo('bar');
return $obj;
}
Fazladan alanlar eklerseniz bu işlevi sürdürmeniz gerektiği göz önüne alındığında gerçekten ideal değildir, ancak bu, veri ayarlayıcılarını / varsayılanı ayırdığınız ve db'den oluşturulanı anlamına gelir. Benzer şekilde, farklı varsayılan veriler istiyorsanız birden fazla getFactories'iniz olabilir.
Genişletilmiş / Yansıma varlıkları Oluşturma zamanında size (varsayılan olarak) oluşturucu (yapıcı aracılığıyla) veren bir genişletme Varlığı oluşturun (örn. FooCreate Foo'yu genişletir). Fabrika / örnek fikrine sadece farklı bir yaklaşım gibi - statik yöntemleri şahsen tercih ediyorum.
Derleme formundan önce Verileri Ayarlama Yapıcılarda / hizmette, yeni bir varlığınız olup olmadığını veya db'den doldurulduğunu bilirsiniz. Bu nedenle, yeni bir varlık aldığınızda farklı alanlardaki set verilerini çağırmak mantıklıdır. Örneğin
if( ! $entity->isFromDB() ) {
$entity->setBar('default');
$entity->setDate( date('Y-m-d');
...
}
$form = $this->createForm(...)
Form Olayları Formu oluşturduğunuzda, alanları oluştururken varsayılan verileri ayarlarsınız. Bu kullanım PreSetData olay dinleyicisini geçersiz kılar. Buradaki sorun, form iş yükü / çoğaltma kodunu çoğaltmanız ve bakımını / anlaşılmasını zorlaştırmanızdır.
Genişletilmiş formlar Form olaylarına benzer, ancak bir db / yeni varlık olmasına bağlı olarak farklı türü çağırırsınız. Bu, düzenleme formunuzu tanımlayan FooType'a sahip olduğunuz anlamına gelir, BarType, FooType'ı genişletir ve tüm verileri alanlara ayarlar. Daha sonra kontrol cihazınızda hangi form tipinin tahrik edileceğini seçersiniz. Özel bir temanız olsa da ve olaylar gibi, bu benim beğenme için çok fazla bakım yaratır.
Dal Her alan için ayrı ayrı yaptığınızda değer seçeneğini kullanarak kendi temanızı oluşturabilir ve verileri varsayılan olarak ayarlayabilirsiniz. Şablonlarınızı temiz tutmak ve formu yeniden kullanmak isterseniz, bunu bir form temasına kaydırmanızı engelleyen hiçbir şey yoktur. Örneğin
form_widget(form.foo, {attr: { value : default } });
JS Alanlar boşsa, formu bir JS işleviyle doldurmak önemsiz olacaktır. Örneğin yer tutucularla bir şeyler yapabilirsiniz. Bu kötü, kötü bir fikir.
Hizmet olarak formlar Yaptığım büyük form tabanlı projelerden biri için, tüm formları üreten, tüm işlemleri vb. Yapan bir hizmet oluşturdum. aynı şekilde üretilir / işlenir, farklı şekilde görüntülenir / etkileşime girer (örn. hata yönetimi, yönlendirmeler vb.). Bu yaklaşımın güzelliği, verileri varsayılan olarak kullanabilmeniz, ihtiyacınız olan her şeyi yapabilmeniz, hataları genel olarak ele alabilmeniz vb. Ve bunların hepsi tek bir yerde kapsüllenmiştir.
Sonuç Gördüğüm gibi, tekrar tekrar aynı sayıda sorunla karşılaşacaksınız - varsayılan varsayılan veriler nerede?
Bu amaçla, soruna her seferinde farklı yaklaştım. Örneğin, bir kayıt formu "bülten" seçeneği formu oluşturmadan hemen önce yapıcıda kolayca (ve mantıksal olarak) ayarlanır. Birbirine bağlı formlar oluştururken (örneğin, farklı form türlerindeki hangi radyo düğmelerinin birbirine bağlandığı) o zaman Olay Dinleyicilerini kullandım. Daha karmaşık bir varlık oluşturduğumda (örneğin, çocuklar veya varsayılan birçok veri gerektiren) Bir öğeyi (örneğin, 'getFactory') kullandığım için ihtiyaç duyduğum bir öğe oluşturdum.
Bu gereksinime sahip olduğum her seferinde biraz farklı olduğu için bir "doğru" yaklaşım olduğunu düşünmüyorum.
İyi şanslar! Umarım size herhangi bir oranda düşünce için yiyecek verdim ve çok fazla uğraşmadım;)
Varsayılan değeri ayarlamanız gerekiyorsa ve formunuz varlık ile ilgili ise, aşağıdaki yaklaşımı kullanmalısınız:
// buildForm() method
public function buildForm(FormBuilderInterface $builder, array $options) {
$builder
...
->add(
'myField',
'text',
array(
'data' => isset($options['data']) ? $options['data']->getMyField() : 'my default value'
)
);
}
Aksi takdirde, myField
varlıktan değer almak yerine her zaman varsayılan değere ayarlanır.
$options['data']->getMyField()
$option['data']['myField']
empty_data
: Bu seçenek, gönderilen değer boş olduğunda alanın hangi değeri döndüreceğini belirler. Bir başlangıç değeri belirlemez
Model sınıfınızdaki ilgili alan için varsayılanı ayarlayabilirsiniz (eşleme tanımında veya değeri kendiniz ayarlayabilirsiniz).
Ayrıca, FormBuilder setData () yöntemiyle başlangıç değerlerini ayarlama şansı verir . Form oluşturucu, form sınıfınızın createForm () yöntemine iletilir .
Ayrıca, bu bağlantıyı kontrol edin: http://symfony.com/doc/current/book/forms.html#using-a-form-without-a-class
Formunuz bir varlığa bağlıysa, construct yöntemini kullanarak varlığın kendisinde varsayılan değeri ayarlamanız yeterlidir:
public function __construct()
{
$this->field = 'default value';
}
'mapped' => false
). setData(...)
Bunlar için kullanın .
Yaklaşım 1 ( http://www.cranespud.com/blog/dead-simple-default-values-on-symfony2-forms/ adresinden )
Varlıktaki varsayılan değeri, değişken bildiriminde veya yapıcıda ayarlamanız yeterlidir:
class Entity {
private $color = '#0000FF';
...
}
veya
class Entity {
private $color;
public function __construct(){
$this->color = '#0000FF';
...
}
...
}
Yukarıdaki bağlantıdaki bir yorumdan Yaklaşım 2 ve ayrıca Symfony2'de form alanı için varsayılan değer nasıl ayarlanır?
Dmitriy'nin cevabından uyarlanmış FormBuilder ile alan eklerken veri özniteliğine varsayılan değeri ekleyin.
Bunun, özelliğin yalnızca varolan bir varlık değil, yeni bir değer olduğunda null değerine sahip olacağını ve alacağını varsaydığını unutmayın .
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'
)
);
}
Varsayılan bir değer, örneğin form için şu şekilde ayarlayabilirsiniz 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();
Formunuzun bir Varlıkla eşleşmesi durumunda, şu şekilde gidebilirsiniz (örn. Varsayılan kullanıcı adı):
$user = new User();
$user->setUsername('John Doe');
$form = $this->createFormBuilder($user)
->add('username')
->getForm();
Herhangi bir vaka / yaklaşım için, temel olarak sınıfsız bir form kullanarak veya varsayılan değeri ayarlamak için herhangi bir hizmete erişmemiz gerektiğinde genel bir çözüm:
// 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;
}
}
ve form uzantısını kaydedin:
app.form_type_extension:
class: App\Form\Extension\DefaultFormTypeExtension
tags:
- { name: form.type_extension, extended_type: Symfony\Component\Form\Extension\Core\Type\FormType }
Bundan sonra, default
herhangi bir form alanında seçeneği kullanabiliriz :
$formBuilder->add('user', null, array('default' => $this->getUser()));
$formBuilder->add('foo', null, array('default' => 'bar'));
Kullanmayın:
'data' => 'Default value'
Burayı okuyun: https://symfony.com/doc/current/reference/forms/types/form.html#data
"Veri seçeneği, oluşturma sırasında her zaman etki alanı verilerinden (nesne) alınan değeri geçersiz kılar. Bu, form zaten var olan bir nesneyi düzenlediğinde nesne değerinin de geçersiz kılındığı ve form gönderildiğinde kalıcı değerinin kaybedilmesine neden olduğu anlamına gelir."
Aşağıdakileri kullanın:
Diyelim ki, bu örnek için bir Varlık Foo'unuz var ve varsayılan olarak denetlenmesini istediğiniz bir "etkin" alanı var (bu örnekte CheckBoxType, ancak işlem diğer tüm türlerle aynıdır).
FooFormType sınıfınıza şunları ekleyin:
...
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()
Alanı okumak yerine aramak onu daha da iyi hale getirebilir.
Sorunu anlıyorum.
Varlığınızdaki verilere göre formun oluşturulma şeklini ayarlamak istiyorsunuz. Varlık oluşturuluyorsa, bazı varsayılan değerler kullanın. Varlık varsa, veritabanı değerini kullanın.
Şahsen, @ MolecularMans'ın çözümü gitmenin yolu olduğunu düşünüyorum. Aslında yapıcı veya özellik deyimi varsayılan değerleri ayarlamak. Ama siz bu yaklaşımı sevmiyorsunuz.
Bunun yerine şunu takip edebilirsiniz : http://symfony.com/doc/current/cookbook/form/dynamic_form_modification.html
Bir dinleyiciyi form türünüze asarsınız ve sonra varlığınızı inceleyebilir ve oluşturucu-> add ifadelerini yeni veya mevcut bir varlığa sahip olacak şekilde buna göre ayarlayabilirsiniz. Dinleyicinizde yalnızca kodlayabilseniz de, varsayılan değerlerinizi bir yerde belirtmeniz gerekir. Veya bunları form türüne iletin.
Yine de çok iş gibi görünüyor. Varlığı, önceden ayarlanmış varsayılan değerleri ile forma geçirmek daha iyidir.
Genellikle, form i varsayılan değerleri için fikstür kullanın. Çünkü bu şekilde en kolay değil, çok rahat.
Misal:
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();
}
}
Ancak, symfony tipi alanında seçenek verileri vardır .
Misal
$builder->add('token', 'hidden', array(
'data' => 'abcdef',
));
Çok basit bir yol var, varsayılanları burada ayarlayabilirsiniz:
$defaults = array('sortby' => $sortby,'category' => $category,'page' => 1);
$form = $this->formfactory->createBuilder('form', $defaults)
->add('sortby','choice')
->add('category','choice')
->add('page','hidden')
->getForm();
Oluşturma formunuzda 'veri' ayarlarsanız, varlığınız düzenlenirken bu değer değiştirilmez.
Benim çözümüm:
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',
));
}
Hoşçakal.
'data' => $data['myfield'] ?? 'Default value',
Varsayılan değerler, ilgili varlık yapılandırılarak ayarlanır. Varlığı forma bağlamadan önce renk alanını "# 0000FF" olarak ayarlayın:
// controller action
$project = new Project();
$project->setColor('#0000FF');
$form = $this->createForm(new ProjectType(), $project);
Bu alan bir varlığa bağlıysa (o varlığın bir özelliğiyse) bunun için varsayılan bir değer belirleyebilirsiniz.
Bir örnek:
public function getMyField() {
if (is_null($this->MyField)) {
$this->setMyField('my default value');
}
return $this->MyField;
}
Genellikle varlığımdaki belirli bir alan için varsayılan değeri ayarladım:
/**
* @var int
* @ORM\Column(type="integer", nullable=true)
*/
protected $development_time = 0;
Bu, yeni kayıtlar için veya yalnızca mevcut kayıtlar güncelleniyorsa işe yarar.
'empty_data'
Varlık üzerindeki yapıcı parametrelerine izin vermek için bir geri çağırma kullanıldığında bu işe yaramıyor gibi görünüyor .
Brian'ın dediği gibi:
empty_data yalnızca değeri olmadan gönderildiğinde alanı 1 olarak ayarlamış gibi görünür. Hiçbir değer olmadığında formun varsayılan olarak girişte 1 görüntülemesini istediğinizde ne olur?
ile varsayılan değeri ayarlayabilirsiniz empty_value
$builder->add('myField', 'number', ['empty_value' => 'Default value'])