2015-11-27 36 views
0

我有一个表格由formbuilder表单提交错误data_class FormView控件

public function buildForm(FormBuilderInterface $builder, array $options){ 
    $query = $this->em->createQueryBuilder(); 
    $query->select('sn.serial_nr') 
      ->from('KopictAdminBundle:SerialNumber', 'sn'); 

    $serialnumbers = $query->getQuery()->getResult(); 

    $options = array(); 
    foreach($serialnumbers as $serialnumber){ 
     $options[$serialnumber['serial_nr']] = $serialnumber['serial_nr']; 
    } 

    $builder->add("serial_nr","text"); 
} 

它正确地显示了形式建造,但是当我提交我得到这个错误:

"The form's view data is expected to be an instance of class Kopict\AdminBundle\Entity\SerialNumber, but is a(n) string. You can avoid this error by setting the "data_class" option to null or by adding a view transformer that transforms a(n) string to an instance of Kopict\AdminBundle\Entity\SerialNumber." at /var/www/kopadmin/vendor/symfony/symfony/src/Symfony/Component/Form/Form.php line 373 

这是怎么了我的实体外观像:

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

    /** 
    * @var interger $product_revision_id 
    */ 
    private $product_revision_id; 

    /** 
    * @var interger $booking_id 
    */ 
    private $booking_id; 

    /** 
    * @var string $serial_nr 
    */ 
    public $serial_nr; 


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

    /** 
    * Set product_revision_id 
    * 
    * @param integer $product_revision_id 
    * @return SerialNumber 
    */ 
    public function setProduct_revision_id($product_revision_id) 
    { 
     $this->product_revision_id = $product_revision_id; 

     return $this; 
    } 

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

    /** 
    * Set booking_id 
    * 
    * @param integer $booking_id 
    * @return SerialNumber 
    */ 
    public function setBooking_id($booking_id) 
    { 
     $this->booking_id = $booking_id; 

     return $this; 
    } 

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

    /** 
    * Set serial_nr 
    * 
    * @param string $serial_nr 
    * @return SerialNumber 
    */ 
    public function setSerial_nr($serial_nr) 
    { 
     $this->serial_nr = $serial_nr; 

     return $this; 
    } 

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

我试图添加data_class,但我找不到添加它的好地方,因为c颂歌不断给我同样的错误。

回答

0

首先,你需要让你的serial_nrprivate否则不需要有getSerial_nrsetSerial_nr的功能。因为你可以在你的班级以外达到serial_nr而不需要安装者和获得者。

二,您为什么要将serial numbers添加到选项字段中?

假设您想将serial numbers作为选择字段。我有你的解决方案。

通常在Doctrine ORM有关联的实际物业为many-to-oneone-to-many。在这种情况下,将相关领域作为选择领域非常简单。对于这种情况,symfony有一个内置的entity字段。

SerialNumberType - 表单类的类。 (您必须将此名称更改为你的)

<?php 

namespace Kopict\AdminBundle\Form; 

use Doctrine\ORM\em; 
use Doctrine\ORM\EntityManager; 
use Symfony\Component\Form\AbstractType; 
use Symfony\Component\Form\FormBuilderInterface; 

class SerialNumberType extends AbstractType 
{ 

    private $em; 

    public function __construct(EntityManager $em) 
    { 
     $this->em = $em; 
    } 


    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $query = $this->em->createQueryBuilder(); 
     $query->select('sn.serial_nr')->from('KopictAdminBundle:SerialNumber', 'sn'); 

     $serialNumbers = $query->getQuery()->getResult(); 
     $choices  = array(); 
     foreach ($serialNumbers as $serialNumber) { 
      $choices[$serialNumber['serial_nr']] = $serialNumber['serial_nr']; 
     } 
     $builder->add("serial_nr", "choice", array(
      'choices' => $choices, 
     )); 
    } 

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

内部控制器动作

<?php 

namespace Kopict\AdminBundle\Controller; 

use Kopict\AdminBundle\Entity\SerialNumber; 
use Symfony\Bundle\FrameworkBundle\Controller\Controller; 

class DefaultController extends Controller 
{ 
    public function indexAction() 
    { 
     $serialNumber = new SerialNumber(); 
     $form = $this->createForm($this->get('kopict_admin.form.serialnumber'), $serialNumber); 

     return $this->render('KopictAdminBundle:Default:index.html.twig', array('form' => $form->createView())); 
    } 
} 

services.yml

services: 
    kopict_admin.form.serialnumber: 
     class: Kopict\AdminBundle\Form\SerialNumberType 
     arguments: [ @doctrine.orm.entity_manager ] 
     scope: request