2013-05-19 77 views

回答

10

但是,如果你不希望呈現媒體就在那裏,只是存儲URL中的變量,你需要問媒體提供商的公開網址。 這是我的情況,我需要將url傳遞給另一個模板。 我做了它在我的樹枝延伸中創建自定義功能(請參閱:http://symfony.com/doc/current/cookbook/templating/twig_extension.html)。

前提是你有可用的容器與$this->container你的推廣服務,你可以這樣做:

public function getMediaPublicUrl($media, $format) 
{ 
    $provider = $this->container->get($media->getProviderName()); 

    return $provider->generatePublicUrl($media, $format); 
} 

註冊的擴展功能:

public function getFunctions() { 
    .... 
    'media_public_url' => new \Twig_Function_Method($this, 'getMediaPublicUrl'), 
    .... 
    ); 
} 

,並致電新幫手形成您的模板:

{% set img_url = media_public_url(media, 'small') %} 

例如

問候

3

自@ javigzz的答案沒有工作對我來說,這裏是一個樹枝延伸,與最新版本的sonata_media作品:

namespace Socialbit\SonataMediaTwigExtensionBundle\Twig; 

use Sonata\CoreBundle\Model\ManagerInterface; 
use Symfony\Component\DependencyInjection\Container; 

Class: 
/** 
* Description of MediaPathExtension 
* 
* @author thomas.kekeisen 
*/ 
class MediaPathExtension extends \Twig_Extension 
{ 
    /** 
    * 
    * @var type Container 
    */ 
    protected $container; 

    /** 
    * 
    * @var type ManagerInterface 
    */ 
    protected $mediaManager; 

    public function __construct(Container $container, $mediaManager) 
    { 
     $this->container = $container; 
     $this->mediaManager = $mediaManager; 
    } 

    public function getFunctions() 
    { 
     return array 
     (
      'media_public_url' => new \Twig_Function_Method($this, 'getMediaPublicUrl') 
     ); 
    } 

    /** 
    * @param mixed $media 
    * 
    * @return null|\Sonata\MediaBundle\Model\MediaInterface 
    */ 
    private function getMedia($media) 
    { 
     $media = $this->mediaManager->findOneBy(array(
      'id' => $media 
     )); 

     return $media; 
    } 

    public function getMediaPublicUrl($media, $format) 
    { 
     $media = $this->getMedia($media); 

     $provider = $this->container->get($media->getProviderName()); 

     return $provider->generatePublicUrl($media, $format); 
    } 

    public function getName() 
    { 
     return 'SocialbitSonataMediaTwigExtensionBundleMediaPathExtension'; 
    } 
} 

services.yml:

services: 
    socialbit.sonatamediatwigextensionbundle.mediapathextension: 
     class: Socialbit\SonataMediaTwigExtensionBundle\Twig\MediaPathExtension 
     public: false 
     arguments: 
      - @service_container 
      - @sonata.media.manager.media 
     tags: 
      - { name: twig.extension } 

使用方法相同:

{% set img_url = media_public_url(media, 'reference') %} 
{{ dump(img_url) }} 
+0

剛剛在GitHub上添加了這個:https://github.com/SocialbitGmbH/SonataMediaTwigExtensionBundle –

0

您可以使用:{% path media, 'reference' %}

@Blauesocke - 想你的解決方案,並具有完全相同的結果文件proviser使用兩個

{% set img_url = media_public_url(media, 'reference') %} 
{{ dump(img_url) }} 

{% path sonata_admin.value, 'reference' %} 
6

@ javigzz的是完美的默認情況下的情況。我使用自定義上下文,所以必須首先考慮上下文名稱來處理$格式:

$provider = $this->container->get($media->getProviderName()); 
$format = $provider->getFormatName($media, $format); 
$url = $provider->generatePublicUrl($media, $format); 
相關問題