Thêm khối tùy chỉnh trên trang danh sách: Magento2


10

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?

nhập mô tả hình ảnh ở đây

Bất kỳ trợ giúp sẽ được đánh giá cao.


Bài báo tuyệt vời. Bạn có thể mở rộng chi tiết hơn về test.phtml để ghi đè trang danh sách ban đầu không? Là một người mới đến trên Magento 2.

Làm cách nào tôi có thể sử dụng hàm get SẢNtDetailsHtml () để thêm khối 'nhãn' MỚI trên lưới trong test.phtml?
Kllee

Câu trả lời:


10

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


Cảm ơn thông tin +1 từ tôi ... Nhưng chúng ta có thể đạt được mà không cần ghi đè không?
Keyur Shah

@KeyurShah, có phải là phương pháp tốt nhất từ ​​trước đến nay trong Mage 2.0 để thêm khối tùy chỉnh của bạn trên trang danh sách không? Tôi cũng đồng ý với Kandy vì đầu ra sản phẩm được mã hóa cứng trong list.phtml.
Slimshadddyyy

@Vikram cho đến bây giờ, tôi nghĩ rằng đây là phương pháp tốt nhất cho đến nay và cũng hoạt động tốt với tôi ..
Keyur Shah

@KeyurShah, tôi đã ghi đè bằng 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?
Slimshadddyyy

@Vikram bạn có thể sử dụng mã Mageev2 để hiển thị thuộc tính tùy chỉnh của mình. Ý tôi là trong test.phtml bạn có thể nhận được đối tượng sản phẩm $ và từ đối tượng sản phẩm $ bạn có thể dễ dàng nhận được giá trị thuộc tính của nó.
Keyur Shah

4

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.


Vâng tôi biết điều đó ,, Nhưng có bất kỳ hook hay mẹo nào có sẵn cho điều đó không? Btw, Cảm ơn thông tin.
Keyur Shah

0

Đâ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.

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.