Tự động thay đổi bố cục danh mục dựa trên các bộ lọc


7

Tóm tắc

Tôi có một vấn đề trong đó bởi Cửa hàng Magento tôi đang làm việc đã được định cấu hình để sử dụng các sản phẩm được nhóm với các sản phẩm đơn giản được liên kết. Các sản phẩm này có thể được lọc theo các thuộc tính / giá trị sản phẩm như được định cấu hình trong quản trị viên.

Hành vi hiện tại

  • Khả năng hiển thị của các sản phẩm đơn giản được đặt thành Không hiển thị riêng lẻ .
  • Các sản phẩm đơn giản khi tìm kiếm được hiển thị bởi sản phẩm nhóm của họ .

Khi người dùng cuối lọc các sản phẩm kết quả theo màu và ví dụ màu đỏ , các sản phẩm được nhóm lại với các sản phẩm đơn giản gắn liền với nó có một giá trị thuộc tính cho màu sắc của màu đỏ được hiển thị.

Hành vi dự kiến ​​(sau khi tùy chỉnh)

  • Khả năng hiển thị của các sản phẩm đơn giản được đặt thành Không hiển thị riêng lẻ .
  • Các sản phẩm đơn giản khi tìm kiếm được hiển thị bởi sản phẩm nhóm của họ .

Khi người dùng cuối lọc các kết quả của sản phẩm theo màu (chỉ) thay vì các sản phẩm được nhóm được hiển thị, sản phẩm đơn giản đó sẽ được hiển thị.

Logic của tôi là - Tôi có thể phát hiện các bộ lọc thông qua các tham số yêu cầu. Khi bộ lọc màu đã được đặt, tôi ghi đè kết quả sản phẩm bằng cách nào đó .

Khi tôi nói bằng cách nào đó những gì tôi muốn nói, đây là phần mà tôi gặp khó khăn khi giải quyết vấn đề đơn giản của mình. Làm thế nào tôi có thể giải quyết vấn đề này?

Kết luận / Nỗ lực

Dưới đây là danh sách những nỗ lực tôi đã nghĩ ra và chơi xung quanh để thấy nó không hoàn toàn giải quyết vấn đề của tôi hoặc đơn giản là không giải quyết được vấn đề của tôi.

Quan sát catalog_controller_category_init_before:

Tôi nghĩ khi tôi quan sát _initCategory()phương pháp tôi có thể ghi đè lên bố cục trong đó tôi có khả năng có thể thay đổi cấu hình Magento để hiển thị các sản phẩm đơn giản và các sản phẩm không được nhóm.

Tuy nhiên, nó dường như $this->loadLayout()không bao giờ được gọi, vì vậy tôi phải ghi đè lên getLayouthoặc viewActioncác phương thức trên CategoryControllerchính nó.

Ghi đè rõ ràng CategoryContoder để thực hiện thay đổi bố cục:

Tôi hoàn nguyên các điều trên và quyết định theo đuổi tùy chọn thứ hai của mình là ghi đè chức năng. Bắt đầu với việc mở rộng Mage_Catalog_CategoryControllerbộ điều khiển.

Thử nghiệm đầu tiên của tôi là ghi đè lên loadLayout, sau khi biết điều này không bao giờ được gọi, sau đó tôi quyết định ghi đè getLayoutvào thời điểm này, tôi không chắc mình sẽ làm gì.

Ghi đè Mage_Catalog_Block_Product_List:

Tôi quyết định rằng tùy chọn tốt hơn là mở rộng khối thực tế có các mô hình và bộ sưu tập cần thiết. Trong khối của tôi, tôi ghi đè getProductsListHtmlphương thức, tôi nhanh chóng tìm hiểu toàn bộ HTML đã được phân tích cú pháp, thực thi và tạo.

Vì vậy, tôi không thể đơn giản.

  • Lắng nghe cho $this->getRequest()->getParams();
  • Lặp lại các sản phẩm được nhóm để có được các sản phẩm liên quan phù hợp với bộ lọc của tôi;

