Magento2: รับ URL สื่อในไฟล์เทมเพลต (โดยไม่เรียกผู้จัดการวัตถุโดยตรง)


18

วิธีรับMedia URLไฟล์เทมเพลต วิธีแก้ปัญหาทั้งหมดที่ฉันพบคือการเรียก Object Manager โดยตรง ข้อกังวลอีกข้อของฉันคุณสามารถโทรหาผู้จัดการวัตถุโดยตรงเพื่อเป็นการปฏิบัติที่ดีที่สุดได้ไหม (เพราะในโซลูชันส่วนใหญ่พวกเขาใช้ตัวจัดการวัตถุ)

คำตอบ:


26

คุณสามารถรับ url สื่อในไฟล์เทมเพลตของคุณโดยใช้วิธีด้านล่าง แต่โดยไม่ต้องใช้ objectmanager คุณต้องกำหนด Block ไฟล์ด้วย__construct()เมธอดที่มี define storeManagerInterfaceในวิธีการสร้าง

ในไฟล์บล็อกของคุณสร้างฟังก์ชั่น __ สร้าง

ประชาชน $ _storeManager;

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

ในวิธีการเรียกไฟล์ phtml ด้านล่างเพื่อรับ mediaurl

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

echo $ mediaUrl;

นี่เป็นวิธีที่เหมาะสมในการรับ URL สื่อใน Magento 2


4
ฉันคิดว่ามันจะเป็นการดีกว่าที่จะทำให้ตัวแปรนั้นได้รับการปกป้องและสร้างวิธี getter เพื่อดึง url สื่อแทน
Raphael at Digital Pianism

หากบล็อกของคุณขยายออกไปแสดง\Magento\Framework\View\Element\Templateว่าคุณมีอินสแตนซ์ของStoreManagerInterface( $this->_storeManager) อยู่แล้ว
Erfan

ฉันได้รับ URL สื่อ แต่ฉันต้องแสดงภาพที่สอดคล้องกับ URL นั้น ... หากคุณรู้ช่วยฉันจัดการปัญหาของฉัน โปรดดูลิงค์ด้านล่าง magento.stackexchange.com/questions/201961/ …
Jaisa

14

ตั้งแต่ 2.1 ไม่มีวิธีรับ URL สื่อโดยตรงโดยไม่มี:

  • โทรหาผู้จัดการวัตถุโดยตรง (กรุณาอย่าทำเช่นนั้น)
  • แทนที่บล็อกและเพิ่มวิธีการใหม่

Rakesh พูดถึงวิธีหนึ่งในการทำมัน

อีกวิธีหนึ่งคือการใช้ตัวแปรที่มีการป้องกัน$_urlBuilderที่มีอยู่สำหรับทุกบล็อกที่กำหนดไว้ในAbstractBlock: https://github.com/magento/magento2/blob/f2d309a88298886460351c04973a4ff95c7a91c0/lib/internal/Magento/Framework/View/Element/AbstractBlock.php # L186

ดังนั้นคุณไม่จำเป็นต้องแก้ไขตัวสร้างของบล็อกของคุณและสามารถเพิ่มวิธีการต่อไปนี้:

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

จากนั้นในแม่แบบของคุณคุณสามารถโทร:

$block->getMediaUrl();

4
ฉันคิดว่ามันไร้สาระที่ฉันไม่สามารถเรียกค้นเส้นทางสื่อใน. phtml โดยตรง
LucScu

@ Lucuc มันอาจจะท้อแท้แน่นอน อาจไม่ใช่ความคิดที่ดีที่สุดในการอ้างอิงเนื้อหาที่อัปโหลดและไม่ได้เป็นส่วนหนึ่งของ codebase รู้สึกน่ารังเกียจเล็กน้อย
Erfan

7

หากคุณไม่ต้องการไปที่ปัญหาการขยาย \ Magento \ Framework \ View \ Element \ Template และคุณต้องการให้ไฟล์. html ของคุณใช้ block \ Magento \ Framework \ View \ Element \ Template คุณสามารถใช้ ทางลัดนี้:

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

การใช้ $ this-> helper () ในไฟล์ PHTML ถูกคัดค้านและทำให้หมดกำลังใจ
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" />

ฉันหวังว่าคุณ (และคนอื่น ๆ อาจพบ) ใช้งานได้ดี!


การใช้ $ this-> helper () ในไฟล์ PHTML ถูกคัดค้านและทำให้หมดกำลังใจ
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.