Magento2: Obtener URL de medios en archivo de plantilla (sin el Administrador de objetos de llamada directa)

17

¿Cómo Media URLacceder al archivo de plantilla? Toda la solución que encontré está llamando directamente a Object Manager. Mi otra preocupación, ¿puedes llamar al administrador de objetos directamente como mejor práctica? (porque en la mayoría de las soluciones están usando el administrador de objetos)

Vishwas Bhatnagar
fuente

Respuestas:

25

Puede obtener la URL de medios en su archivo de plantilla usando la forma siguiente, pero sin usar objectmanager debe tener que definir el archivo de bloque con el __construct()método con define storeManagerInterface en el método de construcción.

En su archivo de bloque phtml cree la función __construct.

public $ _storeManager;

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

En su archivo phtml, llame al método siguiente para obtener mediaurl,

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

echo $ mediaUrl;

Esta es la forma correcta de obtener URL de medios en Magento 2.

Rakesh Jesadiya
fuente
44
Creo que sería mucho mejor proteger esa variable y crear un método getter para recuperar la url de los medios
Raphael en Digital Pianism
Si su bloqueo se extiende desde \Magento\Framework\View\Element\Template, ya tiene una instancia de StoreManagerInterface( $this->_storeManager).
Erfan
Tengo url de medios. Pero necesito mostrar la imagen correspondiente a esa url ... Si sabes, ayúdame a resolver mi problema. Consulte el siguiente enlace magento.stackexchange.com/questions/201961/…
Jaisa
14

A partir de 2.1, no hay forma directa de obtener la URL de los medios sin:

  • llamando al administrador de objetos directamente (por favor no hagas eso)
  • anular el bloque y agregar un nuevo método

Rakesh mencionó una forma de hacerlo.

Otra forma es usar la variable protegida $_urlBuilder que se incluye para cada bloque como se define en AbstractBlock: https://github.com/magento/magento2/blob/f2d309a88298886460351c04973a4ff95c7a91c0/lib/internal/Magento/Framework/View/Element/AbstractBlock.php # L186

Por lo tanto, no tiene que modificar el constructor de su bloque y simplemente puede agregar el siguiente método:

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

Luego, en su plantilla puede llamar:

$block->getMediaUrl();
Raphael en Digital Pianism
fuente
44
Creo que es absurdo que no pueda recuperar la ruta de medios directamente en .phtml.
LucScu
@LucScu podría desanimarse, seguro. Probablemente no sea la mejor idea para hacer referencia a un activo que se ha cargado y que no forma parte de la base de código. Se siente un poco desagradable hacerlo.
Erfan
7

Si no desea tomarse la molestia de extender \ Magento \ Framework \ View \ Element \ Template, y desea que su archivo .phtml use el bloque \ Magento \ Framework \ View \ Element \ Template, entonces puede usar este atajo:

$this->helper('Magento\Cms\Helper\Wysiwyg\Images')->getBaseUrl()
Kig
fuente
Usar $ this-> helper () en archivos PHTML está en desuso y desaconsejado
Vishwas Bhatnagar
5

Usaré la respuesta de Raphael y la extenderé, pero en lugar de agregar el método a la clase de bloque, ¿por qué no crear un ayudante y agregarlo allí?

Comience creando un nuevo módulo de la manera habitual, y dentro de la raíz, cree una nueva carpeta llamada "Helper" y agregue el código requerido allí:

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]);
    }

}

Una vez activado y compilado, podrá usarlo dentro de su archivo de plantilla utilizando el siguiente método:

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

¡Espero que usted (y posiblemente otros) encuentren esto de gran utilidad!

Smithee
fuente
Usar $ this-> helper () en archivos PHTML está en desuso y desaconsejado
Vishwas Bhatnagar
1

Al menos en 2.2.6, puede usar Magento\Framework\UrlInterface::getDirectUrl()

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