Quan sát catalog_product_collection_load_aftersự kiện:

Lần này tôi nghĩ rằng tôi có thể quan sát bộ sưu tập mô hình và thay đổi nhiệm vụ để thay đổi kết quả khi bộ lọc của tôi đã được đặt. Do đó tôi nhận được $observer->getEvent()->getCollection()và cập nhật truy vấn dựa trên các bộ lọc của mình.

Điều này không hoạt động vì tôi có thể xóa các sản phẩm được nhóm, nhưng các sản phẩm đơn giản sẽ không hiển thị vì khả năng hiển thị.

Câu trả lời:


0

Mặc dù điều này không cung cấp một giải pháp rõ ràng, câu trả lời này hiện là những gì tôi đã làm để đạt được mục tiêu của mình.

Tôi chủ yếu tạo ra một người quan sát catalog_product_collection_load_after. Sau đó tôi tạo lại truy vấn để chỉ thu thập dữ liệu tôi muốn.

$event      = $observer->getEvent();
$collection = $event->getCollection();
$select     = $collection->getSelect();

// Adapter is the database resource adapter (an example, probably not the best)
$adapter = Mage::getResource('core/resource');

// Reset the entire query (using the Zend reset method).
$select->reset();

$select->from([ 'main_table' => $adapter->getTableName('catalog/product') ], [
    // stuff to get
])

// inner joins and things.

0

Tôi không có sẵn một mẫu mã đầy đủ, nhưng còn việc tạo một mô-đun tùy chỉnh và ghi đè Mage_Catalog_Model_Layer->prepareProductCollection()thì sao? Bạn có thể sử dụng Mage::app->->getRequest()->getParams()để tìm xem thuộc tính mà bạn muốn sử dụng có hay không, và nếu có, đừng chạy Mage::getSingleton('catalog/product_visibility')->addVisibleInCatalogFilterToCollection($collection)nó ở đó ngay bây giờ.

Một ví dụ:

public function prepareProductCollection($collection)
{
    if (!in_array(Mage::app->->getRequest()->getParams(), 'colour')) {
        return parent::prepareProductCollection($collection);
    }

    $collection
        ->addAttributeToSelect(Mage::getSingleton('catalog/config')->getProductAttributes())
        ->addMinimalPrice()
        ->addFinalPrice()
        ->addTaxPercents()
        ->addUrlRewrite($this->getCurrentCategory()->getId());

    Mage::getSingleton('catalog/product_status')->addVisibleFilterToCollection($collection);
    // Don't filter by "visible in catalog" if filtering by colour
    // Mage::getSingleton('catalog/product_visibility')->addVisibleInCatalogFilterToCollection($collection);

    return $this;
}

Tôi hy vọng điều này ít nhất giúp bạn gần gũi hơn.


0

Theo yêu cầu của bạn, tôi không thấy phù hợp để hiển thị sản phẩm đơn giản về lựa chọn bộ lọc. Nhiều như tôi có thể quan sát bạn đang muốn hiển thị hình ảnh của sản phẩm màu đó mà bạn có thể đạt được trong sản phẩm được liệt kê cấu hình là tốt. Bạn có thể có các chi tiết sản phẩm được liên kết trong khi hiển thị danh sách, Chỉ cần kích hoạt các cờ để kiểm tra xem bộ lọc có được chọn hay không được sử dụng để định cấu hình sản phẩm, nếu được chọn thì hãy tìm nạp hình ảnh tương ứng. Xây dựng lại cấu trúc hoàn chỉnh không có ý nghĩa. Tạo tệp khối để kết xuất các sản phẩm đơn giản và chuyển đổi kết xuất khối khi chọn bộ lọc. Nhưng tôi sẽ thích lựa chọn đầu tiên. Viết cho bất kỳ truy vấn.

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.