从Symfony2中的集合表单更新数据

时间:2014-05-31 12:48:57

标签: symfony

我找不到如何将表单集合中的数据更新到数据库,就像在正常的Edit操作中一样,EditForm生成并传递给UpdateAction。我可以为EditForm创建表单,但无法找到如何将数据更新到数据库。

How to Embed a Collection of Forms正在展示如何使用persist和remove添加和删除它,但如何将其与post数据绑定并将其更新到数据库中?我的集合实际上只是没有数据库表的实体。它仅用于将我的主要实体DftAbsensi中的许多字段用于单个形式。

这是我的主要实体DftAbsensi(没有getter和setter):

<?php

namespace Sifo\AdminBundle\Entity;
use Doctrine\ORM\Mapping as ORM;

    class DftAbsensi
    {
    private $id;

    private $tanggal;

    private $status;

这是Absensi的收集实体:

<?php    
namespace Sifo\AdminBundle\Entity;    
use Doctrine\Common\Collections\ArrayCollection;

class CollectionAbsensi
{
    private $statusS;

    private $tanggal;

    public function __construct()
    {
        $this->tanggalS = new ArrayCollection();
        $this->statusS = new ArrayCollection();
    }

    public function setTanggal($tanggal)
    {
        $this->tanggal = $tanggal;    
        return $this;
    }

    public function getTanggal()
    {
        return $this->tanggal;
    }

    public function setStatusS(ArrayCollection $statusS)
    {
        $this->statusS = $statusS;    
        return $this;
    }

    public function getStatusS()
    {
        return $this->statusS;
    }   
}

这是DftAbsensiType:

<?php

namespace Sifo\AdminBundle\Form;

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

class DftAbsensiType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('id', 'text', array('required'  => false))
            ->add('status', 'choice', array(
                'choices'   => array('H' => 'Hadir', 'A' => 'Tanpa Keterangan', 'S' => 'Sakit', 'I' => 'Izin', 'L' => 'Libur'),
                'required'  => false, 
                'empty_value' => '- Pilih -'))
        ;
    }

    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'Sifo\AdminBundle\Entity\DftAbsensi'
        ));
    }

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

实际上我正在使用集合来填充数据库中的许多字段。在我的主要实体DftAbsensi上面保留数据库。这是Absensi类型的收藏:

<?php

namespace Sifo\AdminBundle\Form;

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

class CollectionAbsensiType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('tanggal', 'date', array('label' => false, 'required'  => false, 'attr'=>array('style'=>'display:none;'), 'widget' => 'single_text', 'format' => 'yyyy-MM-dd'))
            ->add('statusS', 'collection', array(
                'label' => false, 
                'options'  => array('label' => false, 'required'  => false),
                'type' => new DftAbsensiType())
        );
    }

    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'Sifo\AdminBundle\Entity\CollectionAbsensi'
        ));
    }

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

这是如何在我的控制器中填充数据。此表单用于EditForm:

<?php

namespace Sifo\AdminBundle\Controller;

use Symfony\Component\HttpFoundation\Request;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;

use Sifo\AdminBundle\Entity\DftAbsensi;
use Sifo\AdminBundle\Entity\CollectionAbsensi;
use Sifo\AdminBundle\Form\CollectionAbsensiType;
use Sifo\AdminBundle\Form\DftAbsensiType;

/**
 * DftAbsensi controller.
 *
 */
