Magento2: Obter URL da mídia no arquivo de modelo (sem chamar o Gerenciador de objetos de chamada direta)

17

Como entrar Media URLno arquivo de modelo? Toda a solução que encontrei está chamando o Object Manager diretamente. Outra preocupação: você pode chamar o gerenciador de objetos diretamente como melhor prática? (porque na maioria das soluções eles estão usando o gerenciador de objetos)

Vishwas Bhatnagar
fonte

Respostas:

25

Você pode obter o URL da mídia no seu arquivo de modelo usando o caminho abaixo, mas sem usar o gerenciador de objetos, é necessário definir o arquivo de bloqueio com o __construct()método com define storeManagerInterface no método de construção.

No seu arquivo de bloco phtml, crie a função __construct.

public $ _storeManager;

public function __construct(\Magento\Store\Model\StoreManagerInterface $storeManager)
{
       $this->_storeManager = $storeManager;
}

No seu arquivo phtml, chame o método abaixo para obter mediaurl,

$mediaUrl = $this ->_storeManager-> getStore()->getBaseUrl(\Magento\Framework\UrlInterface::URL_TYPE_MEDIA );

echo $ mediaUrl;

Esta é a maneira correta de obter URLs de mídia no Magento 2.

Rakesh Jesadiya
fonte
4
Eu acho que seria muito melhor para fazer essa variável protegida e criar um método getter para recuperar a mídia URL em vez
Raphael em Digital pianismo
Se o seu bloco for extendido \Magento\Framework\View\Element\Template, você já possui uma instância de StoreManagerInterface( $this->_storeManager).
Erfan
Recebi o URL da mídia. Mas preciso exibir a imagem correspondente a esse URL ... Se você souber, me ajude a resolver o meu problema. Consulte o link abaixo magento.stackexchange.com/questions/201961/…
Jaisa 18/17/17
14

A partir da versão 2.1, não há maneira direta de obter o URL da mídia sem:

  • chamando o gerenciador de objetos diretamente (não faça isso)
  • substituir o bloco e adicionar um novo método

Rakesh mencionou uma maneira de fazê-lo.

Outra maneira é usar a variável protegida $_urlBuilderincluída em cada bloco, conforme definido em AbstractBlock: https://github.com/magento/magento2/blob/f2d309a88298886460351c04973a4ff95c7a91c0/lib/internal/Magento/Framework/View/Element/AbstractBlock.php # L186

Portanto, você não precisa modificar o construtor do seu bloco e pode simplesmente adicionar o seguinte método:

public function getMediaUrl() {
    return $this->_urlBuilder->getBaseUrl(['_type' => UrlInterface::URL_TYPE_MEDIA]);
}

Em seu modelo, você pode ligar para:

$block->getMediaUrl();
Raphael na Digital Pianism
fonte
4
Eu acho absurdo que eu não possa recuperar o caminho da mídia em .phtml diretamente.
21917 LucScu
@ LucScu pode ser desencorajado, com certeza. Provavelmente, não é a melhor idéia para fazer referência a um ativo que foi enviado e que não faz parte da base de código. Parece um pouco desagradável fazê-lo.
Erfan
7

Se você não quiser estender o \ Magento \ Framework \ View \ Element \ Template e desejar que o arquivo .phtml use o bloco \ Magento \ Framework \ View \ Element \ Template, poderá usar este atalho:

$this->helper('Magento\Cms\Helper\Wysiwyg\Images')->getBaseUrl()
kig
fonte
Usar $ this-> helper () em arquivos PHTML está obsoleto e desanimado
Vishwas Bhatnagar
5

Vou usar a resposta de Raphael e estendê-la - mas, em vez de adicionar o método à classe de bloco, por que não criar um auxiliar e adicioná-lo lá?

Comece criando um novo módulo da maneira usual e, dentro da raiz, crie uma nova pasta chamada "Helper" e adicione o código necessário:

namespace YourSite\YourModule\Helper;
use Magento\Framework\UrlInterface;
class Url extends \Magento\Framework\App\Helper\AbstractHelper
{
    public function getMediaPath() {
        return $this->_urlBuilder->getBaseUrl(['_type' => UrlInterface::URL_TYPE_MEDIA]);
    }

}

Depois de ativado e compilado, você poderá usá-lo em seu arquivo de modelo usando o seguinte método:

<?php $url = $this->helper('\YourSite\YourModule\Helper\Url'); ?>
<img src="<?php echo $url->getMediaPath() ?>wysiwyg/image.jpg" />

Espero que você (e potencialmente outros) achem isso de grande utilidade!

Smithee
fonte
Usar $ this-> helper () em arquivos PHTML está obsoleto e desanimado
Vishwas Bhatnagar
1

Pelo menos no 2.2.6, você pode usar Magento\Framework\UrlInterface::getDirectUrl()

    protected function buildMediaUrl($path)
    {
        return $this->urlBuilder->getDirectUrl( $path, ['_type' => UrlInterface::URL_TYPE_MEDIA]);
    }
Vadim Kusakin
fonte