Tôi muốn thêm khối tùy chỉnh của mình trên trang danh sách [Magento-2] nhưng không có bất kỳ sửa đổi nào trên list.phtmlhoặc bất kỳ.phtml tệp nào . Có bất kỳ khả năng bằng cách sử dụng xmltập tin?
Bất kỳ trợ giúp sẽ được đánh giá cao.
Tôi muốn thêm khối tùy chỉnh của mình trên trang danh sách [Magento-2] nhưng không có bất kỳ sửa đổi nào trên list.phtmlhoặc bất kỳ.phtml tệp nào . Có bất kỳ khả năng bằng cách sử dụng xmltập tin?
Bất kỳ trợ giúp sẽ được đánh giá cao.
Câu trả lời:
Bạn có thể làm điều đó nếu bạn tạo mô-đun mới để ghi đè khối này: vendor\magento\module-catalog\Block\Product\ListProduct.php
để ghi đè khối này, bạn cần tạo di.xmltạiapp\code\Vendor\Module_Name\etc
di.xml Nội dung:
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
<preference for="Magento\Catalog\Block\Product\ListProduct" type="Vendor\Module_Name\Block\Product\ListProduct" />
</config>
Tạo tên tệp mới ListProduct.phptạiapp\code\Vendor\Module_Name\Block\Product
ListProduct.php Nội dung:
namespace Vendor\Module_Name\Block\Product;
class ListProduct extends \Magento\Catalog\Block\Product\ListProduct
{
public function getProductDetailsHtml(\Magento\Catalog\Model\Product $product)
{
$html = $this->getLayout()->createBlock('Magento\Framework\View\Element\Template')->setProduct($product)->setTemplate('Vendor_ModuleName::test.phtml')->toHtml();
$renderer = $this->getDetailsRenderer($product->getTypeId());
if ($renderer) {
$renderer->setProduct($product);
return $html.$renderer->toHtml();
}
return '';
}
}
Bạn có thể thay đổi khối Magento\Framework\View\Element\Templatethành khối của bạn
tạo test.phtmltập tin tạiapp\code\Vendor\Module_Name\view\frontend\templates
di.xmlcách sử dụng phương pháp trên. Bây giờ làm thế nào để hiển thị giá trị thuộc tính tùy chỉnh của tôi trong trang danh sách?
Hiện tại bạn không thể làm điều này vì tất cả logic của đầu ra sản phẩm được mã hóa cứng trong list.phtmlmẫu.
Đây là giải pháp của tôi - nhưng bạn phải sửa đổi list.phtmlmẫu:
catalog_category_view.xml
<referenceBlock name="category.products.list">
<block class="Magento\Catalog\Block\Product\ProductList\Item\Container" name="custom.block.container" as="custom-block-container">
<block class="Magento\Catalog\Block\Product\ProductList\Item\Block" name="custom.block" as="custom-block"
template="Magento_Catalog::product/view/custom-block.phtml" />
</block>
</referenceBlock>
Trong custom-block.phtmlbạn có thể nhận được sản phẩm như thế này:
$_product = $block->getProduct();
Bạn sẽ cần ghi đè lên list.phtmlmẫu mặc dù ... Chỉ cần thêm phần này vào nơi bạn muốn khối tùy chỉnh của mình hiển thị:
<?php if ($customBlock = $block->getChildBlock('custom-block-container')): ?>
<?= $customBlock->setProduct($_product)->getChildHtml() ?>
<?php endif; ?>
Nếu bạn thực sự muốn tránh sửa đổi list.phtmlmẫu, thì bạn có thể làm một điều tương tự nhưng trong một mẫu khác.