2013-11-11 4 views
3

Я использую Sonata Media Bundle с Symfony2.3 в моем проекте. Когда я переопределяю провайдера youtube sonata.media.provider.youtube. Все работает нормально. Никакие ошибки или что-нибудь, но вНет созданных эскизов

/Web/uploads/media 

нет миниатюр не генерируется, но в моей админ панели управления показывают мне:

/uploads/media/default/0001/01/thumb_9_default_small.jpg. 

Я не знаю, как, но когда я не переопределяют sonata.media. provider.youtube затем THUMBNAILS генерируется в

/web/uploads/media/ 

Like:

/web/uploads/media/default/0001/01/thumb_9_default_small.jpg. 

Я не знаю почему?

Вот мой конфигурационный файл, в котором я создаю пользовательский поставщик услуг:

services: 
    sonata.media.provider.youtubecustom: 
      class: %application_sonata_media.youtubecustom_class% 
      tags: 
       - { name: sonata.media.provider } 
      arguments: 
       - sonata.media.provider.youtubecustom 
       - @sonata.media.filesystem.local 
       - @sonata.media.cdn.server 
       - @sonata.media.generator.default 
       - @sonata.media.thumbnail.format 
       - @sonata.media.buzz.browser 
       - @sonata.media.metadata.proxy 

      calls: 
       - [ setTemplates, [ { helper_thumbnail: SonataMediaBundle:Provider:thumbnail.html.twig,helper_view: SonataMediaBundle:Provider:view_youtube.html.twig } ] ] 

parameters: 
    application_sonata_media.youtubecustom_class: Application\Sonata\MediaBundle\Provider\YoutubeCustomProvider 

И SonataMedia.yml:

sonata_media: 
db_driver:  doctrine_orm # | doctrine_mongodb 
default_context: default 
contexts: 
    default: # the default context is mandatory 
     download: 
      mode: http # X-Sendfile | http 
     providers: 
      - sonata.media.provider.youtubecustom 
      #- sonata.media.provider.youtube 
      - sonata.media.provider.image 
      #- sonata.media.provider.file 
      #- sonata.media.provider.vimeo 

     formats: 
      small: { width: 100, quality: 100} 
      big: { width: 820 , quality: 100} 

    news: 
     providers: 
      - sonata.media.provider.image 

     formats: 
      abtract: { width: 100, quality: 100} 
      wide: { width: 820 , quality: 100} 

cdn: 
    server: 
     path: /uploads/media # http://media.sonata-project.org/ 

filesystem: 
    # define where the uploaded file will be stored 
    local: 
     directory: %kernel.root_dir%/../web/uploads/media 
     create:  true 

providers: 
    file: 
     resizer: false 

pixlr: 
    enabled: true 
    referrer: Demo - Sonata Project 

resizer: 
    simple: 
     #mode: outbound 
     mode: inset 
# Enable Doctrine to map the provided entities 
doctrine: 
    orm: 
     entity_managers: 
      default: 
       mappings: 
        ApplicationSonataMediaBundle: ~ 
        #SonataMediaBundle: ~ 

Мой заказ файл провайдер YouTube:

<?php 

namespace Application\Sonata\MediaBundle\Provider; 

use Sonata\MediaBundle\Model\MediaInterface; 
use Symfony\Component\HttpFoundation\RedirectResponse; 
use Gaufrette\Filesystem; 
use Sonata\MediaBundle\CDN\CDNInterface; 
use Sonata\MediaBundle\Generator\GeneratorInterface; 
use Buzz\Browser; 
use Sonata\MediaBundle\Thumbnail\ThumbnailInterface; 
use Sonata\MediaBundle\Metadata\MetadataBuilderInterface; 
use Sonata\MediaBundle\Provider\YouTubeProvider; 

