我正在尝试将我的平面php项目迁移到Symfony2,但它变得非常困难。 例如,我有一个产品规格表,它有多个规格,并且可以通过Extraspecs DB表中的“cat”属性进行区分。 因此,我为该表创建了一个实体,并希望使用“cat”= 0 ...
创建一个只有规范的数组。我认为代码就是这个......对吧?
$typeavailable = $this->getDoctrine()
->getRepository('LabsCatalogBundle:ProductExtraspecsSpecs')
->findBy(array('cat' => '0'));
现在我怎么能把它放在一个数组中来处理这样的表格?:
form = $this ->createFormBuilder($product)
->add('specs', 'choice', array('choices' => $typeavailableArray), 'multiple' => true)
提前谢谢你:)
#谢谢大家..
但现在我遇到了另一个问题.. 实际上我正在从现有对象构建表单:
$form = $this ->createFormBuilder($product)
->add('name', 'text')
->add('genspec', 'choice', array('choices' => array('0' => 'None', '1' => 'General', '2' => 'Specific')))
->add('isReg', 'choice', array('choices' => array('0' => 'Material', '1' => 'Reagent', '2' => 'Antibody', '3' => 'Growth Factors', '4' => 'Rodents', '5' => 'Lagomorphs')))
所以..在那种情况下,我的当前值被命名为“extraspecs”,所以我添加了这个:
->add('extraspecs', 'entity', array(
'label' => 'desc',
'empty_value' => ' --- ',
'class' => 'LabsCatalogBundle:ProductExtraspecsSpecs',
'property' => 'specsid',
'query_builder' => function(EntityRepository $er) {
return $er ->createQueryBuilder('e');
但是“extraspecs”来自oneToMany的关系,其中每个产品都有几个额外规格...
这是ORM:
Labs\CatalogBundle\Entity\Product:
type: entity
table: orders__regmat
id:
id:
type: integer
generator: { strategy: AUTO }
fields:
name:
type: string
length: 100
catnumber:
type: string
scale: 100
brand:
type: integer
scale: 10
company:
type: integer
scale: 10
size:
type: decimal
scale: 10
units:
type: integer
scale: 10
price:
type: decimal
scale: 10
reqcert:
type: integer
scale: 1
isReg:
type: integer
scale: 1
genspec:
type: integer
scale: 1
oneToMany:
extraspecs:
targetEntity: ProductExtraspecs
mappedBy: product
Labs\CatalogBundle\Entity\ProductExtraspecs:
type: entity
table: orders__regmat__extraspecs
fields:
extraspecid:
id: true
type: integer
unsigned: false
nullable: false
generator:
strategy: IDENTITY
regmatid:
type: integer
scale: 11
spec:
type: integer
scale: 11
attrib:
type: string
length: 20
value:
type: string
length: 200
lifecycleCallbacks: { }
manyToOne:
product:
targetEntity: Product
inversedBy: extraspecs
joinColumn:
name: regmatid
referencedColumnName: id
我应该这样做吗?
谢谢!!!
答案 0 :(得分:4)
从数据库返回的值已经在数组中。
您可以使用entity field type创建所需的表单 这是它的工作原理:
$form = $this->createFormBuilder($product)
->add('specs', 'entity', array(
'class' => 'LabsCatalogBundle:ProductExtraspecsSpecs',
'choices' => $typeavailable,
'property' => 'specsid',
'multiple' => true,
))->getForm();
替换目标实体(ProductExtraspecsSpecs)中要在表单中显示的字段的property
属性。
如果您仍然不清楚某些事情,请询问,我会尝试提供更多信息。
要选择当前对象,请执行以下操作:
在控制器中:$selected = $product->getExtraspecs();
在表单构建器中:
$form = $this->createFormBuilder($product)
...
->add('specs', 'entity', array(
'data' => $selected,
...
))->getForm();
答案 1 :(得分:1)
您可以使用小部件formBuilder
直接在entity
中请求对象。以下示例显示了一些基本属性,其中:
label
很明显empty_value
也很明显class
是您要从中选择的完全限定的实体property
是列表中显示的类成员(用户看到的内容)data
是当前选择的,如果您有学说关系(例如 OneToMany )query_builder
最后允许您指定选择应在列表中显示哪些元素(在您的示例中“cat为0”)总之,你得到这个:
$builder ->add('entity', 'entity', array(
'label' => 'Choose from this list',
'empty_value' => 'This is a blank value on top of the list',
'class' => 'VendorNameBundle:Entity',
'property' => 'name',
'data' => $currentObject->getEntity(),
'query_builder' => function(EntityRepository $er) {
return $er ->createQueryBuilder('e')
->groupBy('e.id')
->orderBy('e.name', 'ASC');
}
));
您可以在此处详细了解:
答案 2 :(得分:0)
您可以使用Serializer Component将您的Doctrine实体转换为数组。