我有以下情况:
在数据库中有一个表格,其中包含一个国家/地区的所有县,另一个表格包含同一个国家/地区的所有城市。城市表格包含以下列:
- id
- name
- longitude
- latitude
- county - county id
页面上的我有一个表格:
- county select field - symfony entity field type
- city select field - symfony entity field type
- longitude input (text) field
- latitude input (text) field - let's ignore this field for the moment
因此,当用户选择一个县时,城市字段将填满与所选县相对应的所有城市;然后,当用户选择一个城市时,经度字段将填充城市逻辑数据库值。
按照本教程(http://aulatic.16mb.com/wordpress/2011/08/symfony2-dynamic-forms-an-event-driven-approach/),我设法处理县选择和城市归档动态替换。但我似乎无法找到如何填充一个简单的文本值(在这种情况下经度)“symfony方式”。
我试过这样做
$refreshLongitude = function( $form, $city, $translator ){
$form->add(
'longitude',
'text',
array(
'label' => $translator->trans( 'project.longitude' ),
'required' => true,
'attr' => array(
'class'=> 'form-control',
'value' => function( \Doctrine\ORM\EntityRepository $repository ) use ( $city ){
if( $city instanceof City ){
return $city->getLongitude();
}
$query = $repository->createQueryBuilder( 'city' );
if( is_numeric( $city ) ){
$query->where( 'city.id = :city' )
->setParameter( 'city', $city );
}
else{
$query->where( 'city.id = 2715' );
}
$city = $query->getSingleResult();
return $city->getLongitude();
}
)
)
);
};
但我得到了: ContextErrorException:Catchable Fatal Error:类Closure的对象无法转换为字符串
任何想法?
答案 0 :(得分:0)
所以,从phpisuber01评论开始(非常感谢),我已经设法概述了以下代码,以便在symfony2中以一定的数据库值填充一个简单的文本字段。我不确定这是正确的方法,但它确实有效。欢迎任何更优雅的方式。
$refreshLongitude = function( $form, $city, $translator, $em ){
$form->add(
'longitude',
'text',
array(
'label' => $translator->trans( 'project.longitude' ),
'required' => true,
'attr' => array(
'class'=> 'form-control',
'value' => call_user_func( function() use ( $city, $em ){
if( $city instanceof City ){
return $city->getLongitude();
}
else{
$repository = $em->getRepository( 'AppBundle:City' );
$query = $repository->createQueryBuilder( 'city' );
if( is_numeric( $city ) ){
$query->where( 'city.id = :city' )
->setParameter( 'city', $city );
}
else{
$query->where( 'city.id = 2715' );
}
$city = $query->getQuery()->getSingleResult();
return $city->getLongitude();
}
})
)
)
);
};
$ translator和$ em vars从控制器传递到表单构建器,然后传递给事件监听器,然后传递到$ refreshLongitude函数