0

動作している次のコードがあります。私が見つけた唯一の問題は、既存の ID をリンクして別のコードを作成する代わりに、a を作成/編集し、そこからaclienteを追加/削除する場合です。ここで説明します。servicioservicio

cliente: foo. id: 1

service: bar. id: 1

フォームに移動して選択fooし 、送信するときに、このデータの関係を処理するbarテーブルに置きたい:clientes_servicios

cliente_id      servicio_id
    1               1

代わりに、私が得ているのはこれです:

cliente_id      servicio_id
    1               2

テーブルに移動するとservicios、Symfony2 が ID を持つ既存のサービスを使用する代わりに、名前と ID を持つ別のサービスを作成したことがわかりbarます2bar1

したがって、私が望むのは、既存のフォームを使用し、フォームから新しいフォームを作成しservicioないことです (Servicio 用に別のフォームがあるため)。serviciocliente

顧客フォーム

<?php
namespace Pge\IncidenciasBundle\Form;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;

class ClientesType extends AbstractType
{
    /**
     * @param FormBuilderInterface $builder
     * @param array $options
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('nombre')
            ->add('servicio', 'collection', array(
                    'type' => new ServiciosType(),
                    'allow_add' => true,
                    'allow_delete' => true,
                    'prototype' => true,
                    // Post Update
                    'by_reference' => false
        ))
        ;
    }

    /**
     * @param OptionsResolverInterface $resolver
     */
    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'Pge\IncidenciasBundle\Entity\Clientes',
            'csrf_protection' => false,
        ));
    }

    /**
     * @return string
     */
    public function getName()
    {
        return 'pge_incidenciasbundle_clientestype';
    }
}

サービスフォーム

<?php

namespace Pge\IncidenciasBundle\Form;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;

use Doctrine\ORM\EntityRepository;
class ServiciosType extends AbstractType
{
    /**
     * @param FormBuilderInterface $builder
     * @param array $options
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('nombre', 'entity', array(
                    'class' => 'PgeIncidenciasBundle:Servicios'
        ));
    }

    /**
     * @param OptionsResolverInterface $resolver
     */
    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'Pge\IncidenciasBundle\Entity\Servicios'
        ));
    }

    /**
     * @return string
     */
    public function getName()
    {
        return 'pge_incidenciasbundle_serviciostype';
    }
}

クライアントコントローラー

public function createAction(Request $request)
    {
        $entity  = new Clientes();
        $form = $this->createForm(new ClientesType(), $entity);
        $form->submit($request);

        if ($form->isValid()) {
            $em = $this->getDoctrine()->getManager();
            $em->persist($entity);
            $em->flush();

            return $this->redirect($this->generateUrl('clientes_show', array('id' => $entity->getId())));
        }

        return $this->render('PgeIncidenciasBundle:Clientes:new.html.twig', array(
            'entity' => $entity,
            'form'   => $form->createView(),
        ));
    }

    /**
     * Displays a form to create a new Clientes entity.
     *
     */
    public function newAction()
    {
        $entity = new Clientes();

        $form   = $this->createForm(new ClientesType(), $entity);

        return $this->render('PgeIncidenciasBundle:Clientes:new.html.twig', array(
            'entity' => $entity,
            'form'   => $form->createView(),
        ));
    }

クライアントyml

Pge\IncidenciasBundle\Entity\Clientes:
    type: entity
    table: clientes
    id:
      id:
        type: integer
        generator:
          strategy: IDENTITY
    fields:
        nombre:
            type: string
            length: 250
            fixed: false
            nullable: true   
    manyToMany:
        servicio:
            targetEntity: Servicios
            cascade: [persist]
    lifecycleCallbacks: {  }

サービスYML

Pge\IncidenciasBundle\Entity\Servicios:
    type: entity
    table: servicios
    id:
      id:
        type: integer
        generator:
          strategy: IDENTITY
    fields:
        nombre:
            type: string
            length: 250
            fixed: false
            nullable: true
    lifecycleCallbacks: {  }

クライアントエンティティ

<?php

namespace Pge\IncidenciasBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * Clientes
 */
class Clientes
{
    /**
     * @var integer
     */
    private $id;

    /**
     * @var string
     */
    private $nombre;

    /**
     * @var \Doctrine\Common\Collections\Collection
     */
    private $servicio;

    /**
     * Constructor
     */
    public function __construct()
    {
        $this->servicio = new \Doctrine\Common\Collections\ArrayCollection();
    }

    /**
     * Get id
     *
     * @return integer 
     */
    public function getId()
    {
        return $this->id;
    }

    /**
     * Set nombre
     *
     * @param string $nombre
     * @return Clientes
     */
    public function setNombre($nombre)
    {
        $this->nombre = $nombre;

        return $this;
    }

    /**
     * Get nombre
     *
     * @return string 
     */
    public function getNombre()
    {
        return $this->nombre;
    }

    /**
     * Add servicio
     *
     * @param \Pge\IncidenciasBundle\Entity\Servicios $servicio
     * @return Clientes
     */
    public function addServicio(\Pge\IncidenciasBundle\Entity\Servicios $servicio)
    {
        $this->servicio[] = $servicio;

        return $this;
    }

    /**
     * Remove servicio
     *
     * @param \Pge\IncidenciasBundle\Entity\Servicios $servicio
     */
    public function removeServicio(\Pge\IncidenciasBundle\Entity\Servicios $servicio)
    {
        $this->servicio->removeElement($servicio);
    }

    /**
     * Get servicio
     *
     * @return \Doctrine\Common\Collections\Collection 
     */
    public function getServicio()
    {
        return $this->servicio;
    }

    public function __toString()
    {
        return $this->nombre;
    }
}

サービス事業体

<?php

namespace Pge\IncidenciasBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * Servicios
 */
class Servicios
{
    /**
     * @var integer
     */
    private $id;

    /**
     * @var string
     */
    private $nombre;


    /**
     * Get id
     *
     * @return integer 
     */
    public function getId()
    {
        return $this->id;
    }

    /**
     * Set nombre
     *
     * @param string $nombre
     * @return Servicios
     */
    public function setNombre($nombre)
    {
        $this->nombre = $nombre;

        return $this;
    }

    /**
     * Get nombre
     *
     * @return string 
     */
    public function getNombre()
    {
        return $this->nombre;
    }

    public function __toString()
    {
        return (string) $this->nombre;
    }
}
4

1 に答える 1

2

ポイントは、フォームを悪い方法で構築しているということです。クライアントのタイプは次のとおりです。

$builder
    ->add('nombre')
    ->add('servicio', 'entity', array(
        'class' => '/service/entity/namespace',
        'multiple' => true,
    ));

既存の Cliente または新しい Cliente を指定すると、サービスの複数選択が取得されます。

いくつかのヒント

  • Symfony2 エンティティは常に単数 ( Cliente, Servicio )
  • *ToMany リレーション変数は複数形にする必要があります ( $servicios, $clientes )
于 2013-08-19T11:04:43.473 に答える