2016-06-07 2 views
0

Je travaille dans Sonata User Bundle avatar en utilisant Sonata Media Bundle. Tout fonctionne comme prévu dans Sonata Admin (Backend). Par exemple, lors de la mise à jour du formulaire admin, seul l'ancien fichier est remplacé (fonctionne bien).Groupe d'utilisateurs Sonata Avatar utilisant Sonata Media Bundle, sous forme personnalisée, tandis que l'image mise à jour ancienne, et en créer une nouvelle [résolu]

Problème: En essayant de modifier le profil utilisateur par formulaire personnalisé dans frontend. L'image télécharge correctement et remplace l'ancienne, mais en créant une nouvelle image dans le dossier de fichiers, ainsi qu'une nouvelle entrée dans le média. Seul le nouvel identifiant de l'image est ajouté à l'entrée de l'utilisateur (avatar), au lieu de l'ancien. Normalement, seul l'ancien sera utilisé.

Ce dont j'ai besoin est de modifier/mettre à jour l'ancienne image et de ne pas ajouter une nouvelle image &.

CONSEIL: L'autorisation de dossier est bonne - car il modifie l'ancien fichier.

SOLUTION PRÉVUE DU PROBLÈME: Comment la nouvelle entrée? au lieu d'éditer/mettre à jour.!

User.php

namespace Application\Sonata\UserBundle\Entity; 
// all use ... i deleted to reduce lines 
/** 
* @ORM\Table(name="fos__user_user") 
* @ORM\Entity() 
* @ORM\HasLifecycleCallbacks() 
* @Assert\Callback(methods={ "isMediaSizeValid" }) 
*/ 
class User extends BaseUser { 

/** 
* @var string 
* 
* @ORM\OneToOne(targetEntity="Application\Sonata\MediaBundle\Entity\Media",cascade={"persist"}) 
* @ORM\JoinColumns({ @ORM\JoinColumn(referencedColumnName="id", onDelete="CASCADE") }) 
* @Assert\NotNull() 
*/ 
private $profilePicture; 

// generated getter and setter 
    public function setProfilePicture(\Application\Sonata\MediaBundle\Entity\Media $profilePicture = null) { 
    $this->profilePicture = $profilePicture; 
    return $this; 
    } 
    public function getProfilePicture() { 
    return $this->profilePicture; 
    } 

    public function isMediaSizeValid(ExecutionContextInterface $context) { 
    $this->fzValidateImage($context, $this->getProfilePicture()); 
    } 

    private function fzValidateImage($context, $f) { 
    if ($f == NULL) { 
     // IMAGE can be null . If null it uses the default image    
    } else if ($f->getSize() > (self::FILE_SIZE * 1024)) { 
     $context->buildViolation('The file is too large (%a% kb). Allowed maximum size is %b% kb.')->atPath(self::FILE_PATH)->setParameters(['%a%' => intval($f->getSize()/1024), '%b%' => self::FILE_SIZE])->addViolation(); 
    } else if ($f->getWidth() < self::FILE_MIN_WIDTH) { 
     $context->buildViolation('The image width is too small (%a% px). Minimum width expected is %b% px.')->atPath(self::FILE_PATH)->setParameters(['%a%' => $f->getWidth(), '%b%' => self::FILE_MIN_WIDTH])->addViolation(); 
    } else if ($f->getWidth() > self::FILE_MAX_WIDTH) { 
     $context->buildViolation('The image width is too big (%a% px). Allowed maximum width is %b% px.')->atPath(self::FILE_PATH)->setParameters(['%a%' => $f->getWidth(), '%b%' => self::FILE_MAX_WIDTH])->addViolation(); 
    } else if ($f->getHeight() < self::FILE_MIN_HEIGHT) { 
     $context->buildViolation('The image height is too small (%a% px). Minimum height expected is %b% px.')->atPath(self::FILE_PATH)->setParameters(['%a%' => $f->getHeight(), '%b%' => self::FILE_MIN_HEIGHT])->addViolation(); 
    } else if ($f->getHeight() > self::FILE_MAX_HEIGHT) { 
     $context->buildViolation('The image height is too big (%a% px). Allowed maximum height is %b% px.')->atPath(self::FILE_PATH)->setParameters(['%a%' => $f->getHeight(), '%b%' => self::FILE_MAX_HEIGHT])->addViolation(); 
    } 
    } 
} 

UserController.php Type 1

