如何在Symfony Form字段上使用setAttribute

时间:2016-10-26 16:42:36

标签: php symfony

我尝试将stripe-data属性添加到使用createBuilder生成的字段。

这是我使用的代码:

$form = $this->formFactory->createBuilder(FormType::class, [
        'action' => $this->router->generate('storeSubscription', ['id' => $store->getId()]),
        'method' => 'POST',
    ])
        ->add('plan', PremiumType::class, [
            'data_class' => PremiumFeaturesEmbeddable::class,
            'data' => $store->getPremium(),
        ]);

    if (null === $store->getBranchOf()->getStripeCustomer() || null === $store->getBranchOf()->getStripeCustomer()->getDefaultSource()) {
        $form->add('credit_card', CreditCardStripeTokenType::class)
            ->add('company_data', CompanyType::class, [
                'data_class' => Company::class,
                'data' => $store->getBranchOf()
            ]);

        // Remove unused data
        $form->get('company_data')
            ->remove('brand')
            ->remove('primaryEmail')
            ->remove('description')
            ->remove('phoneNumber')
            ->remove('faxNumber')
            ->remove('save');

        // Set data-stripe
        $form->get('company_data')
            ->get('legalName')->setAttributes(['attr' => ['data-stripe', 'name']]);
    }

正如您所看到的,此代码的最后一行首先获得copmany_data表单类型,然后获取字段legalName:在此我要设置属性{{1} }。

但是这段代码不起作用。

要添加属性,我必须在Twig中使用stripe-data="name"

form_widget

这种方式可以正确添加属性。 当然,我可以继续在Twig中设置这些属性,但是我想在PHP中添加这些属性但不理解它为什么不起作用。有人能够解释我如何解决问题吗?谢谢!

我尝试了什么

测试1

<div class="form-group">
    {{ form_errors(form.company_data.legalName) }}
    {{ form_label(form.company_data.legalName) }}
    {{ form_widget(form.company_data.legalName, {'attr': {'class': 'form-control input-sm', 'data-stripe': 'name'}}) }}
</div>

测试2

// Set data-stripe
$form->get('company_data')
    ->get('legalName')->setAttributes(['data-stripe', 'name']);

测试3

// Set data-stripe
$form->get('company_data')
    ->get('legalName')->setAttribute('data-stripe', 'name');

没有人工作。我不知道该怎么做。

注意:我也开了issue on GitHub

3 个答案:

答案 0 :(得分:6)

如果您需要从任何现有字段添加/修改任何选项,请执行以下操作:

// to keep the current options
$options = $form->get('company_data')->get('legalName')->getConfig()->getOptions();

// add/change the options here
$options['attr']['data-stripe'] = 'name';

// re-define the field options
$form->get('company_data')->add('legalName', TextType::class, $options);

这不会改变字段的顺序,只会更改其选项。适用于buildForm()和监听/暂停事件的条件选项。

但是,如果你改变方法可能会以其他方式解决。

首先,向'add_stripe_name' => null表单类型添加新的默认选项CreditCardStripeTokenType,并将此值传递给'legalName'字段选项定义:

// into CreditCardStripeTokenType::buildForm():

$logalNameOptions = array();

if ($options['add_stripe_name']) {
    $logalNameOptions['attr']['data-stripe'] = $options['add_stripe_name'];
}

$builder->add('legalName', TextType::class, $logalNameOptions)

因此,'add_stripe_name'的{​​{1}}选项将成为将属性添加到CreditCardStripeTokenType字段的标志:

legalName

答案 1 :(得分:0)

当您创建嵌入表单类型company_data时,请指定attr

$builder->add('legalName', TextType::class, array(
       'attr' => array('data-stripe' => 'name'),
 ));

答案 2 :(得分:0)

根据第二个@ yceruto的方法,我有一个小的内联优化,我不能说它肯定更具可读性,但保存了一些行,并允许你从$调用的&gt; add()方法的连续链助洗剂:

正如他所提到的,首先,向'add_stripe_name' => null表单类型添加新的默认选项CreditCardStripeTokenType,并使用'legalName'函数将此值传递给array_merge_recursive()字段选项定义:

// into CreditCardStripeTokenType::buildForm():

$builder->add('legalName', TextType::class, array_merge_recursive([], // <---- here other options are stored if any, could be empty as well
    $options['add_stripe_name'] !== null ? ['attr' => ['data-stripe' => $options['add_stripe_name']]] : []
);

因此,'add_stripe_name'的{​​{1}}选项将成为将属性添加到CreditCardStripeTokenType字段的标志:

legalName