从数据库填充表单

时间:2015-11-24 07:51:25

标签: php forms symfony doctrine-orm

出于某种原因,我无法管理symfony以使用数据库中的选定值填充两个下拉列表。我有两个实体类别和产品

CategoryType.php     

namespace AppBundle\Form;

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

class CategoryType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('name', 'entity', array(
            'class' => 'AppBundle\Entity\Category',
            'property' => 'name',
            'expanded' => false,
            'multiple' => false
        ));
    }


    public function configureOptions(OptionsResolver $options)
    {
        $options->setDefaults([
            'data_class' => 'AppBundle\Entity\Category',
        ]);
    }

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

ProductType.php

<?php

namespace AppBundle\Form;

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

class ProductType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('name', 'entity', array(
            'class' => 'AppBundle\Entity\Product',
            'property' => 'name',
            'label' => 'hohoohoh',
            'data' => '',
            'expanded' => false,
            'multiple' => false
        ));
    }

    public function configureOptions(OptionsResolver $options)
    {
        $options->setDefaults([
            'data_class' => 'AppBundle\Entity\Product',
        ]);
    }

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

CommonType.php

<?php

namespace AppBundle\Form;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use AppBundle\Form\CategoryType;
use AppBundle\Form\ProductType;


class CommonType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $data = $builder->getData();

        $builder->add('category', new CategoryType());
        $builder->add('product', new ProductType());
    }



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

DefaultController.php

<?php

namespace AppBundle\Controller;

use AppBundle\Form\CommonType;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Request;

class DefaultController extends Controller
{
    /**
     * @Route("/", name="homepage")
     */
    public function indexAction(Request $request)
    {

        $product = $this->getDoctrine()->getRepository('AppBundle:Product')->findOneBy(['id' => 2]);


        $form = $this->createForm(new CommonType(), ['product' => $product]);

        return $this->render('AppBundle:Default:index.html.twig', ['form' => $form->createView()]);

    }
}

转储$ product变量

DefaultController.php on line 20:
Product {#555 ▼
  #id: 2
  #name: "second"
  #price: "12.00"
  #description: "testing"
  #category: Category {#572 ▼
    +__isInitialized__: false
    -id: 2
    -name: null
    #products: null
     …2
  }
}

我得到的结果是下拉列表,其中包含数据库中的值但没有选中的值。我做错了什么以及如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

我认为您的productType和categoryType都存在问题。

您无需创建实体字段。

你应该做(CommonType.php):

<?php

namespace AppBundle\Form;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use AppBundle\Form\CategoryType;
use AppBundle\Form\ProductType;


class CommonType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $data = $builder->getData();

        $builder->add('category', 'entity', array(
            'class' => 'AppBundle:Category',
            'property' => 'name',
            'label' => 'Category Name',
            'expanded' => false,
            'multiple' => false
            'placeholder' => 'Select',
            'required' => true
        ))
        ->add('product', 'entity', array(
            'class' => 'AppBundle:Product',
            'property' => 'name',
            'label' => 'ProductName',
            'expanded' => false,
            'multiple' => false
            'placeholder' => 'Select',
            'required' => true
        ));
    }



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

您还应该删除数据属性('data' => '',)。正是这一个使您的选择框为空而不是匹配类别/产品元素。

更新:

如果要在实体字段中过滤值,则应使用queryBuilder。

'query_builder' => function(EntityRepository $er) use ($idValue) {
                    return $er->createQueryBuilder('p')
                              ->where('p.id = :idValue')
                              ->setParameter('idValue', $idValue);
                   },