class YoutubeCustomProvider extends YouTubeProvider 
{ 

/* @var boolean */ 
protected $html5; 

/** 
* @param string            $name 
* @param \Gaufrette\Filesystem         $filesystem 
* @param \Sonata\MediaBundle\CDN\CDNInterface     $cdn 
* @param \Sonata\MediaBundle\Generator\GeneratorInterface  $pathGenerator 
* @param \Sonata\MediaBundle\Thumbnail\ThumbnailInterface  $thumbnail 
* @param \Buzz\Browser           $browser 
* @param \Sonata\MediaBundle\Metadata\MetadataBuilderInterface $metadata 
* @param boolean            $html5 
*/ 
public function __construct($name, Filesystem $filesystem, CDNInterface $cdn, GeneratorInterface $pathGenerator, ThumbnailInterface $thumbnail, Browser $browser, MetadataBuilderInterface $metadata = null, $html5 = false) 
{ 
    parent::__construct($name, $filesystem, $cdn, $pathGenerator, $thumbnail, $browser, $metadata); 
    $this->html5 = $html5; 
} 

/** 
* {@inheritdoc} 
*/ 
public function getHelperProperties(MediaInterface $media, $format, $options = array()) 
{ 

    // Override html5 value if $options['html5'] is a boolean 
    if (!isset($options['html5'])) { 
     $options['html5'] = $this->html5; 
    } 

    // documentation : http://code.google.com/apis/youtube/player_parameters.html 

    $default_player_url_parameters = array(

     //Values: 0 or 1. Default is 1. Sets whether the player should load related 
     // videos once playback of the initial video starts. Related videos are 
     // displayed in the "genie menu" when the menu button is pressed. The player 
     // search functionality will be disabled if rel is set to 0. 
     'rel'    => 0, 

     // Values: 0 or 1. Default is 0. Sets whether or not the initial video will autoplay 
     // when the player loads. 
     'autoplay'   => 0, 

     // Values: 0 or 1. Default is 0. In the case of a single video player, a setting of 1 
     // will cause the player to play the initial video again and again. In the case of a 
     // playlist player (or custom player), the player will play the entire playlist and 
     // then start again at the first video. 
     'loop'    => 0, 

     // Values: 0 or 1. Default is 0. Setting this to 1 will enable the Javascript API. 
     // For more information on the Javascript API and how to use it, see the JavaScript 
     // API documentation. 
     'enablejsapi'  => 0, 

     // Value can be any alphanumeric string. This setting is used in conjunction with the 
     // JavaScript API. See the JavaScript API documentation for details. 
     'playerapiid' => null, 

     // Values: 0 or 1. Default is 0. Setting to 1 will disable the player keyboard controls. 
     // Keyboard controls are as follows: 
     //  Spacebar: Play/Pause 
     //  Arrow Left: Jump back 10% in the current video 
     //  Arrow Right: Jump ahead 10% in the current video 
     //  Arrow Up: Volume up 
     //  Arrow Down: Volume Down 
     'disablekb'  => 0, 

     // Values: 0 or 1. Default is 0. Setting to 1 enables the "Enhanced Genie Menu". This 
     // behavior causes the genie menu (if present) to appear when the user's mouse enters 
     // the video display area, as opposed to only appearing when the menu button is pressed. 
     'egm'    => 0, 

     // Values: 0 or 1. Default is 0. Setting to 1 enables a border around the entire video 
     // player. The border's primary color can be set via the color1 parameter, and a 
     // secondary color can be set by the color2 parameter. 
     'border' => 0, 

     // Values: Any RGB value in hexadecimal format. color1 is the primary border color, and 
     // color2 is the video control bar background color and secondary border color. 
     'color1'   => null, 
     'color2'   => null, 

     // Values: 0 or 1. Default is 0. Setting to 1 enables the fullscreen button. This has no 
     // effect on the Chromeless Player. Note that you must include some extra arguments to 
     // your embed code for this to work. 
     'fs'    => 1, 

     // Values: A positive integer. This parameter causes the player to begin playing the video 
     // at the given number of seconds from the start of the video. Note that similar to the 
     // seekTo function, the player will look for the closest keyframe to the time you specify. 
     // This means sometimes the play head may seek to just before the requested time, usually 
     // no more than ~2 seconds 
     'start'    => 0, 

     // Values: 0 or 1. Default is 0. Setting to 1 enables HD playback by default. This has no 
     // effect on the Chromeless Player. This also has no effect if an HD version of the video 
     // is not available. If you enable this option, keep in mind that users with a slower 
     // connection may have an sub-optimal experience unless they turn off HD. You should ensure 
     // your player is large enough to display the video in its native resolution. 
     'hd'    => 1, 

     // Values: 0 or 1. Default is 1. Setting to 0 disables the search box from displaying when 
     // the video is minimized. Note that if the rel parameter is set to 0 then the search box 
     // will also be disabled, regardless of the value of showsearch. 
     'showsearch'  => 0, 

     // Values: 0 or 1. Default is 1. Setting to 0 causes the player to not display information 
     // like the video title and rating before the video starts playing. 
     'showinfo'   => 0, 

     // Values: 1 or 3. Default is 1. Setting to 1 will cause video annotations to be shown by 
     // default, whereas setting to 3 will cause video annotation to not be shown by default. 
     'iv_load_policy' => 1, 

     // Values: 1. Default is based on user preference. Setting to 1 will cause closed captions 
     // to be shown by default, even if the user has turned captions off. 
     'cc_load_policy' => 1, 

     // Values: 'window' or 'opaque' or 'transparent'. 
     // When wmode=window, the Flash movie is not rendered in the page. 
     // When wmode=opaque, the Flash movie is rendered as part of the page. 
     // When wmode=transparent, the Flash movie is rendered as part of the page. 
     'wmode' => 'window' 

    ); 

    $default_player_parameters = array(

     // Values: 0 or 1. Default is 0. Setting to 1 enables a border around the entire video 
     // player. The border's primary color can be set via the color1 parameter, and a 
     // secondary color can be set by the color2 parameter. 
     'border'   => $default_player_url_parameters['border'], 

     // Values: 'allowfullscreen' or empty. Default is 'allowfullscreen'. Setting to empty value disables 
     // the fullscreen button. 
     'allowFullScreen' => $default_player_url_parameters['fs'] == '1' ? true : false, 

     // The allowScriptAccess parameter in the code is needed to allow the player SWF to call 
     // functions on the containing HTML page, since the player is hosted on a different domain 
     // from the HTML page. 
     'allowScriptAccess' => isset($options['allowScriptAccess']) ? $options['allowScriptAccess'] : 'always', 

     // Values: 'window' or 'opaque' or 'transparent'. 
     // When wmode=window, the Flash movie is not rendered in the page. 
     // When wmode=opaque, the Flash movie is rendered as part of the page. 
     // When wmode=transparent, the Flash movie is rendered as part of the page. 
     'wmode' => $default_player_url_parameters['wmode'] 

    ); 

    $player_url_parameters = array_merge($default_player_url_parameters, isset($options['player_url_parameters']) ? $options['player_url_parameters'] : array()); 

    $box = $this->getBoxHelperProperties($media, $format, $options); 

    $player_parameters = array_merge($default_player_parameters, isset($options['player_parameters']) ? $options['player_parameters'] : array(), array(
     'width' => $box->getWidth(), 
     'height' => $box->getHeight() 
    )); 

    $params = array(
     'html5' => $options['html5'], 
     'player_url_parameters' => http_build_query($player_url_parameters), 
     'player_parameters' => $player_parameters 
    ); 

    return $params; 
} 

/** 
* {@inheritdoc} 
*/ 
protected function fixBinaryContent(MediaInterface $media) 
{ 
    if (!$media->getBinaryContent()) { 
     return; 
    } 

    if (preg_match("/(?<=v(\=|\/))([-a-zA-Z0-9_]+)|(?<=youtu\.be\/)([-a-zA-Z0-9_]+)/", $media->getBinaryContent(), $matches)) { 
     $media->setBinaryContent($matches[2]); 
    } 
} 

/** 
* {@inheritdoc} 
*/ 
protected function doTransform(MediaInterface $media) 
{ 
    $this->fixBinaryContent($media); 

    if (!$media->getBinaryContent()) { 
     return; 
    } 

    $media->setProviderName($this->name); 
    $media->setProviderStatus(MediaInterface::STATUS_OK); 
    $media->setProviderReference($media->getBinaryContent()); 

    $this->updateMetadata($media, true); 
} 

/** 
* {@inheritdoc} 
*/ 
public function updateMetadata(MediaInterface $media, $force = false) 
{ 
    $url = sprintf('http://www.youtube.com/oembed?url=http://www.youtube.com/watch?v=%s&format=json', $media->getProviderReference()); 

    try { 
     $metadata = $this->getMetadata($media, $url); 
    } catch (\RuntimeException $e) { 
     $media->setEnabled(false); 
     $media->setProviderStatus(MediaInterface::STATUS_ERROR); 

     return; 
    } 

    $media->setProviderMetadata($metadata); 

    if ($force) { 
     $media->setName($metadata['title']); 
     $media->setAuthorName($metadata['author_name']); 
    } 

    $media->setHeight($metadata['height']); 
    $media->setWidth($metadata['width']); 
    $media->setContentType('video/x-flv'); 
} 

/** 
* {@inheritdoc} 
*/ 
public function getDownloadResponse(MediaInterface $media, $format, $mode, array $headers = array()) 
{ 
    return new RedirectResponse(sprintf('http://www.youtube.com/watch?v=%s', $media->getProviderReference()), 302, $headers); 
} 

} 

