2016-07-15 2 views
1

나는 작은 문제 심포니와 collectiontype을 만들 ..이 같은 null를 돌려 내가 http://symfony.com/doc/current/cookbook/form/form_collections.html 또는 http://toni.uebernickel.info/2012/03/15/an-example-of-symfony2-collectiontype-form-field-prototype.html ...Symfony3 CollectionType는 데이터

하지만 항상 같은 결과와 마찬가지로, 여러 튜토리얼을 따라하려고 노력

.

$tags = $form->get('tags')->getData();을 반환합니다. 내가/추가를 생성 링크를 제거 할 수있어 및 색인 aswell 작업,하지만 컨트롤러에 데이터를 얻고있다

...

나는 중요한 뭔가를 누락되거나 잘못된 일을하고 있습니까? 누군가가 나를 도와 주거나 팁을 줄 수 있기를 바랍니다.

나는 현재

작업 개체

/** 
* @ORM\OneToMany(targetEntity="Tag", mappedBy="task", 
cascade={"persist", "remove"}) 
*/protected $tags; 

태그 엔티티

/** 
* @ORM\ManyToOne(targetEntity="Task", inversedBy="tags") 
* @ORM\JoinColumn(name="tag_id", referencedColumnName="id") 
*/
protected $task; 

TaskType

을 가지고있는 0
->add('tags', CollectionType::class, array(
'entry_type' => TagType::class, 
'allow_add' => true, 
'allow_delete' => true, 
'prototype_name' => '__tag__name__',)) 

TAGTYPE

$builder->add('name', TextType::class, array())); 

나뭇

{% macro widget_prototype(widget, remove_text) %} 
    {% if widget.vars.prototype is defined %} 
     {% set form = widget.vars.prototype %} 
     {% set name = widget.vars.prototype.vars.name %} 
    {% else %} 
     {% set form = widget %} 
     {% set name = widget.vars.full_name %} 
    {% endif %} 

    <div data-content="{{ name }}"> 
     <a class="btn-remove" data-related="{{ name }}">{{ remove_text }}</a> 
     {{ form_widget(form) }} 
    </div> 

{% endmacro %} 

매크로

<div id="post_tags" data-prototype="{{ _self.widget_prototype(form.tags, 'Remove tag')|escape }}"> 
{% for widget in form.tags.children %} 
    {{ _self.widget_prototype(widget, 'Remove tag') }} 
{% endfor %} 
</div> 
<a class="btn-add" data-target="post_tags">Add tag</a> 

JS

jQuery(function($) { 
    $(document).on('click', '.btn-add[data-target]', function(event) { 
     var collectionHolder = $('#' + $(this).attr('data-target')); 

     if (!collectionHolder.attr('data-counter')) { 
      collectionHolder.attr('data-counter', collectionHolder.children().length); 
     } 

     var prototype = collectionHolder.attr('data-prototype'); 
     var form = prototype.replace(/__tag__name__/g, collectionHolder.attr('data-counter')); 

     collectionHolder.attr('data-counter', Number(collectionHolder.attr('data-counter')) + 1); 
     collectionHolder.append(form); 

     event && event.preventDefault(); 
    }); 

    $(document).on('click', '.btn-remove[data-related]', function(event) { 
     var name = $(this).attr('data-related'); 
     $('*[data-content="'+name+'"]').remove(); 

     event && event.preventDefault(); 
    }); 
}); 

컨트롤러

$form = $this->createForm(TaskType::class, $task); 

EDIT/UPDATE

태그

에 대한

작업 엔티티 세터와 게터

public function __construct() 
{ 
    $this->tags = new \Doctrine\Common\Collections\ArrayCollection(); 
} 

public function add(Tag $tag) 
{ 
    $this->tags[] = $tag; 
    return $this; 
} 

public function removeTag(Tag $tag) 
{ 
    $this->tags->removeElement($tag); 
} 

public function getTags() 
{ 
    return $this->tags; 
} 

컨트롤러에 :

$task = new Task(); 
$form = $this->createForm(TaskType::class, $task); 
$form->handleRequest($request); 
if($form->isValid()){ 
    $tags = $form->get('tags')->getData(); 

    foreach($tags as $tag){ 
     //Here var_dump, echo, print, array_push etc tricks = empty 
    } 

    //Also without foreach var_dump = empty 
} 
+0

Task 엔터티에 getter 및 setters (태그 용)를 표시하십시오. – galeaspablo

+0

전체 컨트롤러를 게시 할 수 있습니까, 아니면 적어도 태그 데이터를 가져 오려고하는 관련 부분을 게시 할 수 있습니까? – DonCallisto

+0

업데이트 된 질문, getters 및 setters는 PHP bin/console로 생성됩니다. doctrine : generate : entities - command – Degu

답변

1

질문을 자세히 업데이트 해 주셔서 감사합니다.

문제를 바로 해결하려면 Doctrine 캐스케이드가 소유 사이드 (이 경우에는 그대로 유지해야하는 inversedBy가있는 쪽) 만 확인하십시오. 따라서 태그에 필요한 작업을 수동으로 설정해야합니다.

public function add(Tag $tag) 
{ 
    $this->tags[] = $tag; 
    $tag->task = $this;//added this line 
    return $this; 
} 

가정 - 난 당신이 당신이 실제로 필요한 조사하지 않은 것으로 생각합니다. 적절한 해결책을 위해이 기능이 필요하다고 가정하고, 하나의 작업에 여러 개의 태그가 있고 여러 개의 작업에서 태그를 다시 사용할 수 있습니다. 이 경우

: 당신은 OneToMany 관계를 사용하고

1. 당신이 참조하는 첫 번째 튜토리얼을 보면당신은 ManyToMany (http://symfony.com/doc/current/cookbook/form/form_collections.html)

2. 또한, 당신은 단방향 ManyToMany 필요가 필요합니다. 왜? 작업 내에서 태그를 지정하고 다른 방법으로 태그를 할당하지 마십시오. 게다가 다른 엔티티에 태그를 지정해야 할 수도 있습니다. ManyToMany (단방향)에 문서에 대해서는

http://doctrine-orm.readthedocs.io/projects/doctrine-orm/en/latest/reference/association-mapping.html#many-to-many-unidirectional


작업 개체

/** 
* @var ArrayCollection 
* 
* @Assert\Valid 
* @ORM\ManyToMany(targetEntity="Tag") 
* @ORM\JoinTable(name="tasks_tags", 
* joinColumns={@ORM\JoinColumn(name="task_id", referencedColumnName="id", onDelete="CASCADE")}, 
* inverseJoinColumns={@ORM\JoinColumn(name="tag_id", referencedColumnName="id")} 
*) 
*/ 
protected $tasks; 

태그 엔티티

보호 $ 작업을 살펴있다;


참고 :이 작업에서 태그를 삭제하고 다른 작업을 삭제 한 태그를 사용하지 않는 경우, 태그는 "고아"로 남아있을 것입니다. Doctrine은 ManyToMany 관계에서 고아 제거와 잘 작동하지 않으므로 이러한 고아를 수동으로 제거해야합니다. 또는 나중에 사용할 태그를 사용하지 않고 남겨 둘 수 있습니다.

+0

마지막으로! 불면의 주간 솔루션을 찾으려면 관리 .. 아직도 모르겠지만 아약스 호출 버튼을 제출 collectiontype을 부러에 연결 .. .. 어떻게 .. 대답으로, eventhought 내 문제를 해결하지 못했지만 잘 설명하고 개선입니다. :) – Degu