在n:m关系Symfony2项目中显示编辑表单的正确方法

时间:2013-11-13 21:21:24

标签: php symfony doctrine-orm

我有一个实体Centros.php定义如下:

<?php

namespace PI\CentroBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity
 * @ORM\Table(name="centros")
 */
class Centros {

    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;

    /**
     * @ORM\Column(type="text")
     */
    protected $descripcion;

    public function getId() {
        return $this->id;
    }

    public function setDescripcion($descripcion) {
        $this->descripcion = $descripcion;
    }

    public function getDescripcion() {
        return $this->descripcion;
    }

}

还有另一个UnidadesHasCentros.php这个定义:

<?php

namespace PI\UnidadBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity
 * @ORM\Table(name="unidades_has_centros")
 */
class UnidadesHasCentros {

    /**
     * @ORM\Id
     * @ORM\ManyToOne(targetEntity="PI\UnidadBundle\Entity\Unidades")
     * @ORM\JoinColumn(name="unidades_id", referencedColumnName="id")
     */
    protected $unidades_id;

    /**
     * @ORM\Id
     * @ORM\ManyToOne(targetEntity="PI\CentroBundle\Entity\Centros")
     * @ORM\JoinColumn(name="centros_id", referencedColumnName="id")
     */
    protected $centros_id;

    public function setUnidadesId(\PI\UnidadBundle\Entity\Unidades $unidad_id) {
        $this->unidades_id = $unidad_id;
    }

    public function getUnidadesId() {
        return $this->unidades_id;
    }

    public function setCentroId(\PI\CentroBundle\Entity\Centros $centros_id) {
        $this->centros_id = $centros_id;
    }

    public function getCentroId() {
        return $this->centros_id;
    }

}

这是我的CentroType.php表单,您可以看到我的实体未映射:

<?php

namespace PI\CentroBundle\Form;

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

class CentroType extends AbstractType {

    public function buildForm(FormBuilderInterface $builder, array $options) {
        $builder
                ->add('unidades', 'entity', array('class' => 'PIUnidadBundle:Unidades', 'property' => 'descripcion', 'required' => false, 'multiple' => true, 'expanded' => false, 'mapped' => false, 'attr' => array('class' => 'form-control')))
                ->add('descripcion', 'text', array('attr' => array('class' => 'form-control')));
    }

    public function setDefaultOptions(OptionsResolverInterface $resolver) {
        $resolver->setDefaults(array(
            'data_class' => 'PI\CentroBundle\Entity\Centros'
        ));
    }

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

}

当我创建一个新的Centro时,我可以毫无问题地分配Unidades,如下所示:

public function createAction(Request $request) {
    $entity = new Centros();
    $form = $this->createForm(new CentroType(), $entity);
    $form->handleRequest($request);

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

        if ($request->get('unidades')) {
            foreach ($request->get('unidades') as $key => $value) {
                $entityUnidadesHasCentros = new UnidadesHasCentros();

                $entityUnidadesHasCentros->setCentroId($entity);
                $entityUnidadesHasCentros->setUnidadesId($value);

                $em->persist($entityUnidadesHasCentros);
            }
            $em->flush();
        }
    }

    return $this->redirect($this->generateUrl('listar-centros'));
}

但是我如何处理编辑/更新动作?我的意思是我需要得到所有的关系,并在编辑表单中显示它,但不知道如何。如果您有更好的解决方案,请告诉我。

2 个答案:

答案 0 :(得分:0)

$em = $this->getDoctrine()->getManager();
$centro = $em->getRepository('PIUnidadBundle:Centros')->find($id_centro);
$form = $this->createForm(new CentroType(), $centro);

将自动填充表单。

这里给你一个想法是我的Feed类的CRUD的一部分

/**
 * Displays a form to edit an existing Feed entity.
 *
 * @Route("/{id}/edit", name="admin_feed_edit")
 * @Method("GET")
 * @Template()
 */
