2013-05-19 7 views

risposta

10

Ma se non si vuole rendere i mezzi di comunicazione proprio lì e solo memorizzare l'url in una variabile, è necessario chiedere la fornitura di contenuti per l'URL pubblico. Questo era il mio caso, che avevo bisogno di passare l'URL a un altro modello. L'ho creato creando una funzione personalizzata nel mio Twig Extension (vedi qui: http://symfony.com/doc/current/cookbook/templating/twig_extension.html).

A condizione che avete il contenitore a disposizione nel vostro servizio di estensione con $this->container, si può fare in questo modo:

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

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

registrare la funzione nell'estensione:

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

e chiamare il nuovo aiutante modulo:

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

per esempio

riguarda

3

Dal @ di javigzz risposta non ha funzionato per me, ecco un'estensione ramoscello che funziona con l'ultima versione di 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 } 

L'utilizzo sarà lo stesso:

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

Appena aggiunto a GitHub: https://github.com/SocialbitGmbH/SonataMediaTwigExtensionBundle –

0

È possibile utilizzare: {% path media, 'reference' %}

@Blauesocke - provato la soluzione e ha avuto esattamente lo stesso risultato per il file proviser con utilizzando sia

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

e

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

@ javigzz è perfetta in caso di contesto predefinito. Ho usato il contesto personalizzato, quindi ho dovuto gestire il formato $ prima prendendo in considerazione il nome del contesto:

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