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.phtml
hoặc bất kỳ.phtml
tệp nào . Có bất kỳ khả năng bằng cách sử dụng xml
tậ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.phtml
hoặc bất kỳ.phtml
tệp nào . Có bất kỳ khả năng bằng cách sử dụng xml
tậ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.xml
tạ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.php
tạ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\Template
thành khối của bạn
tạo test.phtml
tập tin tạiapp\code\Vendor\Module_Name\view\frontend\templates
di.xml
cá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.phtml
mẫu.
Đây là giải pháp của tôi - nhưng bạn phải sửa đổi list.phtml
mẫ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.phtml
bạ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.phtml
mẫ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.phtml
mẫu, thì bạn có thể làm một điều tương tự nhưng trong một mẫu khác.