web-gelistirme-sc.com

Symfony2 gömülü bir formun alan seçeneklerini değiştirme

Benim sorum temel olarak, gömülü bir alanın bir seçimini ana formdan değiştirmek mümkün mü?

Sorunu göstermek için şunu düşünün; Bunun gibi bir ebeveyn form tipi sınıfım var:

class FruitFormType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('name', 'text')
            ->add('Apple', new AppleFormType())
        ;
    }

ve ayrı bir pakette bulunan bir alt form türü sınıfı ve düzenlememeyi tercih ederim, şöyle:

class AppleFormType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('name', 'text')
            ->add('qty', 'integer', array('label' => 'rubbish label')
        ;
    }

ve qty etiketini başka bir şeyle değiştirmek istiyorum, ancak bunu FruitForm öğesinin kullanıldığı her yerde değil, sadece AppleForm içinde yapmak istiyorum. Gibi bir şey yapmayı ummuştum:

class FruitFormType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('name', 'text')
            ->add('Apple', new AppleFormType(), array('qty' => array('label' => 'better label')))
        ;
    }

veya:

class FruitFormType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('name', 'text')
            ->add('Apple', new AppleFormType())
        ;

        $builder->get('Apple')->get('qty')->setOption('label', 'better label');
    }

fakat bunların hiçbiri (ve bir kaç başka girişimde) beni başarısızlığa uğratmadı. Görebildiğim bir setOption yöntemi yok.

Bunu yapmanın bir yolunu bilen var mı?

Teşekkürler

19
lopsided

Ayrıca FOSUserBundle'dan mevcut bir alan için bariz bir şekilde "etiketi değiştir" seçeneğini değiştirmek istedim. Bunu Twig'de veya çevirilerde yapabileceğimi biliyorum.

@ redbirdo bana doğru yönde işaret etti, "aynı isimde bir alan eklemek yerine" gibi görünüyor. İşte çözüm:

$field = $builder->get('username');         // get the field
$options = $field->getOptions();            // get the options
$type = $field->getType()->getName();       // get the name of the type
$options['label'] = "Login Name";           // change the label
$builder->add('username', $type, $options); // replace the field
40
Peter Wooster

@Peter Wooster'a çok teşekkürler. Symfony 3.0'da biraz farklı bir şey kullanmak zorunda kaldım:

Bunun gibi alanlar ekleyen özel bir Form Tipim var:

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder->add('my_field', ChoiceType::class, [
        // Some options here...
        'multiple' => false,
    ]);
}

Ve başka bir özel Form Tipinde extend yukarıdaki Tiplere ihtiyacım var ve bazı seçenekleri değiştirmeliyim:

public function buildForm(FormBuilderInterface $builder, array $options)
{
    parent::buildForm($builder, $options);

    $myField = $builder->get('my_field');
    $fieldOptions = $myField->getOptions();
    // Retrieve the FormType. That is the part that is different.
    $fieldType = get_class($myField->getType()->getInnerType());
    $fieldOptions['multiple'] = true;
    // I can obviously put the name 'my_field' directly here
    $builder->add($myField->getName(), $fieldType, $fieldOptions);
}

Yukarıdaki cevaplar sayesinde benimki yardımcı olur umarım!

8
peamak

Böyle bir şey dene:

class AppleFormType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('name', 'text')
            ->add('qty', 'integer', array('label' => $options['qtyLabel'])
        ;
    }

    public function getDefaultOptions()
    {
        return array(
            'qtyLabel' = 'rubbish label';
        );
    }
}

ve:

class FruitFormType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('name', 'text')
            ->add('Apple', new AppleFormType(), array('qtyLabel' => 'better label'))
        ;
    }
}
8
redbirdo

Form oluşturucu koduna erişemediğim ancak bir 'required' => true eklemek için alan seçeneklerini geçersiz kılmam gereken bir durumdayım.

@ Peter-wooster ve @thedamnedrhino genişleyen github ( https://github.com/symfony/symfony/issues/11188 ) ile ilgili bir symfony sorununa cevap veriyor.

$field = $form->get('combinaisons');
$options = $field->getConfig()->getOptions();
$type = $field->getConfig()->getType()->getName();
$options['required'] = true;
unset($options['em']);
$form->add('combinaisons', $type, $options); 

Bu, symfony/symfony: 2.3.21, doctrine/doctrine-bundle: 1.2.0 ve doctrine/orm: 2.3.6 ile uyumludur.

3
Daishi

Görünümü değiştirmek, bu tür bir değişiklik için genellikle çok daha kolaydır.

$view->vars['label'] = 'New label';

Genelde görünümünüz bir ana form olacaktır, bu nedenle şöyle görünebilir - 'Tarih'> 'Yayınlanma tarihi' nden değiştirin:

$view = $form->createView(...);
$view->children['date']->vars['label'] = 'Publication date';

Formunuz kendi türünde kapsüllenmişse finishView işlevini kullanabilirsiniz:

public function finishView(FormView $view, FormInterface $form, array $options)
{
    $view->children['date']->vars['label'] = 'Publication date';
}

Nihayet render için motor motoruna geçirilenlerin çoğu düz dizi biçiminde olduğundan, bu noktada oldukça fazla şeyle uğraşabilirsiniz.

0
Henry