2016-07-22 5 views
0

작은 질문이 있습니다.Symfony 엔티티 속성이 업데이트되지 않습니다.

반복 가능한 속성 태그가있는 기사가 있습니다. 내가 기사를 편집하고 새 태그를 추가하면 모두 괜찮습니다. 그러나이 태그의 기사에서 양식의 제거 태그가 계속 존재하는 경우

게시와 양식에 대한 데이터 바인딩을 이해합니다. 새로운 태그가 머티리얼에 표시됩니다.

하지만 왜 새 게시물 데이터를 바인딩 한 후에 사라지지 않았습니까?

public function editAction(Article $article, Request $request) 
    { 
     // The second parameter is used to specify on what object the role is tested. 
     if (!$this->get('security.authorization_checker')->isGranted('IS_AUTHENTICATED_FULLY')) { 
      return $this->redirectToRoute('login'); 
     } 

     // update Article modify date 
     $article->setModifyDate(new \DateTime()); 

     // create form 
     $form = $this->createForm(ArticleType::class, $article, [ 
      'manager' => $this->getDoctrine()->getManager() 
     ]); 

     $form->handleRequest($request); 
     //print_r($article->getTags()); Deleted tag still here 

UPDATE 여기

제 엔티티가

** 
* Class Article 
* @package BackendBundle\Entity 
* @ORM\Table(name="articles") 
* @ORM\Entity(repositoryClass="BackendBundle\Entity\ArticleRepository") 
*/ 
class Article 
{ 
    /** 
    * @ORM\Column(type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    private $id; 

    /** 
    * @ORM\Column(type="string", length=255, unique=true) 
    * @Assert\NotBlank() 
    */ 
    private $name; 

    /** 
    * @ORM\Column(type="string", length=60, unique=true) 
    * @Assert\NotBlank() 
    */ 
    private $alias; 

    /** 
    * @ORM\Column(type="text") 
    * @Assert\NotBlank() 
    */ 
    private $content; 

    /** 
    * @ORM\Column(type="integer", length=255) 
    * @Assert\NotBlank() 
    */ 
    private $author; 

    /** 
    * @ORM\Column(type="datetime") 
    * @Assert\NotBlank() 
    */ 
    private $publishDate; 

    /** 
    * @ORM\Column(type="datetime") 
    * @Assert\NotBlank() 
    */ 
    private $modifyDate; 

    /** 
    * @ORM\ManyToMany(targetEntity="Tag", inversedBy="articles", cascade={"persist","remove"}) 
    * @ORM\JoinTable(
    *  name="articles_tags", 
    *  joinColumns={@ORM\JoinColumn(name="article_id", referencedColumnName="id")}, 
    *  inverseJoinColumns={@ORM\JoinColumn(name="tag_id", referencedColumnName="id")}) 
    */ 
    private $tags; 

    /** 
    * Article constructor. 
    */ 
    public function __construct() 
    { 
     $this->tags = new ArrayCollection(); 
    } 

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

    /** 
    * Set article name. 
    * 
    * @param string $name 
    * 
    * @return $this 
    */ 
    public function setName($name) 
    { 
     $this->name = $name; 

     return $this; 
    } 

    /** 
    * Return article name. 
    * @return string 
    */ 
    public function getName() 
    { 
     return $this->name; 
    } 

    /** 
    * Set articles alias. 
    * 
    * @param string $alias 
    * 
    * @return $this 
    */ 
    public function setAlias($alias) 
    { 
     $this->alias = $alias; 

     return $this; 
    } 

    /** 
    * Returns article alias. 
    * @return mixed 
    */ 
    public function getAlias() 
    { 
     return $this->alias; 
    } 

    /** 
    * Set article content. 
    * 
    * @param string $content 
    * 
    * @return $this 
    */ 
    public function setContent($content) 
    { 
     $this->content = $content; 

     return $this; 
    } 

    /** 
    * Return article content 
    * @return string 
    */ 
    public function getContent() 
    { 
     return $this->content; 
    } 

    /** 
    * Set article author 
    * 
    * @param integer $author ID of author 
    * 
    * @return mixed 
    */ 
    public function setAuthor($author) 
    { 
     $this->author = $author; 

     return $this; 
    } 

    /** 
    * Return author id. 
    * @return int Id of the author. 
    */ 
    public function getAuthor() 
    { 
     return $this->author; 
    } 

    /** 
    * Set article publish date. 
    * 
    * @param string $date 
    * 
    * @return $this 
    */ 
    public function setPublishDate($date) 
    { 
     $this->publishDate = $date; 

     return $this; 
    } 

    /** 
    * Return article publish date. 
    * @return string 
    */ 
    public function getPublishDate() 
    { 
     return $this->publishDate; 
    } 

    /** 
    * Set article modify date 
    * 
    * @param string $date 
    * 
    * @return $this 
    */ 
    public function setModifyDate($date) 
    { 
     $this->modifyDate = $date; 

     return $this; 
    } 

    /** 
    * Return article modify date 
    * @return string 
    */ 
    public function getModifyDate() 
    { 
     return $this->modifyDate; 
    } 

    /** 
    * Set tags for article. 
    * 
    * @param ArrayCollection|array $tags 
    * 
    * @return $this 
    */ 
    public function setTags($tags) 
    { 
     if (!empty($tags)) 
     { 
      foreach ($tags as $tag) 
      { 
       $this->setTag($tag); 
      } 
     } 

     return $this; 
    } 

    /** 
    * Set article tag. 
    * 
    * @param Tag $tag 
    * 
    * @return $this 
    * 
    */ 
    public function setTag(Tag $tag) 
    { 
     if (!$this->tags->contains($tag)) 
     { 
      $this->tags->set($tag->getName(), $tag); 
      $tag->setArticle($this); 
     } 

     return $this; 
    } 

    /** 
    * Remove all tags from article. 
    */ 
    public function removeTags() 
    { 
     if(!empty($this->tags)) 
     { 
      foreach($this->tags as $tag) 
      { 
       $this->removeTag($tag); 
      } 
     } 

     return $this; 
    } 

    /** 
    * @param \BackendBundle\Entity\Tag $tag 
    * 
    * @return $this 
    */ 
    public function removeTag(Tag $tag) 
    { 
     if ($this->tags->contains($tag)) 
     { 
      $this->tags->removeElement($tag); 
      $tag->removeArticle($this); 
     } 

     return $this; 
    } 

    /** 
    * Returns all tags for article. 
    * @return ArrayCollection 
    */ 
    public function getTags() 
    { 
     return $this->tags; 
    } 
} 

그리고 ArticleType

/** 
* Class ArticleType 
* @package AppBundle\Form 
*/ 
class ArticleType extends AbstractType 
{ 
    /** 
    * @param FormBuilderInterface $builder 
    * @param array    $options 
    */ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $tagTransformer = new TagTransformer($options['manager']); 
     $builder 
      ->add('name', TextType::class, array(
       'label_attr' => array('class' => ''), 
       'attr'  => array('class' => 'form-control'), 
       'label'  => 'article.name' 
      )) 
      ->add('alias', TextType::class, array(
       'label_attr' => array('class' => ''), 
       'attr'  => array('class' => 'form-control'), 
       'label'  => 'article.alias' 
      )) 
      ->add('content', TextareaType::class, array(
       'label_attr' => array('class' => ''), 
       'attr'  => array(
        'class' => 'form-control' 
       ), 
       'label'  => 'article.content' 
      )) 
      ->add('publish_date', DateType::class, array(
       'label_attr' => array('class' => ''), 
       'attr'  => array('class' => 'form-control'), 
       'format'  => 'dd-MM-yyyy', 
       'label'  => 'article.publish_date' 
      )) 
      ->add('modify_date', DateType::class, array(
       'label_attr' => array('class' => ''), 
       'attr'  => array('class' => 'form-control'), 
       'format'  => 'dd-MM-yyyy', 
       'label'  => 'article.modify_date' 
      )) 
      ->add($builder->create('tags', CollectionType::class, array(
       'label'  => 'article.tags', 
       'by_reference' => false, 
       'allow_add' => true, 
       'allow_delete' => true, 
      ))->addViewTransformer($tagTransformer)); 
    } 

    /** 
    * @param OptionsResolver $resolver 
    */ 
    public function configureOptions(OptionsResolver $resolver) 
    { 
     $resolver->setDefaults(array(
      'data_class' => 'BackendBundle\Entity\Article', 
     )); 

     $resolver->setRequired(array(
      'manager', 
     )); 

     $resolver->setAllowedTypes('manager', 'Doctrine\Common\Persistence\ObjectManager'); 
    } 
} 

답변

0

입니다 기사 엔티티에서 태그 추가 및 태그 기능을 다음과 같이 수정 해보십시오.

public function addTag(Tag $tag) 
{ 
    $this->tags[] = $tag; 
    $tag->addArticle($this); 

    return $this; 
} 

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

답을 보내 주셔서 감사합니다. 그러나 나는이 모든 방법과 더 많은 것을 나의 실체에 가지고있다. – Tapakan

+0

질문을 업데이트하고 엔터티 및 양식 유형을 보여줄 수 있습니까? 그래서 내가 너를 해결하도록 도와 줄 수있어. –

+0

업데이트 됨. 도와 주셔서 대단히 감사합니다 – Tapakan

관련 문제