Magento2 : 템플릿 파일에서 미디어 URL 가져 오기 (직접 호출 객체 관리자없이)


17

Media URL템플릿 파일 을 얻는 방법 ? 내가 찾은 모든 솔루션은 Object Manager를 직접 호출하는 것입니다. 저의 또 다른 관심사, 모범 사례로 직접 객체 관리자를 호출 할 수 있습니까? (대부분의 솔루션에서 객체 관리자를 사용하고 있기 때문에)

답변:


25

아래 방법을 사용하여 템플릿 파일에서 미디어 URL을 얻을 수 있지만 objectmanager를 사용하지 않고 construct 메소드에서 __construct()define storeManagerInterface 를 사용 하여 메소드로 블록 파일을 정의해야합니다 .

phtml 블록 파일에서 __construct 함수를 작성하십시오.

공공 $ _storeManager;

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

mediaurl을 얻으려면 아래의 phtml 파일 호출에서

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

에코 $ mediaUrl;

이것은 Magento 2에서 미디어 URL을 얻는 올바른 방법입니다.


4
나는 그 변수가 보호하고 미디어가 대신 url로 검색하는 getter 메소드 만들기 위해 더 나은 방법이 될 것입니다 생각한다
디지털 Pianism에서 라파엘을

블록이에서 연장되면 \Magento\Framework\View\Element\Template이미 StoreManagerInterface( $this->_storeManager) 의 인스턴스가있는 것 입니다.
Erfan

미디어 URL이 있습니다. 그러나 해당 URL에 해당하는 이미지를 표시해야합니다 ... 내 문제를 해결하는 데 도움이된다면. 아래 링크를 참조하십시오 magento.stackexchange.com/questions/201961/…
Jaisa

14

2.1 현재로서는 다음 중 하나를 사용하지 않고 미디어 URL을 얻는 직접적인 방법은 없습니다.

  • 직접 객체 관리자를 호출하십시오 (하지 마십시오)
  • 블록을 재정의하고 새로운 방법을 추가하십시오

Rakesh는 한 가지 방법을 언급했습니다.

또 다른 방법은 https://github.com/magento/magento2/blob/f2d309a88298886460351c04973a4ff95c7a91c0/lib/internal/Magento/Framework/View/Element/AbstractBlock.php에$_urlBuilder 정의 된대로 모든 블록에 포함 된 보호 변수를 사용하는 것입니다 AbstractBlock. # L186

따라서 블록의 생성자를 수정할 필요가 없으며 간단히 다음 방법을 추가 할 수 있습니다.

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

그런 다음 템플릿에서 다음을 호출 할 수 있습니다.

$block->getMediaUrl();

4
.phtml에서 직접 미디어 경로를 검색 할 수 없다는 것이 터무니없는 것 같습니다.
LucScu

@LucScu는 실망 할 것입니다. 아마도 업로드되었으며 코드베이스의 일부가 아닌 자산을 참조하는 것이 가장 좋은 아이디어는 아닙니다. 그렇게하는 것은 조금 불쾌합니다.
Erfan

7

\ Magento \ Framework \ View \ Element \ Template을 확장하는 데 어려움을 겪고 싶지 않고 .phtml 파일이 \ Magento \ Framework \ View \ Element \ Template 블록을 사용하도록하려면 이 바로 가기 :

$this->helper('Magento\Cms\Helper\Wysiwyg\Images')->getBaseUrl()

PHTML 파일에서 $ this-> helper ()를 사용하는 것은 더 이상 사용되지 않으며 권장하지 않습니다
Vishwas Bhatnagar

5

Raphael의 답변을 사용하고 확장 할 것입니다.하지만 메소드를 블록 클래스에 추가하는 대신 도우미를 만들고 거기에 추가하지 않겠습니까?

일반적인 방법으로 새 ​​모듈을 만들어 시작하고 루트 내에서 "Helper"라는 새 폴더를 만들고 여기에 필요한 코드를 추가하십시오.

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

}

활성화 및 컴파일되면 다음 방법을 사용하여 템플릿 파일 내에서 사용할 수 있습니다.

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

나는 당신 (그리고 잠재적으로 다른 사람들)이 이것을 잘 사용하기를 바랍니다.


PHTML 파일에서 $ this-> helper ()를 사용하는 것은 더 이상 사용되지 않으며 권장하지 않습니다
Vishwas Bhatnagar

1

최소한 2.2.6에서는 Magento\Framework\UrlInterface::getDirectUrl()

    protected function buildMediaUrl($path)
    {
        return $this->urlBuilder->getDirectUrl( $path, ['_type' => UrlInterface::URL_TYPE_MEDIA]);
    }
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.