Magento2: Uzyskaj adres URL multimediów w pliku szablonu (bez bezpośredniego wywoływania menedżera obiektów)

18

Jak dostać się do Media URLpliku szablonu? Wszystko, co znalazłem, to bezpośrednie wywoływanie Object Managera. Moja kolejna obawa: czy kiedykolwiek możesz nazwać menedżera obiektów bezpośrednio najlepszą praktyką? (ponieważ w większości rozwiązań używają menedżera obiektów)

Vishwas Bhatnagar
źródło

Odpowiedzi:

26

Możesz pobrać adres URL multimediów do pliku szablonu, korzystając z poniższego sposobu, ale bez użycia menedżera obiektów musisz zdefiniować plik bloku za pomocą __construct()metody z parametrem storeManagerInterface w metodzie konstrukcji.

W pliku blokowym phtml utwórz funkcję __construct.

public $ _storeManager;

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

W wywołaniu pliku phtml poniżej metody, aby uzyskać mediaurl,

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

echo $ mediaUrl;

To jest właściwy sposób na uzyskanie adresu URL mediów w Magento 2.

Rakesh Jesadiya
źródło
4
Wydaje mi się, że lepiej byłoby zabezpieczyć tę zmienną i stworzyć metodę pobierającą do pobierania
adresu
Jeśli twój blok się rozciąga \Magento\Framework\View\Element\Template, masz już instancję StoreManagerInterface( $this->_storeManager).
Erfan
Mam adres URL mediów. Ale muszę wyświetlić obraz odpowiadający temu adresowi URL ... Jeśli wiesz, pomóż mi rozwiązać mój problem. Proszę odnieść się do poniższego linku magento.stackexchange.com/questions/201961/...
Jaisa
14

Od wersji 2.1 nie ma bezpośredniego sposobu na uzyskanie adresu URL multimediów bez:

  • bezpośrednie wywoływanie menedżera obiektów (nie rób tego)
  • przesłonić blok i dodać nową metodę

Rakesh wspomniał o jednym ze sposobów.

Innym sposobem jest użycie chronionej zmiennej, $_urlBuilderktóra jest dołączana do każdego bloku, zgodnie z definicją w AbstractBlock: https://github.com/magento/magento2/blob/f2d309a88298886460351c04973a4ff95c7a91c0/lib/internal/Magento/Framework/View/Element/pstractBlock.ph # L186

Dzięki temu nie musisz modyfikować konstruktora swojego bloku i możesz po prostu dodać następującą metodę:

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

Następnie w swoim szablonie możesz zadzwonić:

$block->getMediaUrl();
Raphael at Digital Pianism
źródło
4
myślę, że to absurdalne, że nie mogę po prostu pobrać bezpośrednio ścieżki medialnej w .phtml.
LucScu,
@LucScu na pewno można to zniechęcić. Prawdopodobnie nie jest to najlepszy pomysł na odniesienie do zasobu, który został przesłany i który nie jest częścią bazy kodu. Jest to trochę nieprzyjemne.
Erfan
7

Jeśli nie chcesz zająć się rozszerzaniem \ Magento \ Framework \ View \ Element \ Template, a chcesz, aby plik .phtml używał bloku \ Magento \ Framework \ View \ Element \ Template, możesz użyć ten skrót:

$this->helper('Magento\Cms\Helper\Wysiwyg\Images')->getBaseUrl()
kig
źródło
Używanie $ this-> helper () w plikach PHTML jest przestarzałe i odradzane
Vishwas Bhatnagar
5

Wykorzystam odpowiedź Raphaela i rozszerzę ją - ale zamiast dodawać metodę do klasy bloków, dlaczego nie stworzyć pomocnika i tam dodać?

Zacznij od utworzenia nowego modułu w zwykły sposób, aw katalogu głównym utwórz nowy folder o nazwie „Pomocnik” i dodaj tam wymagany kod:

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

}

Po aktywacji i kompilacji będziesz mógł używać go w pliku szablonu, używając następującej metody:

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

Mam nadzieję, że ty (i potencjalnie inni) znajdziesz to bardzo przydatne!

Smithee
źródło
Używanie $ this-> helper () w plikach PHTML jest przestarzałe i odradzane
Vishwas Bhatnagar
1

Możesz użyć przynajmniej w wersji 2.2.6 Magento\Framework\UrlInterface::getDirectUrl()

    protected function buildMediaUrl($path)
    {
        return $this->urlBuilder->getDirectUrl( $path, ['_type' => UrlInterface::URL_TYPE_MEDIA]);
    }
Vadim Kusakin
źródło