class DftAbsensiController extends Controller
{
public function manageAction(Request $request, $id)
{
    $user = $this->getUser();
    $emGrupPelajar = $this->getDoctrine()->getManager();
    $entityGrupPelajar = $emGrupPelajar->getRepository('SifoAdminBundle:DftGrupPelajar')->findByIdGrup($id);

    /* check tanggal and set if exist */
    $tanggal = $request->request->get('sifo_adminbundle_collectionabsensi')['tanggal'];
    if($tanggal == NULL) 
        $tanggal = $request->request->get('form')['tanggal'];
    $tanggal = new \DateTime($tanggal);

    /* Show data */
    $emShow = $this->getDoctrine()->getManager();
    $collectionAbsensi = new CollectionAbsensi();
    foreach ($entityGrupPelajar as $temp) {
        $entity = new DftAbsensi();
        $entity = $emShow->getRepository('SifoAdminBundle:DftAbsensi')->findOneBy(array('idGrupPelajar' => $temp, 'tanggal' => $tanggal));
        if ($entity)
        {
            $entityPelajar = $emShow->getRepository('SifoAdminBundle:MstPelajar')->find($temp->getIdPelajar());
            $dftAbsensi = new DftAbsensi();
            $dftAbsensi->setId($entity->getId())
                ->setIdGrupPelajar($entity->getIdGrupPelajar())
                ->setStatus($entity->getStatus())
            ;
            $collectionAbsensi->getStatusS()->add($dftAbsensi);
            $collectionAbsensi->setTanggal($tanggal); 
        }
    }
    $emShow->flush();

    $formEdit = $this->createForm(new CollectionAbsensiType(), $collectionAbsensi, array(
        'action' => $this->generateUrl('admin_absensi_update', array('id' => $id)),
        'method' => 'PUT',
    ));                   
    $formEdit->add('save', 'submit', array('attr' => array('class' => 'btn btn-info')));

    return $this->render('SifoAdminBundle:DftAbsensi:manage.html.twig', array(
        'form_refresh'   => $formRefresh->createView(),
        'form_edit'      => $formEdit->createView(),
        'user'           => $user,
    ));
}

如前所述,我的CollectionAbsensi实际上只用于数据库中的人口字段。但是为了更新我正在使用DftAbsensi实体。我的数据库中没有CollectionAbsensi的表。这是我更新数据的方式:

public function updateAction(Request $request, $id)
{
    $user = $this->getUser();
    $emGrupPelajar = $this->getDoctrine()->getManager();
    $entityGrupPelajar = $emGrupPelajar->getRepository('SifoAdminBundle:DftGrupPelajar')->findByIdGrup($id);

    /* set tanggal */
    $tanggal = new \DateTime($request->request->get('sifo_adminbundle_collectionabsensi')['tanggal']);

    /* populate data */
    $emShow = $this->getDoctrine()->getManager();
    $collectionAbsensi = new CollectionAbsensi();
    foreach ($entityGrupPelajar as $temp) {
        $entity = new DftAbsensi();
        $entity = $emShow->getRepository('SifoAdminBundle:DftAbsensi')->findOneBy(array('idGrupPelajar' => $temp, 'tanggal' => $tanggal));
        if ($entity)
        {
            $entityPelajar = $emShow->getRepository('SifoAdminBundle:MstPelajar')->find($temp->getIdPelajar());
            $dftAbsensi = new DftAbsensi();
            $dftAbsensi->setId($entity->getId())
                ->setIdGrupPelajar($entity->getIdGrupPelajar())
                ->setStatus($entity->getStatus())
            ;
            $collectionAbsensi->getStatusS()->add($dftAbsensi);
            $collectionAbsensi->setTanggal($tanggal);
        }
    }

    $formEdit = $this->createForm(new CollectionAbsensiType(), $collectionAbsensi);                  
    $formEdit->handleRequest($request);
    $emShow->flush();

    $response = $this->forward('SifoAdminBundle:DftAbsensi:manage', array(
        'id' => $id,
        'request' => $request,
    ));
    return $response;
}

此代码没有错误。问题是按下“保存”按钮时数据库未更新。我混淆了绑定数据以及如何在上面的updateAction中将它们更新到数据库中。收集表格不能用于更新数据吗?

我的表格是出勤系统,如下所示:

enter image description here

1 个答案:

答案 0 :(得分:0)

实际上这仍然没有真正回答我关于“如何更新表单集合中的数据?”的问题。我用旧方法更新我的数据:手动获取请求中的所有数据并将其绑定到实体,然后将其更新到数据库中。

这是我的代码:

public function updateAction(Request $request, $id)
{
    $user = $this->getUser();

    /* get request */
    $data = $request->request->get('sifo_adminbundle_collectionabsensi')['statusS'];

    /* update data */
    $total = count($data);
    for ($i = 0; $i < ($total / 2); $i++) {
        $em = $this->getDoctrine()->getManager();
        $entity = $em->getRepository('SifoAdminBundle:DftAbsensi')->find($data[$i]['id']);
        if ($entity){
            $entity->setStatus($data[$i]['status'])
                   ->setOperator($user->getNama());
            $em->flush();
        }
    }

    $response = $this->forward('SifoAdminBundle:DftAbsensi:manage', array(
        'id' => $id,
        'request' => $request,
    ));
    return $response;
}

如果有人有更好的主意,请在此处发布您的答案。