繁体   English   中英

表单提交错误data_class formview

[英]Form submit error data_class formview

我有一个由formbuilder构建的表单

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,但是找不到合适的位置,因为代码不断给我同样的错误。

首先,您需要将serial_nr设为private否则不需要getSerial_nrsetSerial_nr函数。 因为您可以在不使用设置器和获取器的情况下,在课堂外访问serial_nr

其次,为什么要在选项字段中添加serial numbers

假设您要使用serial numbers作为选择字段。 我为您提供解决方案。

通常实体在相关Doctrine ORMmany-to-one one-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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM