2013-05-19 14 views

Trả lời

10

Nhưng nếu bạn không muốn làm cho giới truyền thông ngay lập tức và chỉ lưu trữ các url trong một biến, bạn cần phải hỏi nhà cung cấp phương tiện truyền thông cho các url công cộng. Đây là trường hợp của tôi, rằng tôi cần phải chuyển url tới một mẫu khác. Tôi đã làm nó tạo ra một chức năng tùy chỉnh trong phần mở rộng Twig của tôi (xem ở đây: http://symfony.com/doc/current/cookbook/templating/twig_extension.html).

Với điều kiện là bạn có chứa sẵn trong dịch vụ mở rộng của bạn với $this->container, bạn có thể làm như thế này:

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

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

đăng ký chức năng trong phần mở rộng:

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

Và gọi helper mới của bạn tạo mẫu của bạn:

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

ví dụ

liên quan

3

Kể từ khi câu trả lời @ javigzz đã không làm việc cho tôi, đây là một phần mở rộng cành lá làm việc với phiên bản mới nhất của 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 } 

Cách sử dụng sẽ giống nhau:

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

Chỉ cần thêm phần này vào GitHub: https://github.com/SocialbitGmbH/SonataMediaTwigExtensionBundle –

0

Bạn có thể sử dụng: {% path media, 'reference' %}

@Blauesocke - cố gắng giải pháp của bạn và có chính xác kết quả tương tự cho file proviser với việc sử dụng cả hai

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

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

@ javigzz là hoàn hảo trong trường hợp ngữ cảnh mặc định. Tôi đã sử dụng bối cảnh tùy chỉnh, do đó, trước tiên phải xử lý định dạng $ có tính đến tên ngữ cảnh:

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