Sonata Media Bundle: acces media url

Я использую sonata media bundle.

и мне было интересно, как я могу получить доступ к url-адресу СМИ в twig.
Мне просто нужен url, мне не нужно показывать СМИ.

какие предложения?

5 ответов


вы должны использовать путь СМИ помощник:

{% path media, 'small' %}

В приведенном выше коде media является экземпляром сущности media и small избранный формат.

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


но если вы не хотите отображать носитель прямо там и просто хранить url-адрес в переменной, вам нужно попросить поставщика мультимедиа для общедоступного url-адреса. Это был мой случай, когда мне нужно было передать url-адрес другому шаблону. Я сделал это, создав пользовательскую функцию в моем расширении Twig (см. здесь: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') %}

например

в отношении


@javigzz идеально подходит в случае контекста по умолчанию. Я использовал пользовательский контекст, поэтому сначала должен был обработать $format с учетом имени контекста:

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

поскольку ответ @javigzz не работал для меня, вот расширение twig, которое работает с последней версией 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';
    }
}

услуги.в формате 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) }}

вы можете использовать: {% path media, 'reference' %}

@Blauesocke-попробовал ваше решение и получил точно такой же результат для file proviser с использованием both

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

и

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