2016-10-15 2 views
0

У меня есть форма, где user может загрузить изображение после загрузки изображения, оно также сохраняется как true. Я хотел бы, чтобы только последняя загрузка изображения была установлена ​​по умолчанию (true), а другая картинка этого user_id установлена ​​в значение true, чтобы она сохранялась как false. Я не хочу, чтобы у пользователя было много фотографий по умолчанию.Установить сущность по умолчанию [symfony2]

Это то, что я сделал:

public function avatarUserAction(Request $request) 
{ 
    $em = $this->getDoctrine()->getManager(); 
    $user = $this->container->get('security.token_storage')->getToken()->getUser(); 
    $entity = new Avatar(); 
    $form = $this->createForm(new AvatarType(),$entity); 
    if ($this->get('request')->getMethod() == 'POST') { 
     $form->handleRequest($request); 
     if ($form->isSubmitted() && $form->isValid()) { 

      $entity->setCreatedAt(new \DateTime()); 
      $entity->setDefaultPicture(true); 
      $entity->setUser($this->container->get('security.token_storage')->getToken()->getUser()); 
      $em->persist($entity); 
      $em->flush(); 
     } 
     return $this->redirect($this->generateUrl('avatarUser')); 
    } 

    return $this->render('ApplicationSonataUserBundle:Profile:avatar.html.twig', array('user' => $user,'entity' => $entity, 
     'form' => $form->createView())); 
} 

.

public function avatarUserAllAction() 
{ 
    $em = $this->getDoctrine()->getManager(); 
    $user = $this->container->get('security.token_storage')->getToken()->getUser(); 
    $entity = $em->getRepository('ApplicationSonataUserBundle:Avatar')->byAvatar($user); 
    return $this->render('ApplicationSonataUserBundle:Profile:avatar_all_image.html.twig', array('user' => $user,'entity' => $entity)); 
} 

routing.yml

avatarUser: 
    pattern: /profile/picture 
    defaults: { _controller: FLYBookingsBundle:Post:avatarUser } 

avatarUserAll: 
    pattern: /profile/picture 
    defaults: { _controller: FLYBookingsBundle:Post:avatarUserAll } 

UserRepository

public function byAvatar($user) 
{ 
    $qb = $this->createQueryBuilder('u') 
     ->select('u') 
     ->where('u.user = :user') 
     ->orderBy('u.createdAt', 'DESC') 
     ->setParameter('user', $user); 
    return $qb->getQuery() 
     ->getResult(); 
} 

Avatar.php

class Avatar 
{ 
    /** 
    * @ORM\Id 
    * @ORM\Column(type="integer") 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    protected $id; 

    /** 
    * @var User 
    * @ORM\ManyToOne(targetEntity="Application\Sonata\UserBundle\Entity\User", inversedBy="avatar") 
    */ 
    protected $user; 

    /** 
    * @var boolean 
    * @ORM\Column(name="defaultPicture", type="boolean") 
    */ 
    protected $defaultPicture; 

    public function __construct() 
    { 
     $this->defaultPicture = false; 
     $this->createAt = new \DateTime(); 
    } 

    /** 
    * @var \DateTime 
    * @ORM\Column(name="createdAt", type="datetime", nullable=true) 
    */ 
    protected $createdAt; 

    /** 
    * NOTE: This is not a mapped field of entity metadata, just a simple property. 
    * 
    * @Vich\UploadableField(mapping="user_image", fileNameProperty="imageName") 
    * 
    * @var File 
    */ 
    private $imageFile; 

    /** 
    * @ORM\Column(type="string", length=255) 
    * 
    * @var string 
    */ 
    private $imageName; 

    /** 
    * @ORM\Column(type="datetime") 
    * 
    * @var \DateTime 
    */ 
    private $updatedAt; 

    /** 
    * If manually uploading a file (i.e. not using Symfony Form) ensure an instance 
    * of 'UploadedFile' is injected into this setter to trigger the update. If this 
    * bundle's configuration parameter 'inject_on_load' is set to 'true' this setter 
    * must be able to accept an instance of 'File' as the bundle will inject one here 
    * during Doctrine hydration. 
    * 
    * @param File|\Symfony\Component\HttpFoundation\File\UploadedFile $image 
    * 
    * @return Avatar 
    */ 
    public function setImageFile(File $image = null) 
    { 
     $this->imageFile = $image; 

     if ($image) { 
      // It is required that at least one field changes if you are using doctrine 
      // otherwise the event listeners won't be called and the file is lost 
      $this->updatedAt = new \DateTime('now'); 
     } 

     return $this; 
    } 

    /** 
    * @return File|null 
    */ 
    public function getImageFile() 
    { 
     return $this->imageFile; 
    } 

    /** 
    * @param string $imageName 
    * 
    * @return Avatar 
    */ 
    public function setImageName($imageName) 
    { 
     $this->imageName = $imageName; 

     return $this; 
    } 

    /** 
    * @return string|null 
    */ 
    public function getImageName() 
    { 
     return $this->imageName; 
    } 


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

    /** 
    * Set defaultPicture 
    * 
    * @param boolean $defaultPicture 
    * @return Avatar 
    */ 
    public function setDefaultPicture($defaultPicture) 
    { 
     $this->defaultPicture = $defaultPicture; 

     return $this; 
    } 

    /** 
    * Get defaultPicture 
    * 
    * @return boolean 
    */ 
    public function getDefaultPicture() 
    { 
     return $this->defaultPicture; 
    } 

    /** 
    * Set createdAt 
    * 
    * @param \DateTime $createdAt 
    * @return Avatar 
    */ 
    public function setCreatedAt($createdAt) 
    { 
     $this->createdAt = $createdAt; 

     return $this; 
    } 

    /** 
    * Get createdAt 
    * 
    * @return \DateTime 
    */ 
    public function getCreatedAt() 
    { 
     return $this->createdAt; 
    } 

    /** 
    * Set updatedAt 
    * 
    * @param \DateTime $updatedAt 
    * @return Avatar 
    */ 
    public function setUpdatedAt($updatedAt) 
    { 
     $this->updatedAt = $updatedAt; 

     return $this; 
    } 

    /** 
    * Get updatedAt 
    * 
    * @return \DateTime 
    */ 
    public function getUpdatedAt() 
    { 
     return $this->updatedAt; 
    } 

    /** 
    * Set user 
    * 
    * @param \Application\Sonata\UserBundle\Entity\User $user 
    * @return Avatar 
    */ 
    public function setUser(\Application\Sonata\UserBundle\Entity\User $user = null) 
    { 
     $this->user = $user; 

     return $this; 
    } 

    /** 
    * Get user 
    * 
    * @return \Application\Sonata\UserBundle\Entity\User 
    */ 
    public function getUser() 
    { 
     return $this->user; 
    } 
} 

ответ

1

Установите defaultPicture в false для всех пользовательских аватаров перед созданием нового.

if ($form->isSubmitted() && $form->isValid()) { 
    foreach ($this->container->get('security.token_storage')->getToken()->getUser()->getAvatar() as $avatar) { 
     $avatar->setDefaultPicture(false); 
    } 

    ... 
} 
+0

Извините за поздний отклик. Я просто попробовал сейчас, и это сработало отлично. Большое спасибо :) – Sirius