public function editAction($id)
{
    $em = $this->getDoctrine()->getManager();

    $entity = $em->getRepository('CitationRssBundle:Feed')->find($id);

    if (!$entity) {
        throw $this->createNotFoundException('Unable to find Feed entity.');
    }

    $editForm = $this->createEditForm($entity);
    $deleteForm = $this->createDeleteForm($id);

    return array(
        'entity'      => $entity,
        'edit_form'   => $editForm->createView(),
        'delete_form' => $deleteForm->createView(),
    );
}

/**
* Creates a form to edit a Feed entity.
*
* @param Feed $entity The entity
*
* @return \Symfony\Component\Form\Form The form
*/
private function createEditForm(Feed $entity)
{
    $form = $this->createForm(new FeedEditType(), $entity, array(
        'action' => $this->generateUrl('admin_feed_update', array('id' => $entity->getId())),
        'method' => 'PUT',
    ));

    $form->add('submit', 'submit', array('label' => 'mettre à jour', 'attr' => array('class' => 'btn-primary')));

    return $form;
}
/**
 * Edits an existing Feed entity.
 *
 * @Route("/{id}", name="admin_feed_update")
 * @Method("PUT")
 * @Template("CitationRssBundle:Feed:edit.html.twig")
 */
public function updateAction(Request $request, $id)
{
    $em = $this->getDoctrine()->getManager();

    $entity = $em->getRepository('CitationRssBundle:Feed')->find($id);

    if (!$entity) {
        throw $this->createNotFoundException('Unable to find Feed entity.');
    }

    $deleteForm = $this->createDeleteForm($id);
    $editForm = $this->createEditForm($entity);
    $editForm->handleRequest($request);

    if ($editForm->isValid()) {
        $em->persist($entity);
        $em->flush(); 

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

    return array(
        'entity'      => $entity,
        'edit_form'   => $editForm->createView(),
        'delete_form' => $deleteForm->createView(),
    );
}
/**
 * Deletes a Feed entity.
 *
 * @Route("/{id}", name="admin_feed_delete")
 * @Method("DELETE")
 */
public function deleteAction(Request $request, $id)
{
    $form = $this->createDeleteForm($id);
    $form->handleRequest($request);

    if ($form->isValid()) {
        $em = $this->getDoctrine()->getManager();
        $entity = $em->getRepository('CitationRssBundle:Feed')->find($id);

        if (!$entity) {
            throw $this->createNotFoundException('Unable to find Feed entity.');
        }
        $em->remove($entity);
        $em->flush();
        $em->clear();
    }

    return $this->redirect($this->generateUrl('admin_feed'));
}

/**
 * Creates a form to delete a Feed entity by id.
 *
 * @param mixed $id The entity id
 *
 * @return \Symfony\Component\Form\Form The form
 */
private function createDeleteForm($id)
{
    return $this->createFormBuilder()
        ->setAction($this->generateUrl('admin_feed_delete', array('id' => $id)))
        ->setMethod('DELETE')
        ->add('submit', 'submit', array('label' => 'supprimer', 'attr' => array('class' => 'btn-danger')))
        ->getForm()
    ;
}

不要忘记你也可以使用doctrine生成crud:generate:crud命令它可以节省大量时间:)

答案 1 :(得分:0)

这不是我要求汤姆汤姆斯,我需要什么,并问是创建关系的正确方法,这是解决方案:

/**
 * @ORM\ManyToMany(targetEntity="PI\UnidadBundle\Entity\Unidades", inversedBy="centros", cascade={"persist"})
 * @ORM\JoinTable(name="unidades_has_centros",
 *      joinColumns={@ORM\JoinColumn(name="centros_id", referencedColumnName="id")},
 *      inverseJoinColumns={@ORM\JoinColumn(name="unidades_id", referencedColumnName="id")}
 *      )
 */
protected $unidades;

之后,您需要创建正确的方法和构造函数,如下所示:

public function __construct() {
    $this->unidades = new \Doctrine\Common\Collections\ArrayCollection();
}

public function setUnidades(\PI\UnidadBundle\Entity\Unidades $unidades) {
    $this->unidades[] = $unidades;
}

public function getUnidades() {
    return $this->unidades;
}

希望能帮助别人

相关问题