2011-11-07 17 views
9

ÖyleSymfony'nin 2 Yerleştirilmiş Formlar

$builder->add('parent', new \Company\Bundle\Form\UserObjects\AParentType); 

Ancak denemek ve

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

Ben hatayı almak forma isteği bağlamak ne zaman gibi başka bir biçim türü içine bir form türü katıştırma am

Catchable Fatal Error: Argument 1 passed to Company\Bundle\Entity\UserObjects\User::setParent() must be an instance of Company\Bundle\Entity\UserObjects\AParent, array given, called in /Volumes/Media/Symfony/vendor/symfony/src/Symfony/Component/Form/Util/PropertyPath.php on line 346 and defined in /Volumes/Media/Symfony/src/Company/Bundle/Entity/UserObjects/User.php line 771

Form, "AParent" nesnesini bir varlık yerine bir dizi olarak geçiriyor gibi görünüyor. Herhangi bir fikir?

Düzenlenen

User.php

<?php 
    // src/Company/Bundle/Entity/UserObjects/Users.php 

    namespace Company\Bundle\Entity\UserObjects; 

    use Symfony\Component\Security\Core\User\UserInterface; 

    use Doctrine\ORM\Mapping as ORM; 

    /** 
    * @ORM\Entity(repositoryClass="Company\Bundle\Repository\UserObjects\UserRepository") 
    * @ORM\Table(name="user") 
    * @ORM\HasLifecycleCallbacks() 
    */ 
    class User implements UserInterface, \Serializable 
    { 
     /** 
     * @ORM\Id 
     * @ORM\Column(type="integer") 
     * @ORM\GeneratedValue(strategy="AUTO") 
     */ 
     protected $id; 

     /** 
     * @ORM\Column(type="string") 
     */ 
     protected $username; 

     /** 
     * @ORM\Column(type="string") 
     */ 
     protected $password; 

     /** 
     * @ORM\Column(type="string") 
     */ 
     protected $securityQuestion; 

     /** 
     * @ORM\Column(type="string") 
     */ 
     protected $securityAnswer; 

     /** 
     * @ORM\Column(type="string") 
     */ 
     protected $salt; 


     /** 
     * @ORM\OneToOne(targetEntity="AParent", inversedBy="user") 
     */ 
     private $parent; 







     public function serialize() 
     { 
      return serialize(array( 
       'username' => $this->getUsername(), 
       'password' => $this->getPassword(), 
       'salt'  => $this->getSalt(), 
       'roles'  => $this->getRoles(), 
      )); 
     } 

     public function unserialize($serializedData) 
     { 
      $unserializedData  = unserialize($serializedData); 

      $this->setUsername(isset($unserializedData['username']) ? $unserializedData['username'] : null); 
      $this->setPassword(isset($unserializedData['password']) ? $unserializedData['password'] : null); 
      $this->setSalt(isset($unserializedData['salt']) ? $unserializedData['salt'] : null); 
     } 

     public function getRoles() 
     { 
      return array('ROLE_USER'); 
     } 




     public function eraseCredentials() 
     { 
      return false; 
     } 

     public function equals(UserInterface $user) 
     { 
       if ($user->getUsername() != $this->getUsername()) { 
        return false; 
       } 
       if ($user->getEmail() != $this->getEmail()) { 
        return false; 
       } 
       return true; 
     } 

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

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

     public function getUsername() 
     { 
      return $this->username; 
     } 

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

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

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

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

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

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

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

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




     /** 
     * Set parent 
     * 
     * @param Company\Bundle\Entity\UserObjects\AParent $parent 
     */ 
     public function setParent(\DABSquared\ProjectGradesBundle\Entity\UserObjects\AParent $parent) 
     { 
      $this->parent = $parent; 
      if($parent != null) { 
       $parent->setUser($this); 
      } 
     } 

     /** 
     * Get parent 
     * 
     * @return Company\Bundle\Entity\UserObjects\AParent 
     */ 
     public function getParent() 
     { 
      return $this->parent; 
     } 


     } 
     public function __construct() 
     { 
     } 

    } 

AParent.php

