带有SonataAdminBundle的OhGoogleMapFormTypeBundle

时间:2013-06-27 10:06:54

标签: php google-maps symfony sonata-admin

如何使此捆绑包与SonataAdminBundle一起使用?我根据README配置了OhGoogleMapFormTypeBundle。 这是我的configureFormFields方法:

protected function configureFormFields(FormMapper $formMapper)
{
    $formMapper
        ->with("Map")
            ->add('latlng', new GoogleMapType())
        ->end()
    ;
}

我收到错误:

Please define a type for field `latlng` in `GM\AppBundle\Admin\PlaceAdmin`

2 个答案:

答案 0 :(得分:8)

所以FormMapper确实存在问题。 解决方案非常简单,但要发现它花了很多时间。 有两种方法:

第一个方法(我不喜欢):

$form = new YourType();
$form->buildForm($formMapper->getFormBuilder(),array());

第二方法:

->add('latlng', 'sonata_type_immutable_array',array('label' => 'Карта',
      'keys' => array(
                    array('latlng', new GoogleMapType(), array())
                )))

实体:

public function setLatLng($latlng)
{
   $this
      ->setLatitude($latlng['latlng']['lat'])
      ->setLongitude($latlng['latlng']['lng']);
   return $this;
}

/**
* @Assert\NotBlank()
* @OhAssert\LatLng()
*/
public function getLatLng()
{
   return array('latlng' => array('lat' => $this->latitude,'lng' => $this->longitude));
}

答案 1 :(得分:1)

我首先在GoogleMapType文件中将app/config.yml定义为服务:

services:
    # ...
    oh.GoogleMapFormType.form.type.googlemapformtype:
        class: Oh\GoogleMapFormTypeBundle\Form\Type\GoogleMapType
        tags:
            - { name: form.type, alias: oh_google_maps }

我和Symfony2很相似,所以我不知道为什么别名必须是oh_google_maps

然后,我设置了用于在我的Entity类中存储纬度和经度的字段和函数:

private $latlng;

private $latitude;

private $longitude;

public function setLatlng($latlng)
{
    $this->latlng = $latlng;
    $this->latitude = $latlng['lat'];
    $this->longitude = $latlng['lng'];
    return $this;
}

/**
* @Assert\NotBlank()
* @OhAssert\LatLng()
*/
public function getLatLng()
{
    return array('lat' => $this->latitude,'lng' => $this->longitude);
}

最后,在我的自定义Sonata Admin类中,configureFormFields函数:

protected function configureFormFields(FormMapper $formMapper)
{
    $formMapper
        //...
        ->add('latlng', 'oh_google_maps', array());
}