2017-08-08 124 views
0

我正在使用Sonata Admin后端,我想将新图像字段添加到我的用户实体(这是一个化身)。既然我已经使用了SonataMediaBundle我跟着这个教程:https://sonata-project.org/blog/2013/10/11/mediabundle-mediatype-improvedSonata Admin Image字段

这里是我的实体配置:

/** 
* @var \Application\Sonata\MediaBundle\Entity\Media 
* 
* @ORM\ManyToOne(targetEntity="Application\Sonata\MediaBundle\Entity\Media", cascade={"all"}, fetch="LAZY") 
* @ORM\JoinColumn(name="avatar_id", referencedColumnName="id") 
*/ 
protected $avatar; 

不幸的是我有很多问题:

  1. 在我的后端的预览未显示: enter image description here
  2. 如果我删除图库中的媒体,编辑用户时收到此错误:Entity of type 'Application\Sonata\MediaBundle\Entity\Media' for IDs id(6) was not found
  3. 所得API(与FOSRestBundle生成)是由客户机不可用:
"avatar": { 
     "provider_metadata": { 
      "filename": "Test.png" 
     }, 
     "name": "Test.png", 
     "description": null, 
     "enabled": false, 
     "provider_name": "sonata.media.provider.image", 
     "provider_status": 1, 
     "provider_reference": "325564b03489a6473e7c9def01dc58bab611eccb.png", 
     "width": 1430, 
     "height": 321, 
     "length": null, 
     "copyright": null, 
     "author_name": null, 
     "context": "default", 
     "cdn_is_flushable": null, 
     "cdn_flush_at": null, 
     "cdn_status": null, 
     "updated_at": "2017-08-08T12:31:19+02:00", 
     "created_at": "2017-08-08T12:31:19+02:00", 
     "content_type": "image/png", 
     "size": 24978, 
     "id": 7 
    } 

感谢。

回答

0

我解决了所有3个问题!我为所有遇到同样困难的人们提供了解决方案。

  1. 在我的后端预览没有显示:

由于esplained here我有一个自定义表单控件添加到我的config.yml文件:

twig: 
    # Sonata form themes 
    form_themes: 
     - 'SonataMediaBundle:Form:media_widgets.html.twig' 

并在我的UserAdmin

->with('Profile') 
    ->add('avatar', 'sonata_media_type', array(
     'provider' => 'sonata.media.provider.image', 
     'context' => 'default', 
    )) 
->end() 

现在预览将显示:)

  • 如果删除在画廊我编辑用户当收到此错误的媒体: 类型的实体“应用程序\索纳塔\ MediaBundle \实体\媒体”的标识ID(6)不 发现
  • 正如解释here我需要在我的实体添加onDelete="SET NULL"

    /** 
    * @var \Application\Sonata\MediaBundle\Entity\Media 
    * 
    * @ORM\ManyToOne(targetEntity="Application\Sonata\MediaBundle\Entity\Media", cascade={"persist"}, fetch="LAZY") 
    * @ORM\JoinColumn(name="avatar_id", referencedColumnName="id", onDelete="SET NULL") 
    */ 
    protected $avatar; 
    
  • (与FOSRestBundle产生)将所得的API是由所述客户端不可用:
  • 这一次是非常棘手,但我能够实现自定义的JMS处理程序从this开始。

    我偷看进SonataMediaBundle源代码,我发现这个片断:

    /** 
    * Returns media urls for each format. 
    * 
    * @ApiDoc(
    * requirements={ 
    *  {"name"="id", "dataType"="integer", "requirement"="\d+", "description"="media id"} 
    * }, 
    * statusCodes={ 
    *  200="Returned when successful", 
    *  404="Returned when media is not found" 
    * } 
    *) 
    * 
    * @param $id 
    * 
    * @return array 
    */ 
    public function getMediumFormatsAction($id) 
    { 
        $media = $this->getMedium($id); 
    
        $formats = array(MediaProviderInterface::FORMAT_REFERENCE); 
        $formats = array_merge($formats, array_keys($this->mediaPool->getFormatNamesByContext($media->getContext()))); 
    
        $provider = $this->mediaPool->getProvider($media->getProviderName()); 
    
        $properties = array(); 
        foreach ($formats as $format) { 
         $properties[$format]['url'] = $provider->generatePublicUrl($media, $format); 
         $properties[$format]['properties'] = $provider->getHelperProperties($media, $format); 
        } 
    
        return $properties; 
    } 
    

    所以我把它变成我的源和完整的处理程序如下:

    <?php 
    
    namespace AppBundle\Serializer; 
    
    use Application\Sonata\MediaBundle\Entity\Media; 
    use JMS\Serializer\Context; 
    use JMS\Serializer\GraphNavigator; 
    use JMS\Serializer\Handler\SubscribingHandlerInterface; 
    use JMS\Serializer\JsonSerializationVisitor; 
    use Sonata\MediaBundle\Provider\MediaProviderInterface; 
    
    class MediaHandler implements SubscribingHandlerInterface 
    { 
        private $mediaPool; 
    
        public function __construct($mediaPool) 
        { 
         $this->mediaPool = $mediaPool; 
        } 
    
        public static function getSubscribingMethods() 
        { 
         return array(
          array(
           'direction' => GraphNavigator::DIRECTION_SERIALIZATION, 
           'format' => 'json', 
           'type'  => 'Application\Sonata\MediaBundle\Entity\Media', 
           'method' => 'serializeToJson', 
          ), 
         ); 
        } 
    
        public function serializeToJson(JsonSerializationVisitor $visitor, Media $media, array $type, Context $context) 
        { 
         $formats = array(MediaProviderInterface::FORMAT_REFERENCE); 
         $formats = array_merge($formats, array_keys($this->mediaPool->getFormatNamesByContext($media->getContext()))); 
    
         $provider = $this->mediaPool->getProvider($media->getProviderName()); 
    
         $properties = array(); 
         foreach ($formats as $format) { 
          $properties[$format]['url']  = $provider->generatePublicUrl($media, $format); 
          $properties[$format]['properties'] = $provider->getHelperProperties($media, $format); 
         } 
    
         return $properties; 
        } 
    } 
    

    服务设置:

    app.serializer.media: 
        class: AppBundle\Serializer\MediaHandler 
        arguments: 
         - '@sonata.media.pool' 
        tags: 
         - { name: jms_serializer.subscribing_handler } 
    

    这就是全部!

    相关问题