Symfony misd phone number bundle 如何提供现有的 phone

Symfony misd phone number bundle how to provide existing phone

我正在使用大包 https://github.com/misd-service-development/phone-number-bundle 来存储和检索 phone 号码,但是当我想用它预填表格时遇到问题(不是同一个实体)。

我的类型中有以下代码

<?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>

这会将值设置为 phone div,但不会设置为我需要的输入 phone_number。有办法吗?

您是在 twig 模板中渲染吗? 如果是这样,您是否尝试过将“$user”对象从控制器传递给 twig 模板,然后在 twig 中调用 "getPhone" 函数。

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

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

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

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

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

在您的添加方法中,您可以使用选项 select

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

在你的表单类型之后,不要忘记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';
    }