Bố cục sản phẩm khác nhau dựa trên sản phẩm


7

Những gì tôi đã cố gắng cho đến nay

Như tiêu đề mô tả. Làm cách nào để triển khai các bố cục khác nhau cho mỗi sản phẩm dựa trên giá trị trên sản phẩm đó (trong trường hợp này là EAV tùy chỉnh trên thực thể Sản phẩm)

Lúc đầu, tôi nghĩ rằng tôi sẽ tạo ra một loại sản phẩm tùy chỉnh cho các loại sản phẩm này. Điều này sẽ làm việc tốt. Mặc dù bạn không thể thay đổi các loại sản phẩm cho các sản phẩm hiện có.

Sau đó, tôi nghĩ rằng tôi có thể tạo bố cục trang mới, mặc dù bạn không thể thêm nội dung vào bố cục sản phẩm.

Cuối cùng tôi nghĩ rằng tôi chỉ cần thêm tất cả các sản phẩm này vào một danh mục và thay đổi chế độ xem sản phẩm ở đó (thông qua Thiết kế> XML cập nhật bố cục) nhưng điều này sẽ liên quan đến việc người dùng cuối viết XML là điều tôi muốn tránh nếu có thể. Tương tự như vậy đối với việc thay đổi XML cập nhật Thiết kế> Bố cục cho từng sản phẩm.

Thông tin khác:

Tôi đã tạo một mô-đun Magento để thay thế hình ảnh sản phẩm bằng một chế độ xem khác. Hiện tại tôi đã ghi đè (trong mô-đun của mình) chế độ xem / frontend / layout / catalog_product_view.xml bằng nội dung tùy chỉnh của tôi (loại bỏ các khối hình ảnh / video gốc và thêm các khối của riêng tôi) điều này hoạt động tốt mặc dù TẤT CẢ các sản phẩm hiện có bố cục mới.

Tất cả các sản phẩm là sản phẩm đơn giản hiện nay

Câu trả lời:


8

Có, bạn có thể đạt được điều này bằng cách viết mã nhỏ

Những gì bạn cần làm là thêm bố cục thông qua sự kiện layout_load_before, bạn có thể sử dụng sự kiện này để thêm bố cục động của bạn.

Đây là mã mẫu cho bạn, vui lòng sửa đổi theo nhu cầu của bạn

những gì bạn có thể làm là tạo ra events.xmltrong mô-đun của bạn

[Vendor]/[Module]/etc/frontend/events.xml

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Event/etc/events.xsd">
    <!-- for diffrentiate layout.xml on product basis -->
    <event name="layout_load_before">
        <observer name="load_custom_handler" instance="[Vendor]\[Module]\Observer\LayoutLoadBefore" />
    </event>
</config>

Trong [Vendor]\[Module]\Observer\LayoutLoadBefore.phptập tin của bạn viết mã dưới đây

<?php

namespace [Vendor]\[Module]\Observer;

class LayoutLoadBefore implements \Magento\Framework\Event\ObserverInterface
{
    /**
     * @var \Magento\Framework\Registry
     */
    private $registry;

    public function __construct(
       ............
       \Magento\Framework\Registry $registry,
       ............
    ) {
        $this->registry = $registry;
    }


    public function execute(\Magento\Framework\Event\Observer $observer)
    {
        $product = $this->registry->registry('current_product');

        if (!$product) {
          return $this;
        }
        if ($product->getMyvalue()) { // your condition
           $layout = $observer->getLayout();
           $layout->getUpdate()->addHandle('your_handle_name');
        }

        return $this;
    }
}

Và bây giờ đi đến [Vendor]\[Module]\view\frontend\layout\your_handle_name.xmltập tin và viết mã của bạn.

Tập tin này chỉ được thêm vào tình trạng cụ thể của bạn về sản phẩm


Dòng này là viết tắt của từ gì? $layout->getUpdate()->addHandle('your_handler_name');, Tôi không hiểu trình xử lý, tôi cũng R & D cho trình xử lý bố cục, Tài nguyên không làm tôi hiểu. Nếu bạn có thể giúp tôi ra HOẶC một số liên kết hữu ích.
ẩn danh

1
@Vivek dòng đó thêm bố cục và your_handler_name.xmltệp tìm kiếm của nó trong tất cả các mô-đun
Murtuza Zabuawala

Xin chào, Ở đây mọi thứ đều hoạt động tốt, Ngay cả người quan sát của tôi cũng được gọi. Nhưng trình xử lý tùy chỉnh của tôi không hiển thị, Nó chỉ hiển thị catalog_product_view.xml, Vui lòng cho tôi biết nếu có bất cứ điều gì tôi bỏ lỡ. Tôi đã tạo ra catalog_product_view_extension.xml
Ravi Soni

