简体   繁体   中英

Form submit error data_class formview

I have a form builded by 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");
}

It shows the form correctly but when i submit it I get this error:

"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

This is how my entity looks like:

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;
    }
}

I have tried to add the data_class but I can't find the good place to add it because the code keeps giving me te same error.

First of all, you need to make your serial_nr private otherwise no need to have getSerial_nr and setSerial_nr functions. Because you can reach to serial_nr outside of your class without having setters and getters.

Second, why you are adding serial numbers into options field?

Assuming you want to have serial numbers as a choice field. I have a solution for you.

Usually entities are related in Doctrine ORM as many-to-one one-to-many . In that case its very simple to get related fields as a choice field. For this case symfony has a built in entity field.

SerialNumberType - form type class. (You have to change this name to yours)

    <?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';
    }
}

Inside Controller Action

    <?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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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