Symfony misd手机号码捆绑如何提供现有手机

时间:2016-06-02 11:18:12

标签: symfony-forms symfony

我正在使用优质邮件https://github.com/misd-service-development/phone-number-bundle来存储和检索电话号码,但是当我想用它预先填写表单(不是同一个实体)时,我遇到了问题。

我在Type

中有以下代码
<?php

namespace AppBundle\Form;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Form\FormEvent;
use Symfony\Component\Form\FormEvents;
use Symfony\Component\Form\FormInterface;
use Symfony\Component\Form\FormView;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
use Symfony\Component\Form\Extension\Core\Type\EmailType;
use Symfony\Component\Form\Extension\Core\Type\MoneyType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\Extension\Core\Type\TextareaType;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
use libphonenumber\PhoneNumberFormat;
use Misd\PhoneNumberBundle\Form\Type\PhoneNumberType;

class CreateAdType extends AbstractType
{
    private $tokenStorage;


    public function __construct(TokenStorageInterface $tokenStorage)
    {
        $this->tokenStorage = $tokenStorage;
    }


    //Builds the form
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        //Defines data
        $user = $this->tokenStorage->getToken()->getUser();
        $userEmail = is_object($user) ? $user->getEmail() : '';
        $userPhone = is_object($user) ? $user->getPhone() : '';

        //Defines fields
        $builder
            ->add('phone', PhoneNumberType::class, array(
                'label' => 'label.phone',
                'disabled' => $disabled,
                'widget' => PhoneNumberType::WIDGET_COUNTRY_CHOICE,
                'country_choices' => array(
                    'FR',
                ),
                ))
            ->add('email', EmailType::class, array(
                'label' => 'label.email',
                'disabled' => $disabled,
                'required' => true,
                'attr' => array(
                    'placeholder' => 'placeholder.email',
                    'value' => $userEmail,
                )))
            ;
    }


    public function finishView(FormView $view, FormInterface $form, array $options)
    {
        $view['phone']->children['number']->vars['data'] = '123456789';
    }


    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'AppBundle\Entity\Ad',
        ));
    }


    public function setDefaultOptions(OptionsResolverInterface $resolver)
        {
            $resolver->setDefaults(array(
                // a unique key to help generate the secret token
                'intention' => 'createAdForm',
            ));
        }


    public function getName()
    {
        return 'createAd';
    }

}

生成的html代码如下

<div class="form-group">
    <label>Phone</label>
    <div>
        <div id="create_ad_phone" value="**THE_VALUE_APPEARS_HERE**">
            <select id="create_ad_phone_country" name="create_ad[phone][country]">
                <option value="FR" >France (+33)</option>
            </select>
            <input type="text" id="create_ad_phone_number" name="create_ad[phone][number]" value="**BUT_I_NEED_THE_VALUE_HERE**" />
        </div>
    </div>
</div>

这会将值设置为手机div,而不是输入phone_number,我需要它。有办法吗?

3 个答案:

答案 0 :(得分:1)

在你的方法添加中,您可以使用选择

的选项
         $builder
            ->add('phone', PhoneNumberType::class, array(
                'widget' => PhoneNumberType::WIDGET_COUNTRY_CHOICE,
                'country_choices' => array(
                    'FR',
                ),
                'choices' => array('number' => $user->getPhone))
            );

答案 1 :(得分:1)

在您的表单类型中,请不要忘记use

...
use Symfony\Component\Form\FormInterface;
use Symfony\Component\Form\FormView;
...

    public function finishView(FormView $view, FormInterface $form, array $options)
    {
        $view['phone']->children['number']->vars['value'] = $view['phone']->children['number']->vars['value'] ? $view['phone']->children['number']->vars['value'] : '+13008228232';
    }

答案 2 :(得分:0)

你是否在树枝模板中渲染? 如果是这样,你试过传递&#34; $ user&#34;从控制器反对twig模板,然后调用&#34; getPhone&#34;功能在树枝上。

就像这样,在你的控制器中:

return $this->render('default/some_template.html.twig', array(
        'form' => $form->createView(),
        'user'  => $user,
));

然后在你的树枝模板中某处:

{{ form_widget(form.phone, {'value' : user.getPhone}) }}

尝试类似的东西,看它是否有效。 我没试过这个 - 但它可能有用。