Magento2: Nhận URL phương tiện trong tệp mẫu (Không có trình quản lý đối tượng gọi trực tiếp)


17

Làm thế nào để có được Media URLtrong tập tin mẫu? Tất cả các giải pháp tôi tìm thấy là gọi Object Manager trực tiếp. Một mối quan tâm khác của tôi, bạn có thể gọi người quản lý đối tượng trực tiếp là cách thực hành tốt nhất không? (bởi vì trong hầu hết các giải pháp họ đang sử dụng trình quản lý đối tượng)

Câu trả lời:


25

Bạn có thể lấy url phương tiện trong tệp mẫu của mình bằng cách sử dụng cách bên dưới nhưng không sử dụng objectmanager, bạn phải xác định tệp Chặn bằng __construct()phương thức với định nghĩa storeManagerInterface trong phương thức xây dựng.

Trong tệp Khối phtml của bạn, hãy tạo hàm __construct.

công khai $ _storeManager;

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

Trong tệp phtml của bạn, hãy gọi phương thức bên dưới để nhận mediaurl,

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

tiếng vang $ mediaUrl;

Đây là cách thích hợp để lấy url phương tiện trong Magento 2.


4
Tôi nghĩ rằng sẽ tốt hơn nếu làm cho biến đó được bảo vệ và tạo ra một phương thức getter để lấy url phương tiện thay thế
Raphael tại Digital Pianism

Nếu khối của bạn kéo dài từ \Magento\Framework\View\Element\Template, bạn đã có một thể hiện của StoreManagerInterface( $this->_storeManager).
Erfan

Tôi có url phương tiện truyền thông. Nhưng tôi cần hiển thị hình ảnh tương ứng với url đó ... Nếu bạn biết giúp tôi giải quyết vấn đề của mình. Vui lòng tham khảo liên kết dưới đây magento.stackexchange.com/questions/201961/iêu
Jaisa

14

Kể từ 2.1, không có cách nào trực tiếp nhận URL phương tiện mà không có:

  • gọi trực tiếp cho người quản lý đối tượng (xin đừng làm vậy)
  • ghi đè khối và thêm một phương thức mới

Rakesh đề cập đến một cách làm điều đó.

Một cách khác là sử dụng biến được bảo vệ $_urlBuilderđược bao gồm cho mọi khối như được xác định trong AbstractBlock: https://github.com/magento/magento2/blob/f2d309a88298886460351c04973a4ff95c7a91c0/lib/i INTERNal / Maco / # L186

Do đó, bạn không phải sửa đổi hàm tạo của khối và chỉ cần thêm phương thức sau:

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

Sau đó, trong mẫu của bạn, bạn có thể gọi:

$block->getMediaUrl();

4
Tôi nghĩ thật phi lý khi tôi không thể truy xuất trực tiếp đường dẫn phương tiện trong .phtml.
LucScu

@LucScu nó có thể được khuyến khích, chắc chắn. Có lẽ không phải là ý tưởng tốt nhất để tham chiếu một tài sản đã được tải lên và không phải là một phần của cơ sở mã. Nó cảm thấy một chút khó chịu khi làm như vậy.
Erfan

7

Nếu bạn không muốn gặp rắc rối khi mở rộng \ Magento \ Framework \ View \ Element \ Template và bạn muốn tệp .phtml của mình sử dụng khối \ Magento \ Framework \ View \ Element \ Template, thì bạn có thể sử dụng phím tắt này:

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

Sử dụng $ this-> helper () trong các tệp PHTML không được khuyến khích và không được khuyến khích
Vishwas Bhatnagar

5

Tôi sẽ sử dụng câu trả lời của Raphael và mở rộng nó - nhưng thay vì thêm phương thức vào lớp khối, tại sao không tạo một trình trợ giúp và thêm nó vào đó?

Bắt đầu bằng cách tạo một mô-đun mới theo cách thông thường và trong thư mục gốc, tạo một thư mục mới có tên "Trình trợ giúp" và thêm mã yêu cầu vào đó:

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

}

Sau khi được kích hoạt và biên dịch, bạn sẽ có thể sử dụng nó trong tệp mẫu của mình bằng phương pháp sau:

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

Tôi hy vọng bạn (và có khả năng những người khác) tìm thấy điều này rất hữu ích!


Sử dụng $ this-> helper () trong các tệp PHTML không được khuyến khích và không được khuyến khích
Vishwas Bhatnagar

1

Ít nhất trong 2.2.6, bạn có thể sử dụng Magento\Framework\UrlInterface::getDirectUrl()

    protected function buildMediaUrl($path)
    {
        return $this->urlBuilder->getDirectUrl( $path, ['_type' => UrlInterface::URL_TYPE_MEDIA]);
    }
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.