/** 
    * @Route("/profile/edit", name="fz_user_profile_edit") 
    */ 
    public function editProfileAction(Request $request) { 
     $form = $this->get('sonata.user.profile.form'); 
     $form->add('profilePicture', 'sonata_media_type', array(
      'provider' => 'sonata.media.provider.image', 
      'context' => 'profile' 
     )); 
     $form->get('profilePicture')->add('binaryContent', 'file', ['label' => 'Profile Picture']); 
     $form->get('profilePicture')->remove('unlink'); 
     $formHandler = $this->get('sonata.user.profile.form.handler'); 

     $process = $formHandler->process($user); 
     if ($process) { 
      $this->setFlash('notice', 'Profile updated!'); 
      return $this->redirectToRoute('fz_user'); 
     } 
     $x = ['cmf' => '', 'pTitle' => 'Profile']; 
     return $this->render('user/layout.html.twig', ['x' => $x, 'form' => $form->createView()]); 

UserController.php de type 2

/** 
* @Route("/profile/edit", name="fz_user_profile_edit") 
*/ 
public function editProfileAction(Request $request) { 
    $user = $this->getUser(); 
    if (!is_object($user) || !$user instanceof UserInterface) { 
     throw $this->createAccessDeniedException('This user does not have access to this section.'); 
    } 
    $builder = $this->createFormBuilder($user); 
    $builder->add('profilePicture', 'sonata_media_type', array(
     'provider' => 'sonata.media.provider.image', 
     'context' => 'profile' 
    )); 
    $form = $builder->getForm(); 
    $form->handleRequest($request); 
    if ($form->isSubmitted() && $form->isValid()) { 
     $em = $this->getDoctrine()->getManager(); 
     $em->persist($user); 
     $em->flush(); 
     $this->setFlash('notice', 'Profile updated!'); 
    } 

    $x = ['cmf' => '', 'pTitle' => 'Profile']; 
    return $this->render('user/layout.html.twig', ['x' => $x, 'form' => $form->createView()]); 
} 

Type UserController.php 1 - code est en utilisant FOSUserBu ndle. et UserController.php tapez 2 mon code personnalisé pour doc symfony ..

+0

new_on_update => false, remplace le pouce et ajoute un nouveau fichier de référence. Mais il n'a pas réussi à supprimer l'ancien média de référence dans le dossier. Dans Admin, l'entité média est remplacée (bon). Du document multimédia de sonata https://sonata-project.org/bundles/media/master/doc/reference/form.html. Le nouveau problème est: L'ancien fichier de référence, n'est pas supprimé. –

Répondre

0

J'ai résolu pour l'instant en vérifiant le fichier et supprimer. Je pense que c'est une erreur de bundle.

public function editProfileAction() { 
    $user = $this->getUser(); 
    if (!is_object($user) || !$user instanceof UserInterface) { 
     throw $this->createAccessDeniedException('This user does not have access to this section.'); 
    } 
    // Check user has allready media? 
    $om = $this->getUser()->getProfilePicture(); 
    $oldPath = $om ? $this->getMediaPath($om->getId()) : NULL; 
    $form = $this->creteForm(); 
    $formHandler = $this->get('sonata.user.profile.form.handler'); 
    $process = $formHandler->process($user); 
    if ($process) { 
     // if new file - delete old file 
     $this->deleteOldMedia($om, $oldPath); 
     $this->setFlash('notice', 'Profile updated!'); 
     return $this->redirectToRoute('fz_user'); 
    } 
    $x = ['cmf' => '', 'pTitle' => 'Profile']; 
    return $this->render('user/layout.html.twig', ['x' => $x, 'form' => $form->createView()]); 
} 

private function getMediaPath($id) { 
    $mm = $this->container->get('sonata.media.manager.media'); 
    $pr = $this->container->get('sonata.media.provider.image'); 
    $media = $mm->findOneBy(['id' => $id]); 
    $format = $pr->getFormatName($media, 'reference'); 
    return $pr->generatePublicUrl($media, $format); 
} 

protected function creteForm() { 
    $form = $this->get('sonata.user.profile.form'); 
    $form->add('profilePicture', 'sonata_media_type', array(
     'provider' => 'sonata.media.provider.image', 
     'context' => 'profile', 
     'new_on_update' => FALSE 
    )); 
    $form->get('profilePicture')->add('binaryContent', 'file', ['label' => 'Profile Picture', 'required' => FALSE]); 
    $form->get('profilePicture')->remove('unlink'); 
    return $form; 
} 

private function deleteOldMedia($om, $oldPath) { 
    if ($om) { 
     $newPath = $this->getMediaPath($this->getUser()->getProfilePicture()->getId()); 
     if ($newPath && ($oldPath != $newPath)) { 
      $dir = $this->container->getParameter('kernel.root_dir'); 
      $file = $dir . '/../public_html/' . $oldPath; 
      $i = file_exists($file) ? unlink($file) : NULL; 
      return $i; 
     } 
    } 
}