Sonata Media Bundle:访问媒体网址

时间:2013-05-19 17:48:14

标签: symfony twig sonata-admin

我正在使用sonata media bundle

我想知道如何在树枝上访问媒体网址 我只想要网址,我不需要向媒体展示。

有什么建议吗?

5 个答案:

答案 0 :(得分:15)

您必须使用路径媒体助手:

{% path media, 'small' %}

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

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

答案 1 :(得分:11)

但是如果你不想在那里渲染媒体并且只是将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') %}
例如

问候

答案 2 :(得分:6)

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

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

答案 3 :(得分:4)

由于@ 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 :(得分:2)

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

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

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

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