【问题标题】:Handle extra form fields in Symfony2在 Symfony2 中处理额外的表单字段
【发布时间】:2014-09-03 08:23:03
【问题描述】:

我有一个包含此内容的ExtraPerfilType Symfony2 表单(无关信息已删除):

class ExtraPerfilType extends AbstractType
{

    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        parent::buildForm($builder, $options);
        $builder
                ->add('estado', 'entity', array(
                    'class' => 'CommonBundle:SysEstado',
                    'property' => 'nombre',
                    'required' => true,
                    'label' => 'Estado',
                    'empty_value' => 'Seleccione un estado',
                    'attr' => array(
                        'class' => 'estados'
                    )
                ));
    }

    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(
                array(
                    'data_class' => 'Sunahip\UserBundle\Entity\SysPerfil',
                    'intention' => 'extra_user_profile'
                )
        );
    }

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

}

这是BasicDataController.php 上用于构建和显示表单的函数:

/**
 * @Route("/basicdata", name="basicdata")
 * @Template()
 */
public function basicDataAction()
{
    $em = $this->getDoctrine()->getEntityManager();
    $id = $this->getUser()->getId();
    $entity = $em->getRepository('UserBundle:SysPerfil')->findOneBy(array("user" => $id));

    $form = $this->createForm(new ExtraPerfilType(), $entity, array('action' => $this->generateUrl('basicdata-save')));
    return array('entity' => $entity, 'form' => $form->createView());
}

basicData.html.twig 我有这个HTML(无关信息已被删除):

{{ form_start(form, {'attr': {'id':'form_extra_perfil'}}) }}
    {{ form_label(form.state) }} <span class="oblig">(*)</span>
    {{ form_widget(form.state) }}
    <select class="municipalities" name="municipalities" id="municipalities" disabled="disabled">
        <option value="-1">-- Pick one --</option>
        <span class="oblig">(*)</span>
    </select>
    <select class="parishes" name="parishes" id="parishes" disabled="disabled">
        <option value="-1">-- Pick one --</option>
    </select>
    <select class="city" name="city" id="city" disabled="disabled">
    </select>
    <div><input type="submit" id="form_btttn" value="Guardar"></div>
    {{ form_widget(form._token) }}
    {{ form_errors(form) }}
{{ form_end(form) }}

最后我在处理数据和更新数据库记录的函数中有这个:

/**
 * @Route("/basicdata/save", name="basicdata-save")
 * @Method("POST")
 */
public function guardarAction(Request $request)
{
    $em = $this->getDoctrine()->getManager();
    $id = $this->getUser()->getId();

    var_dump($request->get("extra_user_profile"));
    die();

    ...
}

这是我的问题所在,因为var_dump 有这个:

array (size=12)
  'estado' => string '7' (length=1)
  'calle' => string 'asdasd' (length=6)
  'apartamento' => string 'asdasdasd' (length=9)
  'apartamento_no' => string 'asdasda' (length=7)
  'referencia' => string 'sdasdas' (length=7)
  'codigo_postal' => string 'asdasdas' (length=8)
  'fax' => string 'dasdasd' (length=7)
  'telefono_local' => string 'asdasdasd' (length=9)
  'telefono_movil' => string 'asdasdasd' (length=9)
  'correo_alternativo' => string 'sdsad@asd.com' (length=13)
  'sitio_web' => string 'sadasdads' (length=9)
  '_token' => string 'Wsfi7yJCrovMct-yphPuh_XRQcO4VRqBrcK1BZ89-jE' (length=43)

由于自治市、教区和城市不在ExtraPerfilType 表单中,因为它们是依赖组合,我使用 jQuery 手动填写它们,当然还咨询 DB 上的记录,它们不在请求中,那么我如何处理它们为了更新他们在记录中的价值观?我正在使用最新的 Symfony 2.5.1,有什么帮助或建议吗?

请求未正确处理

在意识到如何使用额外字段之后,我为更新 DB 中的记录而编写的函数无法处理 $request,我不知道它在哪里失败。这是函数:

/**
 * @Route("/basic-data/update", name="basic-data-update")
 * @Method("POST")
 */
public function updateAction(Request $request)
{
    $em = $this->getDoctrine()->getManager();
    $id = $this->getUser()->getId();

    $entityProfile = $em->getRepository('UserBundle:SysPerfil')->findOneBy(array("user" => $id));
    $formProfile = $this->createForm(new PerfilType(), $entityProfile);
    $formProfile->handleRequest($request);

    if ($formProfile->isValid()) {
        $municipalities= $em->getRepository('CommonBundle:SysMunicipio')->findOneBy(array("id" => $request->get('municipios')));
        $parishes = $em->getRepository('CommonBundle:SysParroquia')->findOneBy(array("id" => $request->get('parroquias')));
        $city= $em->getRepository('CommonBundle:SysCiudad')->findOneBy(array("id" => $request->get('ciudades')));

        $entityProfile->setMunicipio($municipalities);
        $entityProfile->setParroquia($parishes );
        $entityProfile->setCiudad($city);

        $em->flush();

        return $this->redirect($this->generateUrl('datos-basicos'));
    }
    else {
        $errors = $this->getFormErrors($formProfile);
    }

    return new JsonResponse(array('status' => true, 'errors' => $errors));
}

这是结果:

{"status":true,"errors":{"persJuridica":[],"rif":[],"ci":[],"nombre":[],"apellido":[],"user":{"email":[],"password":[],"confirm":[]}}}

我如何从请求中删除这些字段,因为它们是以其他形式处理的?

PS:在某些部分,代码是西班牙语,因为这是软件要求,抱歉,我尝试将某些部分设置为英文,以便您理解

我找到了解决办法

别在意最新的编辑,我已经找到了解决方案:

$builder
        ->remove('persJuridica')
        ->remove('rif')
        ->remove('ci')
        ->remove('nombre')
        ->remove('apellido')
        ->remove('email')
        ->remove('password')
        ->remove('confirm')
....

【问题讨论】:

    标签: php symfony symfony-forms


    【解决方案1】:

    假设你想获得municipalities 值:

    在控制器中你得到它买这个:

    $municipality = $request->get('municipalities');
    

    请注意,您可以在 symfony2 表单中添加未映射到实体的字段

    像这样:

    $builder->add('extra_field_name','extra_field_type', array('mapped' => false)); // the option mapped is set to false
    

    这样您就可以按照您在问题中提到的方式获得额外的字段($request-&gt;get("extra_user_profile"))

    【讨论】:

    • 是的,我应该在类型类上添加额外的字段,但是我会得到这个stackoverflow.com/questions/22362480/…(未回答的问题)无论如何最好的选择是什么?像我说的那样使用$request 对象吗?我主要关心的是当我想编辑对象时,选择不会被数据库中的值填充
    • symfony.com/doc/current/cookbook/form/… 这可能有助于解决您未回答的问题。如果您的值与您的数据库无关,那么您可以简化并使用第一种方法(进行简单的选择而不将它们添加到您的表单中),这样您将消除表单验证的开销。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-26
    • 1970-01-01
    • 2012-09-05
    • 2014-03-27
    • 1970-01-01
    相关资源
    最近更新 更多