处理具有多个实体关系的复杂Symfony2表单



我有一个表单(仍然没有完成,缺少许多字段),它是作为一个带有步骤的向导来处理的,其中处理来自多个实体的字段。这就是形式本身:

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
            ->add('tipo_tramite', 'entity', array(
                'class' => 'ComunBundle:TipoTramite',
                'property' => 'nombre',
                'required' => TRUE,
                'label' => "Tipo de Trámite",
                'query_builder' => function (EntityRepository $er) {
                    return $er->createQueryBuilder('q')
                            ->where('q.activo = :valorActivo')
                            ->setParameter('valorActivo', TRUE);
                }
            ))
            ->add('oficina_regional', 'entity', array(
                'class' => 'ComunBundle:OficinaRegional',
                'property' => 'nombre',
                'required' => TRUE,
                'label' => "Oficina Regional",
                'query_builder' => function (EntityRepository $er) {
                    return $er->createQueryBuilder('q')
                            ->where('q.activo = :valorActivo')
                            ->setParameter('valorActivo', TRUE);
                }
            ))
            ->add('procedencia_producto', 'entity', array(
                'class' => 'ComunBundle:ProcedenciaProducto',
                'property' => 'nombre',
                'required' => TRUE,
                'label' => "Procedencia del Producto"
            ))
            ->add('finalidad_producto', 'entity', array(
                'class' => 'ComunBundle:FinalidadProducto',
                'property' => 'nombre',
                'required' => TRUE,
                'label' => "Finalidad del Producto"
            ))
            ->add('condicion_producto', 'entity', array(
                'class' => 'ComunBundle:CondicionProducto',
                'property' => 'nombre',
                'required' => TRUE,
                'label' => "Condición del Producto"
            ))
            ->add('lote', 'integer', array(
                'required' => TRUE,
                'label' => "Tamaño del Lote"
            ))
            ->add('observaciones', 'text', array(
                'required' => FALSE,
                'label' => "Observaciones"
    ));
}

在这种情况下,我有一个关于如何处理参数data_class的问题,所以我不必在控制器中变魔术。当我说魔术时,我的意思是:

public function empresaAction()
{
    $entity = new Empresa();
    $form = $this->createForm(new EmpresaFormType(), $entity);
    return array( 'entity' => $entity, 'form' => $form->createView() );
}
public function guardarEmpresaAction(Request $request)
{
    $em = $this->getDoctrine()->getManager();
    /** @var $userManager FOSUserBundleModelUserManagerInterface */
    $userManager = $this->container->get('fos_user.user_manager');
    /** @var $dispatcher SymfonyComponentEventDispatcherEventDispatcherInterface */
    $dispatcher = $this->container->get('event_dispatcher');
    /** @var $mailer FOSUserBundleMailerMailerInterface */
    $mailer = $this->container->get('fos_user.mailer');
    $request_empresa = $request->get('empresa');
    $request_sucursal = $request->get('sucursal');
    $request_chkRif = $request->get('chkRif');
    $request_estado = $request_empresa[ 'estado' ];
    $request_municipio = $request->get('municipio');
    $request_ciudad = $request->get('ciudad');
    $request_parroquia = $request->get('parroquia');
    $user = $userManager->createUser();
    $event = new GetResponseUserEvent($user, $request);
    $dispatcher->dispatch(FOSUserEvents::REGISTRATION_INITIALIZE, $event);
    if (null !== $event->getResponse())
    {
        return $event->getResponse();
    }
    $entity = new Empresa();
    $form = $this->createForm(new EmpresaFormType(), $entity);
    $form->handleRequest($request);
    $success = $url = $errors = "";
    if ($form->isValid())
    {
        if ($request_sucursal != NULL || $request_sucursal != "")
        {
            $padreEntity = $em->getRepository('UsuarioBundle:Empresa')->findOneBy(array( "padre" => $request_sucursal ));
            if (!$padreEntity)
            {
                $padreEntity = $em->getRepository('UsuarioBundle:Empresa')->findOneBy(array( "id" => $request_sucursal ));
            }
            if ($request_chkRif != NULL || $request_chkRif != "")
            {
                $rifUsuario = $request_empresa[ 'tipo_identificacion' ] . $request_empresa[ 'rif' ];
            }
            else
            {
                $originalRif = $padreEntity->getRif();
                $sliceRif = substr($originalRif, 10, 1);
                $rifUsuario = $originalRif . ($sliceRif === false ? 1 : $sliceRif + 1);
            }
            $entity->setPadre($padreEntity);
        }
        else
        {
            $rifUsuario = $request_empresa[ 'tipo_identificacion' ] . $request_empresa[ 'rif' ];
        }
        $user->setUsername($rifUsuario);
        $user->setRepresentativeName($request_empresa[ 'razon_social' ]);
        $user->setEmail($request_empresa[ 'usuario' ][ 'email' ]);
        $user->setPlainPassword($request_empresa[ 'usuario' ][ 'plainPassword' ][ 'first' ]);
        $pais = $em->getRepository('ComunBundle:Pais')->findOneBy(array( "id" => 23 ));
        $user->setPais($pais);
        $estado_id = $request_estado ? $request_estado : 0;
        $estado = $em->getRepository('ComunBundle:Estado')->findOneBy(array( "id" => $estado_id ));
        $user->setEstado($estado);
        $municipio_id = $request_municipio ? $request_municipio : 0;
        $municipio = $em->getRepository('ComunBundle:Municipio')->findOneBy(array( "id" => $municipio_id ));
        $user->setMunicipio($municipio);
        $ciudad_id = $request_ciudad ? $request_ciudad : 0;
        $ciudad = $em->getRepository('ComunBundle:Ciudad')->findOneBy(array( "id" => $ciudad_id ));
        $user->setCiudad($ciudad);
        $parroquia_id = $request_parroquia ? $request_parroquia : 0;
        $parroquia = $em->getRepository('ComunBundle:Parroquia')->findOneBy(array( "id" => $parroquia_id ));
        $user->setParroquia($parroquia);
        ...
    }
    else
    {
        $errors = $this->getFormErrors($form);
        $success = FALSE;
    }
    return new JsonResponse(array( 'success' => $success, 'errors' => $errors, 'redirect_to' => $url ));
}

由于"data_class on EmpresaFormType is set to UsuarioBundle\Entity\Empresa",因此我需要使用getter/setter处理任何额外的参数,这对于复杂/大型表单来说是一项艰巨的工作。

在示例表单中,字段tipo_tramite将保留在类ComunBundleEntityProducto中,但字段oficina_regional将保留在类别ComunBundleEntitySolicitudUsuario中,因此对于其他未放置在此处但在表单中的实体,总共应保留为3或4个实体,在许多情况下包括关系,您如何处理此问题?

我知道CraueFormFlowBundle可能涵盖了这个过程/流程,但不确定它是否是解决方案。

有什么建议吗?

几天前刚刚使用了多步骤表单。我想你需要在这里嵌入表格。无论如何,可以向您推荐另一个创建向导的好捆绑包:SyliusFlowBundle。IMO它比CraueFormFlowBundle更灵活、更容易理解。

顺便问一句,你为什么要把所有东西都存储在一个表单中?我们每走一步都使用一种形式,我喜欢这种方法。

相关内容

  • 没有找到相关文章

最新更新