2014-11-28 3 views
0

저는 Zend Framework 2와 Doctrine 2에 새로운 것이므로 내 문제를 검색하거나 디버깅하는 방법조차 모릅니다.Doctrine 2 : 양식 필드에 Doctrine Common Collections ArrayCollection @ 00이 값으로 표시됩니다.

나는 3 개 데이터베이스 테이블

1. 고라
ID
adverttitle ...

2. 카테고리
ID
범주 을 ...이

3. advert_category
advert_id 내가 2 엔티티, 고라와 카테고리를 만들었습니다


CATEGORY_ID. 선택할 수있는 범주를 표시하는 양식이 생겼습니다. jQuery를 사용하여 선택 가능한 기능과 함께 드롭 다운 대신 목록을 범주로 표시합니다. 따라서 카테고리를 클릭하면이 list 요소의 값이 카테고리라는 숨겨진 입력 필드에 입력됩니다. 내가 양식을 표시 할 때 즉, 숨겨진 카테고리 입력 필드 000000000 ..... 대신 비어있는 @교리 \ 공통 \ 모음 \있는 ArrayCollection의 값을 가지고 외에

모든 것이 잘 작동합니다. 여기서 내가 뭘 잘못하고 있니? 나는 해결책을 찾으려고했지만 실패했다.

결국 ManyToMany 관계를 선택 했으므로 결국 1 개 이상의 카테고리를 저장할 수 있기를 원합니다. 현재는 1로만 작동하지만 나중에이 값을 변경할 수 있어야합니다.

여기 내 고라 엔티티 :

namespace Advert\Entity; 

use Doctrine\ORM\Mapping as ORM; 
use Doctrine\Common\Collections\ArrayCollection; 
use DateTime; 

/** Advert 
* 
* @ORM\Table(name="advert") 
* @ORM\Entity(repositoryClass="Advert\Repository\AdvertRepository") 
*/ 

class Advert 
{ 
/** 
    * @var integer 
    * 
    * @ORM\Column(name="id", type="integer", nullable=false) 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="IDENTITY") 
    */ 
    private $id; 


/** 
    * @var string 
    * 
    * @ORM\Column(name="advert_title", type="string", length=255, nullable=true) 
    */ 
    private $advertTitle; 

/** 
    * @ORM\ManyToMany(targetEntity="Category", inversedBy="adverts", cascade={"persist"}) 
    * @ORM\JoinTable(name="advert2category") 
    */ 
    private $categories; 

    public function __construct() 
    { 
    $this->categories = new ArrayCollection(); 
    } 

/** 
    * Set categories 
    * 
    * @param ArrayCollection $category 
    * @return Advert 
    */ 
    public function setCategories($categories) 
    { 
    $this->categories = $categories; 
    return $this; 
    } 


/** 
    * Get categories 
    * 
    * @return ArrayCollection 
    */ 
    public function getCategories() 
    { 
    return $this->categories; 
    } 

    /** 
    * @param Collection $categories 
    */ 
    public function addCategories($categories) 
    { 
    foreach ($categories as $category) { 
     $this->categories->add($category); 
    } 
    } 

    /** 
    * @param Collection $categories 
    */ 
    public function removeCategories($categories) 
    { 
    foreach($categories as $category){ 
     $this->categories->removeElement($category); 
    } 

    } 

이 원인이되는 고라 엔티티에 오류가 있습니까? 누군가가 도울 수 있기를 바랍니다. 나는이 문제가 주 이후로 제대로 작동하지 않습니다.

업데이트 - 형태

아래의 양식 표시 2 개 드롭 다운 요소와 2 숨겨진 입력 필드를 호출 제어기 내에서 형태 및 부품을 추가했다. 2 개의 드롭 다운 필드는 jQuery를 통해 선택 가능한 목록으로 변환됩니다. Maincategory에서 List Element를 클릭하면 선택한 Maincategory에 대한 Subcategory가 다시 선택 가능한 목록으로 표시됩니다. MaincategoryID는 숨겨진 categoryID 필드에 입력됩니다. 목록에서 하위 카테고리를 선택하면 해당 카테고리의 ID가 숨겨진 카테고리 필드에 작성됩니다. "다음"버튼을 클릭하면 $ _POST [ 'categories']의 값을 내 연결 테이블에 advertID와 함께 저장합니다. 양방향 관계가 사용하는 테이블을 조인하지 않습니다

$sl = $this->getServiceLocator(); 
    $form = $sl->get('FormElementManager')->get('\Advert\Form\CreateForm'); 

    # create a new, empty entity 
    $advert = new Advert(); 

    # set the hydrator to connect form and entity 
    $form->setHydrator(new DoctrineHydrator($this->getEntityManager(),'Advert\Entity\Advert')); 

