【问题标题】:Sonata Media Bundle : acces media urlSonata Media Bundle:访问媒体网址
【发布时间】:2013-05-14 07:24:09
【问题描述】:

我正在使用sonata media bundle

我想知道如何访问 twig 中的媒体网址。
我只想要网址,不需要展示媒体。

有什么建议吗?

【问题讨论】:

标签: symfony twig sonata-admin


【解决方案1】:

@javigzz 在默认上下文的情况下是完美的。我使用了自定义上下文,因此必须首先处理 $format 并考虑上下文名称:

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

补充说明

由于注入容器不是最佳实践,最好从提供者池中获取提供者:

class Foo {
    public function __construct(Sonata\MediaBundle\Provider\Pool $pool) {
        $this->pool = $pool;
    }

    public function getUrl($media, $format) {
        $provider = $this->pool->getProvider($media->getProviderName());
        $format = $provider->getFormatName($media, $format);
        $url = $provider->generatePublicUrl($media, $format);

        return $url;
    }
}

【讨论】:

    【解决方案2】:

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

    @Blauesocke - 尝试了您的解决方案,文件提供者使用两者的结果完全相同

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

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

    【讨论】:

      【解决方案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) }}
      

      【讨论】:

      【解决方案4】:

      但是,如果您不想在此处渲染媒体而只是将 url 存储在变量中,则需要向媒体提供者询问公共 url。 这是我的情况,我需要将 url 传递给另一个模板。 我在我的 Twig Extension 中创建了一个自定义函数(参见此处: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') %}
      

      例如

      问候

      【讨论】:

        【解决方案5】:

        您必须使用 path 媒体助手:

        {% path media, 'small' %}
        

        在上面的代码中,media 是媒体实体的一个实例,small 是选择的格式。

        http://sonata-project.org/bundles/media/master/doc/reference/helpers.html#twig-usage

        【讨论】:

          猜你喜欢
          • 2016-04-24
          • 2016-01-05
          • 2016-09-03
          • 2016-11-28
          • 1970-01-01
          • 2014-03-31
          • 2018-01-16
          • 2014-09-06
          • 2016-09-28
          相关资源
          最近更新 更多