<?php 
    // src/Company/Bundle/Entity/UserObjects/AParent.php 

    namespace Company\Bundle\Entity\UserObjects; 

    use Doctrine\ORM\Mapping as ORM; 



    /** 
    * @ORM\Entity(repositoryClass="Company\Bundle\Repository\UserObjects\AParentRepository") 
    * @ORM\Table(name="parents") 
    * @ORM\HasLifecycleCallbacks() 
    */ 
    class AParent 
    { 
     /** 
     * @ORM\Id 
     * @ORM\Column(type="integer") 
     * @ORM\GeneratedValue(strategy="AUTO") 
     */ 
     protected $id; 


     /** 
     * @ORM\OneToOne(targetEntity="User", inversedBy="parent") 
     */ 
     private $user; 

        /** 
        * @ORM\Column(type="string") 
        */ 
        protected $zipCode; 


     public function __construct() 
     { 

     } 

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

     /** 
     * Set user 
     * 
     * @param Company\Bundle\Entity\UserObjects\User $user 
     */ 
     public function setUser(\Company\Bundle\Entity\UserObjects\User $user) 
     { 
      $this->user = $user; 
     } 

     /** 
     * Get user 
     * 
     * @return Company\Bundle\Entity\UserObjects\User 
     */ 
     public function getUser() 
     { 
      return $this->user; 
     } 

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

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



    } 

UserType.php

<?php 

    namespace Company\Bundle\Form; 

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

    use Doctrine\ORM\EntityRepository; 

    class UserType extends AbstractType 
    { 
     public function buildForm(FormBuilder $builder, array $options) 
     { 
      $builder 
       ->add('username',null,array('label' => 'Username:')) 
       ->add('password',null,array('label' => 'Password:')) 
       ->add('securityQuestion',null,array('label' => 'Security Question:')) 
       ->add('securityAnswer',null,array('label' => 'Security Answer:')) 
       ->add('parent', new \Company\Bundle\Form\UserObjects\AParentType); 

     } 

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

AParent Tip.php

+0

İlk kod snippet'inizde, sınıf adından sonra parantez zorunlu değil mi? – greg0ire

+0

Bazı kodları görmek de yararlı olur. Bu bize fazla şey söylemiyor. – Flukey

+0

@ greg0ire Bunun için formun oluşturulup sayfanın üzerinde iyi görüntülendiğinden, ancak form yayımlandığında ve User nesnesine bağlandığında bu hata oluştuğunda bunu düşünmüyorum. – Daniel

cevap

8

Veri sınıfını AParentType biçiminde ayarlamadınız. Symfony'de sonraki sürümlerinde için

public function getDefaultOptions(array $options) 
{ 
    return array(
     'data_class' => 'Project\MyBundle\Entity\AParent', 
    ); 
} 

, bunun yerine bu kullanmanız gerekir: Böyle yapmak Bununla

->add('parent', new \Company\Bundle\Form\UserObjects\AParentType); 

:

use Symfony\Component\OptionsResolver\OptionsResolverInterface; 
//... 

public function setDefaultOptions(OptionsResolverInterface $resolver) 
{ 
    $resolver->setDefaults(array(
     'data_class' => 'Project\MyBundle\Entity\AParent', 
    )); 
} 

bu Değiştir

Zaten dahil olduğunuz için
->add('parent', new AParentType()); 

o ad alanı. o, form şablonunda, hangi bire-bir, eğer

Ve yapmanız: çalışmalıdır

{{ form_row(form.parent.zipCode) }} 

Umarım. Varlık tanımları çok iyi görünüyor :-)

+0

Bu işe yaradı! çok teşekkür ederim! Bu yöntemi unuttuğuma inanamıyorum, şimdi bu kadar mantıklı! – Daniel

+1

Rica ederim. Gecenin geri kalanında eğlen. – Flukey

+1

3 yıl sonra bu soruna girdi, ha!Özgün çözüm etkisizdi, ancak 'OptionsResolverInterface' ile' setDefaultOptions' kullanılarak mükemmel bir şekilde çalıştı. Onu çözümüne ekledim. – sjagr