    # connect form and entity 
    $form->bind($advert); 

답변

0

가장 먼저하는 일이 : 내 컨트롤러에서

use Zend\Form\Form; 
use DoctrineModule\Persistence\ObjectManagerAwareInterface; 
use Doctrine\Common\Persistence\ObjectManager; 

class CategoryForm extends Form implements ObjectManagerAwareInterface 
{ 

protected $objectManager; 


public function __construct() 
{  
    $this->setInputFilter(new AdvertFilter()); 
    parent::__construct('category'); 


} 

public function init() 
{ 
    $this->setAttribute('method', 'post'); 




    $this->add(array(
      'name' => 'categories', 
      'attributes' => array(
        'type' => 'hidden', 
        'id' => 'categories', 

      ), 
      'options'=> array(
        'label'=> 'categories', 
        ), 


    )); 


    $this->add(
      array(

        'type' => 'DoctrineModule\Form\Element\ObjectSelect', 
        'name' => 'categoriesList', 

        'options' => array(

          'object_manager' => $this->getObjectManager(), 
          'label' => 'Main Category', 
          'target_class' => 'Advert\Entity\Category', 
          'property'  => 'name', 
          'is_method' => true, 

          'find_method'  => array(
            'name' => 'getMainCategories', 
          ), 
        ), 
        'allow_empty' => true, 
        'required'  => false, 
        'attributes' => array(
          'id' => 'categoryList', 
          'multiple' => true, 


        ) 
      ) 
    ); 

    $this->add(
      array(
        'type' => 'DoctrineModule\Form\Element\ObjectSelect', 
        'name' => 'subcategoryList', 
        'options' => array(
          'object_manager' => $this->getObjectManager(), 
          'label' => 'Sub Category', 


          'target_class' => 'Advert\Entity\Category', 
          'property'  => 'name', 

          'is_method' => true, 
          'find_method'  => array(
            'name' => 'getSubCategories', 
          ), 
        ), 
        'allow_empty' => true, 
        'required'  => false, 
        'attributes' => array(

          'id' => 'subcategoryList', 
          'multiple' => true, 
          ) 
      ) 
    ); 


    $this->add(array(
      'type' => 'hidden', 
      'name' => 'categoryID', 
      'options'=> array(
        'label'=> 'categoryID'), 
      'attributes' => array(
        'id' => 'categoryID', 
        'value' => '1', 
      ) 
    )); 

    $this->add(array(
      'name' => 'submit', 
      'attributes' => array(
        'type' => 'submit', 
        'value' => 'Next', 
        'id' => 'submitbutton', 
      ), 
    )); 



} 

public function setObjectManager(ObjectManager $objectManager) 
{ 
    $this->objectManager = $objectManager; 
} 

public function getObjectManager() 
{ 
    return $this->objectManager; 
} 

} 

나는 내 양식 다음과 같은 방법을 호출합니다. 귀하의 매핑은 양방향처럼 보이지만 세 번째 테이블 인 advert_category을 사용하려고합니다.당신이 DoctrineObject hydrator을 활용하려는 경우

class Advert 
{ 
    // ... 

    /** 
    * @ORM\ManyToMany(targetEntity="Category") 
    * @ORM\JoinTable(name="advert_category", 
    *  joinColumns={@ORM\JoinColumn(name="advert_id", referencedColumnName="id")}, 
    *  inverseJoinColumns={@ORM\JoinColumn(name="category_id", referencedColumnName="id")} 
    *  ) 
    **/ 
    protected $categories; 

    // ... 
} 

은 또한 당신이 Advert 기업 내부의 addCategories(Collection $categories)removeCategories(Collection $categories) 메소드를 구현해야합니다

나는 단방향 관계 Advert 기업의 $categories 재산의 매핑을 변경하는 것이 좋습니다 . (저는 당신이 DoctrineORMModule을 사용하고 있다고 가정합니다). 이 시점에서

, 당신의 Category 엔티티 Advert에 대해 아무것도 몰라해야하며, 직접 $category->getAdverts() 같은 엔티티 방법을 통해 카테고리 인스턴스에서 모든 광고에 액세스 할 수 없습니다. 그러나 필요할 경우 광고주 측에 getAdvertsByCategoryId($categoryId) 메소드를 쉽게 쓸 수 있습니다.

마지막 세부 사항은, 당신은해야 CategoryFieldset (또한 객체로 Category 엔티티를 사용할 필요가있는) 당신이 target_element 구성 키를 사용하여 양식의 categories 요소에서이 필드 셋을 가리 키도록하거나 직접 인스턴스의 자체를 제공한다. 예를 들어

:

$formManager = $serviceLocator->get('FormElementManager'); 
$form = $formManager->get('your\form\name'); 
$form->add(
    array(
     'name' => 'categories', 
     'type' => 'Zend\Form\Element\Collection', 
     'options' => array(
      'target_element' => $formManager->get('your\fieldset\name'); 
      // or you can do this but probably you will also need $entityManager 
      // inside the CategoryFieldset 
      // 'target_element' => new CategoryFieldset(); 
      ), 
     ) 
    ); 

난 강력하게 양식을 얻을 수 FormElementManager의 사용을 권장하고 필드 셋 인스턴스가 직접 new AdvertForm()new CategoryFieldset()에 의해 그것들을 초기화의 instaed. 또한 AbstractFormElementFactory을 작성하면 $entityManager을 종속성과 같이 필드 세트와 양식에 올바르게 삽입하는 것이 좋습니다.

희망이 있습니다.

+0

자세한 답변을 주셔서 감사합니다. addCategories와 removecategories는 이미 포함되어 있었고, 내 질문에는 중요하지 않다고 생각하여 위의 내용을 그대로 두었습니다. 이제 나타납니다. 양방향 관계가 조인 테이블을 사용하지 않는다는 사실에 놀랐습니다. 왜냐하면이 모든 것을 인터넷에서 보았 기 때문에 좀 더 자세하게 살펴 보겠습니다. 게시물에 내 양식을 추가 했으므로 여기에 오류가 있다고 가정합니다. 그러나 어디에서 볼 수 없습니다. 어쩌면 그것을 볼 수 있을까요? 귀하의 권고 사항을 이해하고 변경을 시도 할 것입니다. – Luka

+0

분명히 나는 ​​카테고리 필드 세트를 개별 클래스로 분리 할 것입니다. 카테고리 필드 세트에'id' 요소가 있고 AdvertForm에'categories' 컬렉션이 있어야하기 때문에'AdvertForm'에 'categoryID'숨겨진 요소를 추가 할 필요가 없습니다. SubCategories 문제는 또한 AdvertForm이 아닌 Category fieldset에서 처리해야한다고 생각합니다. – edigu

관련 문제