2013-02-16 3 views
0

이 내 첫 질문 렌더링하는 형태로 변경 ManyToOne 관계, 나는 따라와 엔티티 그래서는 심포니 폼은 ManyToOne 필드

/** 
* @ORM\Entity 
* @ORM\Table(name="product") 
*/ 
class Product 
{ 
    /** 
    * @ORM\Id 
    * @ORM\Column(type="integer") 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    protected $id; 
    /** 
    * @ORM\Column(type="string", length=100) 
    */ 
    protected $name; 
    /** 
    * @ORM\ManyToOne(targetEntity="Acme\ProductsBundle\Entity\ProductCategory", inversedBy="products") 
    * @ORM\JoinColumn(name="category_id", referencedColumnName="id") 
    */ 
    protected $productCategory; 
} 

내가 한 다음 "ProductType"

class ProductType extends AbstractType 
{ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder 
      ->add('name') 
      ->add('productCategory') 
     ; 
    } 

    public function setDefaultOptions(OptionsResolverInterface $resolver) 
    { 
     $resolver->setDefaults(array(
      'data_class' => 'Acme\ProductsBundle\Entity\Product' 
     )); 
    } 

    public function getName() 
    { 
     return 'acme_hellobundle_producttype'; 
    } 
} 
에 대한 양식을 만들고 싶어

그리고 모든 양식을 렌더링 할 때 위대한 작품,하지만 지금은 사용자가 productCategory의 기본 키 번호를 작성해야하기 때문에 "productCategory"의 위젯을 텍스트 위젯으로 변경하려고합니다.

하지만 내가 그것을하고, 양식을 완료하면, 나는 다음과 같은 오류가 발생했습니다.

경고 : spl_object_hash()가 파라미터 1 목적은, 캐릭터 가 C에 나와있을 것으로 기대 : \ XAMPP \ htdocs를 \ sym2 \ 심포니 \ 벤더 \ 원칙 \ ORM \ LIB \ 교리 \ ORM \ UnitOfWork.php ORM은 PK의 문자열을 읽는 실패와 같은 라인 1358

가 보인다, 사람이 내가 그것을 해결하기 위해 참조해야 할 일의 작은 아이디어가있다. 조언에 감사드립니다.

+0

양식에서 양식을 생성하는 것보다 약간의 작업이 필요합니다. FormType을 결합 할 수 있음을 기억하십시오. ProductType은 내부에 CategoryType을 가질 수 있습니다. symfony 문서를 확인하십시오, 정말 잘 쓰여졌습니다 (그리고 당신이 저를 좋아한다면 프랑스어로). – mpm

+0

또한 getters/setter가 올바르게 힌트 처리되도록 확인하십시오. – Ocramius

답변

0

제품 엔티티는 제품 카테고리와 관련이 있습니다. 따라서 양식은 카테고리가 문자열이 아닌 엔티티 인 것으로 기대합니다. 따라서 expects parameter 1 to be object, string given 오류가 발생합니다.

이 문제를 방지하려면 setDefaultOptions 메서드를 제거 할 수 있습니다. 그렇게하면 폼 클래스는 특정 엔터티 클래스에 연결된다는 것을 더 이상 알 수 없습니다. 이것의 함정은 엔티티를 폼 클래스에 전달할 때 필드를 자동으로 설정하지 않는다는 것입니다.

그러나 이제 카테고리 ID를 입력하고 처리 할 수 ​​있습니다.

예.

class ProductType extends AbstractType 
{ 

    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder 
      ->add('name') 
      ->add('productCategory');   
    } 

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

이제는 productCategory가 텍스트 위젯이됩니다. 그러나 컨트롤러에서 직접 유지해야합니다. 그러나 이것 때문에 당신은 다른 질문을 할 수 있습니다.

양식을 만들 때 제품 개체를 전달하지 마십시오. 이렇게 하시겠습니까?

$form = $this->createForm(new ProductType(), array()); 
+0

안녕 artworkad, 답장을 보내 주셔서 감사합니다.이 문제를 해결할 수있는 좋은 방법입니다. 심포니 문서를 깊이 읽었으며 데이터 변압기를 사용하여이 자료를 열람 할 수있었습니다. 그래서 나는 그 둘 모두 좋은 대안이라고 생각한다. 답장을 보내 주셔서 감사합니다. http://symfony.com/doc/current/cookbook/form/data_transformers.html –