И по умолчанию youtube-сервис, созданный Sonata Media Bundle, который я переопределяю:

 <service id="sonata.media.provider.youtube" class="%sonata.media.provider.youtube.class%"> 
     <tag name="sonata.media.provider" /> 
     <argument>sonata.media.provider.youtube</argument> 
     <argument /> 
     <argument /> 
     <argument /> 
     <argument type="service" id="sonata.media.thumbnail.format" /> 
     <argument type="service" id="sonata.media.buzz.browser" /> 
     <argument type="service" id="sonata.media.metadata.proxy" /> 
     <argument /> 
     <call method="setTemplates"> 
      <argument type="collection"> 
       <argument key='helper_thumbnail'>SonataMediaBundle:Provider:thumbnail.html.twig</argument> 
       <argument key='helper_view'>SonataMediaBundle:Provider:view_youtube.html.twig</argument> 
      </argument> 
     </call> 
    </service> 

Мой поставщик услуг такой же, как и поставщик youtube по умолчанию.

ответ

6

Такое же имя службы и имя поставщика пишут в нашем пакете, после чего проблема решена.

Как если бы вы расширили YoutubeProvider, то то же имя провайдера запишет в ваш комплект.

Смотреть это:

Мой config.yml

services: 

    sonata.media.provider.youtube: 
      class: %application_sonata_media.youtube_class% 
      tags: 
       - { name: sonata.media.provider } 
      arguments: 
       - sonata.media.provider.youtube 
       - @sonata.media.filesystem.local 
       - @sonata.media.cdn.server 
       - @sonata.media.generator.default 
       - @sonata.media.thumbnail.format 
       - @sonata.media.buzz.browser 
       - @sonata.media.metadata.proxy 

      calls: 
       - [ setTemplates, [ { helper_thumbnail: SonataMediaBundle:Provider:thumbnail.html.twig,helper_view: SonataMediaBundle:Provider:view_youtube.html.twig } ] ] 

