2012-03-06 6 views
13

próbuję osadzić rodzaju formy na innego rodzaju forma:Symfony2 Wbudowany Forma i MongoDB problem

$builder->add('geolocation', new GeolocationType()); 

Jednak gdy próbuję i wiążą się z wnioskiem do formularza

if($request->getMethod() == 'POST') { 
    $form->bindRequest($request); 
} 

pojawia się błąd

Catchable Fatal Error: Argument 1 passed to Company\StoreBundle\Document\Place::setGeolocation() must be an instance of Company\StoreBundle\Document\Geolocation, array given, called in
/var/www/Company/vendor/symfony/src/Symfony/Component/Form/Util/PropertyPath.php on line 392 and defined in /var/www/Company/src/Company/StoreBundle/Document/Place.php line 43

data_class jest ustawiony albo na PlaceType i GEOL ocationType

Oto mój kod:

Place.php

namespace Company\StoreBundle\Document; 

use Doctrine\ODM\MongoDB\Mapping\Annotations as MongoDB; 

/** 
* @MongoDB\Document(collection="places") 
*/ 
class Place 
{ 
    /** 
    * @MongoDB\Id 
    */ 
    private $id; 

    /** 
    * @MongoDB\String 
    */ 
    private $title; 

    /** 
    * @MongoDB\EmbedOne(targetDocument="Geolocation") 
    */ 
    private $geolocation; 


    /** 
    * Get id 
    * 
    * @return id $id 
    */ 
    public function getId() 
    { 
     return $this->id; 
    } 

    /** 
    * Set geolocation 
    * 
    * @param Company\StoreBundle\Document\Geolocation $geolocation 
    */ 
    public function setGeolocation(\Company\StoreBundle\Document\Geolocation $geolocation) 
    { 
     $this->geolocation = $geolocation; 
    } 

    /** 
    * Get geolocation 
    * 
    * @return Company\StoreBundle\Document\Geolocation $geolocation 
    */ 
    public function getGeolocation() 
    { 
     return $this->geolocation; 
    } 

    /** 
    * Set title 
    * 
    * @param string $title 
    */ 
    public function setTitle($title) 
    { 
     $this->title = $title; 
    } 

    /** 
    * Get title 
    * 
    * @return string $title 
    */ 
    public function getTitle() 
    { 
     return $this->title; 
    } 
} 

Geolocation.php

namespace Company\StoreBundle\Document; 

use Doctrine\ODM\MongoDB\Mapping\Annotations as MongoDB; 

/** 
* @MongoDB\EmbeddedDocument 
*/ 
class Geolocation 
{ 
    /** 
    * @MongoDB\Id 
    */ 
    private $id; 

    /** 
    * @MongoDB\Float 
    */ 
    private $latitude; 

    /** 
    * @MongoDB\Float 
    */ 
    private $longitude; 


    /** 
    * Get id 
    * 
    * @return id $id 
    */ 
    public function getId() 
    { 
     return $this->id; 
    } 

    /** 
    * Set latitude 
    * 
    * @param float $latitude 
    */ 
    public function setLatitude($latitude) 
    { 
     $this->latitude = $latitude; 
    } 

    /** 
    * Get latitude 
    * 
    * @return float $latitude 
    */ 
    public function getLatitude() 
    { 
     return $this->latitude; 
    } 

    /** 
    * Set longitude 
    * 
    * @param float $longitude 
    */ 
    public function setLongitude($longitude) 
    { 
     $this->longitude = $longitude; 
    } 

    /** 
    * Get longitude 
    * 
    * @return float $longitude 
    */ 
    public function getLongitude() 
    { 
     return $this->longitude; 
    } 
} 

PlaceType.php

namespace Company\AdminBundle\Form\Type; 

use Symfony\Component\Form\AbstractType; 
use Symfony\Component\Form\FormBuilder; 
use Company\AdminBundle\Form\Type\GeolocationType; 

class PlaceType extends AbstractType 
{ 
    public function buildForm(FormBuilder $builder, array $options) 
    { 
     $builder->add('title'); 

     $builder->add('geolocation', new GeolocationType()); 

    } 

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

    public function getDefaultOptions(array $options) 
    { 
     return array(
       'data_class' => 'Company\StoreBundle\Document\Place', 
     ); 
    } 
} 

GeolocationType.php

namespace Company\AdminBundle\Form\Type; 

use Symfony\Component\Form\AbstractType; 
use Symfony\Component\Form\FormBuilder; 

class GeolocationType extends AbstractType 
{ 
    public function buildForm(FormBuilder $builder, array $options) 
    { 
     $builder 
      ->add('latitude') 
      ->add('longitude'); 
    } 

    public function getDefaultOptions(array $options) 
    { 
     return array('data_class' => 'Company\StoreBundle\Document\Geolocation'); 
    } 

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

Dziękuję wszystkim

+2

Czy kiedykolwiek to rozgryzłeś? –

Odpowiedz

3

myślę, że nie powinno się używać w zależności metody setter w tym przypadku ...
więc zamiast:

setGeolocation(\Company\StoreBundle\Document\Geolocation $geolocation) 

Spróbuj tego i zobacz czy działa poprawnie:

setGeolocation($geolocation)