2013-05-19 7 views

Odpowiedz

10

Ale jeśli nie chcesz, aby uczynić media tam i po prostu przechowywać url w zmiennej, trzeba zwrócić się do dostawcy mediów dla url publicznego. To był mój przypadek, że musiałem przekazać URL do innego szablonu. Zrobiłem to tworząc niestandardową funkcję w moim rozszerzeniu Twig (patrz tutaj: http://symfony.com/doc/current/cookbook/templating/twig_extension.html).

Pod warunkiem, że masz pojemnik dostępne w usłudze Przedłużacz z $this->container, można zrobić tak:

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

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

zarejestrować funkcję w aparacie:

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

I nazwać swój nowy pomocnika utwórz szablon:

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

na przykład

pozdrowienia

3

Od użytkownika @ javigzz odpowiedź nie dla mnie, tutaj jest rozszerzeniem gałązka, która współpracuje z najnowszą wersją 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 } 

Użycie będzie takie samo:

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

Po prostu dodałem to na GitHub: https://github.com/SocialbitGmbH/SonataMediaTwigExtensionBundle –

0

Można użyć: {% path media, 'reference' %}

@Blauesocke - próbował swoje rozwiązanie i miał dokładnie ten sam wynik dla pliku proviser z wykorzystaniem zarówno

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

i

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

@ javigzz jest doskonały w Przypadek domyślnego kontekstu. Użyłem niestandardowego kontekstu, więc musiałem obsłużyć format $ najpierw biorąc pod uwagę nazwę kontekstu:

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