parameters: 
    application_sonata_media.youtube_class: Application\Sonata\MediaBundle\Provider\YoutubeProvider 

Мои YoutubeProvider.php

<?php 

namespace Application\Sonata\MediaBundle\Provider; 

use Symfony\Component\HttpFoundation\RedirectResponse; 
use Gaufrette\Filesystem; 
use Sonata\MediaBundle\CDN\CDNInterface; 
use Sonata\MediaBundle\Generator\GeneratorInterface; 
use Buzz\Browser; 
use Sonata\MediaBundle\Thumbnail\ThumbnailInterface; 
use Sonata\MediaBundle\Metadata\MetadataBuilderInterface; 
use Sonata\MediaBundle\Provider\YouTubeProvider as MainYouTubeProvider; 
use Sonata\AdminBundle\Form\FormMapper; 
use Symfony\Component\Form\FormBuilder; 
use Symfony\Component\Validator\Constraints\NotBlank; 
use Symfony\Component\Validator\Constraints\NotNull; 
use Sonata\MediaBundle\Model\MediaInterface; 

class YoutubeProvider extends MainYouTubeProvider 
{ 
    //write provider functions 
} 
+0

У меня точно такая же проблема. Можете ли вы уточнить свой ответ? Благодарю. – repincln

+0

@repincln см. Мой отредактированный ответ. – Sid

+0

Кунвар Сиддхарт Сингх, спасибо. Работает как шарм! Я потрачу много времени на эту проблему, прежде чем вы отредактируете свой ответ. Еще раз спасибо. – repincln

0

Это не самый лучший способ, чтобы переопределить вендоров услуг полностью - это может не сработать.

В этом случае есть некоторые распространенные практики (http://symfony.com/doc/current/cookbook/bundles/override.html#services-configuration).

Если вы хотите просто переопределить класс поставщиков и не изменять определение сервиса, вам нужно изменить значение параметра sonata.media.provider.youtube.class.

Если вы хотите переопределить часть услуг поставщиков (звонки, теги и т. Д.), Лучше используйте CompilerPass.

namespace Acme\DemoBundle\DependencyInjection\Compiler; 

use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface; 
use Symfony\Component\DependencyInjection\ContainerBuilder; 

class OverrideServiceCompilerPass implements CompilerPassInterface 
{ 
    public function process(ContainerBuilder $container) 
    { 
     $definition = $container->getDefinition('sonata.media.provider.youtube'); 
     $definition->addTag($name, $attributes); 
    } 

}