出于某种原因,我无法管理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
}
}
我得到的结果是下拉列表,其中包含数据库中的值但没有选中的值。我做错了什么以及如何解决这个问题?
答案 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);
},