2013-05-19 11 views

Antwort

10

Aber wenn man die Medien nicht genau dort machen wollen und speichern Sie einfach die URL in einer Variablen, müssen Sie die Medien für die öffentliche URL fragen. Das war mein Fall, dass ich die URL zu einer anderen Vorlage übergeben musste. Ich habe es geschafft, eine benutzerdefinierte Funktion in meiner Zweig-Erweiterung zu erstellen (siehe hier: http://symfony.com/doc/current/cookbook/templating/twig_extension.html).

vorausgesetzt, dass Sie den Container in Ihrem Beratungsdienst mit $this->container haben, können Sie wie folgt tun:

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

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

die Funktion in der Verlängerung registrieren:

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

Und Ihre neue Helfer rufen Bilden Sie Ihre Vorlage:

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

zum Beispiel

Grüße

3

Seit Antwort @ javigzz ist nicht für mich arbeiten, hier ist ein Zweig-Erweiterung, die mit der neuesten Version von sonata_media funktioniert:

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 } 

Die Verwendung wird die gleiche sein:

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

Ich habe es einfach auf GitHub hinzugefügt: https://github.com/SocialbitGmbH/SonataMediaTwigExtensionBundle –

0

Sie verwenden können: {% path media, 'reference' %}

@Blauesocke - versucht, Ihre Lösung und hatte genau das gleiche Ergebnis für Datei proviser mit sowohl mit

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

und

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

@ javigzz das ist perfekt in Fall des Standardkontextes. Ich verwendete benutzerdefinierten Kontext, musste also $ format zuerst unter Berücksichtigung des Kontextnamens behandeln: