Magento2: Obtenir l'URL du média dans le fichier modèle (sans appeler directement le gestionnaire d'objets)

17

Comment entrer Media URLdans le fichier modèle? Toute la solution que j'ai trouvée appelle directement le gestionnaire d'objets. Mon autre souci, pouvez-vous jamais appeler le gestionnaire d'objets directement comme meilleure pratique? (car dans la plupart des solutions, ils utilisent le gestionnaire d'objets)

Vishwas Bhatnagar
la source

Réponses:

25

Vous pouvez obtenir l'url du média dans votre fichier de modèle en utilisant la méthode ci-dessous mais sans utiliser objectmanager, vous devez définir le fichier Block avec la __construct()méthode avec define storeManagerInterface dans la méthode de construction.

Dans votre fichier Block phtml, créez la fonction __construct.

public $ _storeManager;

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

Dans votre fichier phtml, appelez la méthode ci-dessous pour obtenir mediaurl,

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

echo $ mediaUrl;

C'est la bonne façon d'obtenir l'URL des médias dans Magento 2.

Rakesh Jesadiya
la source
4
Je pense qu'il serait préférable de protéger cette variable et de créer une méthode getter pour récupérer l'url du média à la place
Raphael at Digital Pianism
Si votre bloc s'étend de \Magento\Framework\View\Element\Template, vous avez déjà une instance de StoreManagerInterface( $this->_storeManager).
Erfan
J'ai reçu l'URL des médias. Mais j'ai besoin d'afficher l'image correspondant à cette URL ... Si vous savez, aidez-moi à régler mon problème. Veuillez vous référer au lien ci-dessous magento.stackexchange.com/questions/201961/…
Jaisa
14

Depuis 2.1, il n'y a aucun moyen direct d'obtenir l'URL du média sans:

  • appeler directement le gestionnaire d'objets (veuillez ne pas le faire)
  • remplacer le bloc et ajouter une nouvelle méthode

Rakesh a mentionné une façon de procéder.

Une autre façon consiste à utiliser la variable protégée $_urlBuilderqui est incluse pour chaque bloc tel que défini dans AbstractBlock: https://github.com/magento/magento2/blob/f2d309a88298886460351c04973a4ff95c7a91c0/lib/internal/Magento/Framework/View/Element/AbstractBlock.php # L186

Ainsi, vous n'avez pas à modifier le constructeur de votre bloc et pouvez simplement ajouter la méthode suivante:

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

Ensuite, dans votre modèle, vous pouvez appeler:

$block->getMediaUrl();
Raphael chez Digital Pianism
la source
4
Je pense qu'il est absurde de ne pas pouvoir récupérer directement le chemin des médias en .phtml directement.
LucScu
@LucScu cela pourrait être découragé, c'est sûr. Ce n'est probablement pas la meilleure idée de référencer un élément qui a été téléchargé et qui ne fait pas partie de la base de code. C'est un peu méchant de le faire.
Erfan
7

Si vous ne voulez pas avoir la difficulté d'étendre \ Magento \ Framework \ View \ Element \ Template et que vous souhaitez que votre fichier .phtml utilise le bloc \ Magento \ Framework \ View \ Element \ Template, vous pouvez utiliser ce raccourci:

$this->helper('Magento\Cms\Helper\Wysiwyg\Images')->getBaseUrl()
kig
la source
L'utilisation de $ this-> helper () dans les fichiers PHTML est déconseillée et déconseillée
Vishwas Bhatnagar
5

Je vais utiliser la réponse de Raphaël et l'étendre - mais au lieu d'ajouter la méthode dans la classe de bloc, pourquoi ne pas créer un assistant et l'ajouter là-dedans?

Commencez par créer un nouveau module de la manière habituelle, et dans la racine, créez un nouveau dossier appelé "Helper" et ajoutez-y le code requis:

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

}

Une fois activé et compilé, vous pourrez l'utiliser dans votre fichier modèle en utilisant la méthode suivante:

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

J'espère que vous (et potentiellement d'autres) trouverez cela d'une grande utilité!

Smithee
la source
L'utilisation de $ this-> helper () dans les fichiers PHTML est déconseillée et déconseillée
Vishwas Bhatnagar
1

Au moins en 2.2.6, vous pouvez utiliser Magento\Framework\UrlInterface::getDirectUrl()

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