@Ravi, vui lòng kiểm tra đường dẫn và tên xử lý của bạn, hoặc hỏi thông minh mới câu hỏi mới và đặt mã của bạn ở đó và gửi cho tôi liên kết của câu hỏi đó tôi sẽ kiểm tra
Murtuza Zabuawala

@Ravi, your_handler_namesẽ là tên tùy chỉnh bất kỳ tên nào bạn có thể đặt ở đây, chỉ cần tạo một tệp có tên đó
Murtuza Zabuawala

7

Bạn có thể làm điều đó bằng cách sử dụng xml cho các sản phẩm số lượng lớn. cho rằng bạn sẽ phải ghi đè trình trợ giúp và tạo thuộc tính cho điều đó. Hãy để tôi giải thích cho bạn mô tả.

Bước 1: Tạo thuộc tính sản phẩm ' customlayout '.

  • Tạo thuộc tính sản phẩm cutom cho bố cục tùy chỉnh, ở đây tôi vừa tạo thuộc tính ' customlayout ' với kiểu boolean (có / không) .
  • Gán thuộc tính này trong tập thuộc tính thích hợp.
  • Bây giờ ' customlayout ' hiển thị trong các sản phẩm, đặt trong các sản phẩm mà bạn muốn đặt bố cục khác nhau.

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

Bước 2: Ghi đè chức năng Trình trợ giúp init ProducttLayout ().

Ghi đè chức năng của trình trợ giúp trong mô-đun tùy chỉnh của bạn và cũng thay đổi trong tệp di.xml để ghi đè trình trợ giúp.

ứng dụng / mã / YourCompany / YourModule / etc / di.xml

<?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\Helper\Product\View" type="YourCompany\YourModule\Helper\Product\View" />
</config>

trong tệp YourCompany \ YourModule \ Helper \ Product \ view.php .

public function initProductLayout(ResultPage $resultPage, $product, $params = null)
    {
      ......
      // add handle params
      ......
    if ($params && $params->getBeforeHandles()) {
        foreach ($params->getBeforeHandles() as $handle) {
            $resultPage->addPageLayoutHandles(['customlayout' => $product->getCustomlayout(), 'id' => $product->getId(), 'sku' => $urlSafeSku], $handle);
            $resultPage->addPageLayoutHandles(['type' => $product->getTypeId()], $handle, false);
        }
    }

    $resultPage->addPageLayoutHandles(['customlayout' => $product->getCustomlayout(), 'id' => $product->getId(), 'sku' => $urlSafeSku]);
    $resultPage->addPageLayoutHandles(['type' => $product->getTypeId()], null, false);

    if ($params && $params->getAfterHandles()) {
        foreach ($params->getAfterHandles() as $handle) {
            $resultPage->addPageLayoutHandles(['customlayout' => $product->getCustomlayout(), 'id' => $product->getId(), 'sku' => $urlSafeSku], $handle);
            $resultPage->addPageLayoutHandles(['type' => $product->getTypeId()], $handle, false);
        }
    }

   ........

    }

Ở đây tôi đã thêm thuộc tính tùy chỉnh để xử lý bố trí tùy chỉnh. bây giờ bạn có thể tạo tập tin bố trí tùy chỉnh để sử dụng thuộc tính này.
hãy tạo tập tin xử lý tùy chỉnh.

Bước 3: Tạo tập tin bố cục để bố trí tùy chỉnh.

Tạo tập tin bố trí trong chủ đề tùy chỉnh / mô-đun tùy chỉnh của bạn. catalog_product_view_customlayout_1.xml

Ở đây bạn có thể thiết lập các thay đổi tùy chỉnh của bạn trong đó. nó sẽ được áp dụng cho tất cả các sản phẩm có giá trị tùy chỉnh ' customlayout ' là ' '.


@tuim, vui lòng làm theo các bước trên, nó sẽ làm việc cho bạn. Các bước trên đang làm việc cho tôi.
Công nghệ Emipro Pvt. Ltd.

@tuim, bạn đã thử giải pháp của chúng tôi chưa? Đây có phải là công việc cho bạn.?
Công nghệ Emipro Pvt. Ltd.

Xin chào, tôi đã quyết định đi với giải pháp dưới đây. Vì tôi không muốn ghi đè chức năng init ProducttLayout hoàn chỉnh bằng cách triển khai tùy chỉnh. Điều đó sẽ làm giảm khả năng bảo trì.
Tuim
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.