Magento2: Thêm mẫu tùy chỉnh vào trang chi tiết sản phẩm bên dưới thêm vào phần giỏ hàng


10

Tôi đang cố gắng thêm mẫu tùy chỉnh vào trang sản phẩm trong phần chia sẻ xã hội. Trong mô-đun của tôi, tôi đã theo dõi mã trong tệp bố trí default.xml

 <body>
 <referenceContainer name="product.info.social">
  <block class="Magento\Framework\View\Element\Template" name="product.info.custom" template="Lapisbard_Product::social.phtml" after="product.info.addtocart">
  </block>
 </referenceContainer>
</body>

nội dung xã hội

<p>Hey there !</p>
<?php //$_product = $block->getProduct();

Nó hoạt động tốt và hiển thị nội dung mẫu trên trang sản phẩm. Khi tôi đang sử dụng lớp khối Magento\Catalog\Block\Product\Viewthay vì Magento\Framework\View\Element\Templateđể tôi có thể lấy đối tượng sản phẩm trong mẫu của mình bằng cách sử dụng $block->getProduct();, nó sẽ hiển thị một trang trống.

1. Tôi đang làm gì ở đây?
2. Cách tốt nhất để sửa đổi trang sản phẩm là gì?
3. Có tệp bố cục tham chiếu nào mà tôi có thể sử dụng để thêm mẫu mới vào bất kỳ phần nào trong mã sản phẩm viết mã bố cục trong mô-đun của mình không?


@amiteshree có thể là tệp phtml của bạn bao gồm các chức năng được xác định trong Magento \ Catalog \ Block \ Product \ Xem tệp khối
Shaheer Ali

@ShaheerAli: Trong tệp phtml của tôi, tôi đang cố gắng lấy đối tượng sản phẩm bằng $_product = $block->getProduct();cách sử dụng Magento\Catalog\Block\Product\Viewkhối.
amitshree

Vậy thì tại sao bạn lại gán khối Magento \ Framework \ View \ Element \ Template cho mẫu của bạn.
Shaheer Ali

1
@amiteshree nếu bạn muốn sử dụng các chức năng xem sản phẩm thì bạn cần gán Magento \ Catalog \ Block \ Product \ View cho mẫu phtml của bạn. Và phương pháp thêm mẫu tùy chỉnh của bạn vào trang sản phẩm là chính xác
Shaheer Ali

1
Trang trống thường có nghĩa là, một số lỗi đã xảy ra. Bạn đã nhìn vào error.log của bạn? Magento ngoại lệ đăng nhập? Bạn sử dụng chế độ nào?
Anton Kril

Câu trả lời:


24

Lỗi "trang trắng" xuất hiện do Magento\Framework\View\Element\Templatekhông có getProduct()phương pháp.

Vì vậy, tôi nghĩ rằng cách "sạch nhất" để làm điều đó là tạo một mô-đun tùy chỉnh với một khối, bố cục và mẫu tùy chỉnh (đừng lo lắng điều này chỉ mất vài phút và bạn đã thực hiện một số phần)

Tập tin mô-đun:

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

(Tôi sẽ bỏ qua /etc/module.xmlregistration.phpvì tầm thường, tuy nhiên bạn có thể tìm thấy ví dụ hoàn chỉnh ở đây .)

Hãy bắt đầu với tệp Block php:

Kiểm tra \ Danh mục \ Chặn \ Sản phẩm \ Xem \ Extra.php

<?php

namespace Test\Catalog\Block\Product\View;

use Magento\Catalog\Block\Product\AbstractProduct;

class Extra extends AbstractProduct
{

}

Như bạn có thể thấy nó chỉ là một lớp cụ thể mở rộng (IMO) Khối Tóm tắt Sản phẩm nhẹ nhất. Bạn cũng có thể mở rộng Magento\Framework\View\Element\Templatenhưng trong trường hợp đó, bạn sẽ cần triển khai getProduct()phương thức và thay đổi ngữ cảnh trong hàm tạo để có quyền truy cập vào sổ đăng ký.

Vì vậy, hãy di chuyển đến tệp Bố cục:

Kiểm tra / Danh mục / xem / frontend / layout / catalog_product_view.xml

<?xml version="1.0"?>
<body>
    <referenceContainer name="product.info.social">
        <block class="Test\Catalog\Block\Product\View\Extra"
            name="product.view.extra"
            template="Test_Catalog::product/view/extra.phtml"
            after="-">
        </block>
    </referenceContainer>
</body>

Và cuối cùng là tệp mẫu:

Kiểm tra / Danh mục / lượt xem / frontend / mẫu / sản phẩm / lượt xem / thêm.

<?php /* @var $block \Test\Catalog\Block\Product\View\Extra */?>
<?php $_product = $block->getProduct() ?>
<h3><?php echo 'My Product Name Is: ' . $_product->getName(); ?></h3>

Như bạn có thể thấy là khá đơn giản, đơn giản hơn so với M1-

Hãy nhớ rằng tất cả logic tùy chỉnh của bạn nên được triển khai trong Extra.phplớp khối để giữ cho chế độ xem sạch sẽ.

I E:

Trong lớp Extra.php :

public function getSomething()
{
    return 'something'
}

trong extra.phtml xem:

<?php echo $block->getSomething() ?>

2
Vì vậy, bố cục catalog_product_view.xml của mô-đun của tôi tự động tải khi tôi ở trên trang sản phẩm?
amitshree

2
Tuyệt đối! nó rất giống với M1 nhưng bây giờ mọi tay cầm đều nằm trong một tệp riêng biệt.
MauroNigrele

5

Bổ sung cho câu trả lời được chấp nhận

Câu trả lời được chấp nhận là tốt, nhưng AbstractProductđang bị phản đối ngay bây giờ.

/**
 * Class AbstractProduct
 * @api
 * @deprecated 101.1.0
 * @SuppressWarnings(PHPMD.NumberOfChildren)
 * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
 * @since 100.0.2
 */
class AbstractProduct extends \Magento\Framework\View\Element\Template

Vì vậy, chúng ta phải sử dụng Magento\Framework\Registryđể đạt được Khối , mẫu Khối bên dưới:

<?php
namespace Vendor\Module\Block;

use Magento\Framework\View\Element\Template;
use Magento\Framework\Registry;

class ProductView extends Template
{
    /**
     * @var Registry
     */
    protected $registry;

    /**
     * @var \Magento\Catalog\Model\Product
     */
    protected $product;

    /**
     * ProductView constructor.
     * @param Template\Context $context
     * @param array $data
     * @param Registry $registry
     */
    public function __construct(
        Template\Context $context,
        array $data = [],
        Registry $registry
    )
    {
        $this->registry = $registry;
        parent::__construct($context, $data);
    }

    /**
     * @return \Magento\Catalog\Model\Product
     */
    public function getProduct()
    {
        if (is_null($this->product)) {
            $this->product = $this->registry->registry('product');
        }

        return $this->product;
    }
}
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.