Ẩn danh mục không có sản phẩm hoạt động


22

Có cách nào để ẩn các danh mục không có sản phẩm hoạt động không? Hoặc, thậm chí tốt hơn, chỉ hiển thị các danh mục có sản phẩm cổ phiếu đang hoạt động .


Câu hỏi là liệu đây có phải là một ý tưởng tốt. Người dùng bối rối khi họ thay đổi menu.
MiMo

Câu trả lời:


11

Cách dễ nhất để làm điều này là chỉ viết lại Mage_Catalog_Block_Navigationkhối:

=> Trong phương thức _renderCategoryMenuItemHtml()bạn muốn thay thế vòng lặp

foreach ($children as $child) {
    if ($child->getIsActive()) {
        $activeChildren[] = $child;
    }
}

=> với điều này:

    foreach ($children as $child) {
        if ($child->getIsActive() && $this->_hasProducts($child->entity_id)) {
            $activeChildren[] = $child;
        }
    }

=> và tương tự trong phương thức renderCategoriesMenuHtml()thay thế mã

 foreach ($this->getStoreCategories() as $child) {
        if ($child->getIsActive()) {
            $activeCategories[] = $child;
        }
    }

=> với điều này:

    foreach ($this->getStoreCategories() as $child) {
        if ($child->getIsActive() && $this->_hasProducts($child->entity_id)) {
            $activeCategories[] = $child;
        }
    }

=> Cuối cùng, thêm phương thức chúng ta vừa sử dụng vào mã của mình:

protected function _hasProducts($category_id) {
    $products = Mage::getModel('catalog/category')->load($category_id)
        ->getProductCollection()
        ->addAttributeToSelect('entity_id')
        ->addAttributeToFilter('status', 1)
        ->addAttributeToFilter('visibility', 4);
    return ( $products->count() > 0 )  ? true : false;
}

Hãy nhớ rằng phương thức kiểm tra từng danh mục riêng lẻ bằng cách sử dụng mô hình danh mục / danh mục. Vì vậy, nếu bạn có nhiều danh mục, bạn có thể muốn viết lại mã để không gặp vấn đề về hiệu năng. Trong một cửa hàng nhỏ hơn chúng tôi đang chạy, điều này hoạt động tốt.


Có thể đóng hộp này vào một phần mở rộng có thể được thả vào thư mục cục bộ không? Lo lắng về mã bị ghi đè trong các bản cập nhật Magento trong tương lai.
MagentoMac

10

Không có tính năng tích hợp để ẩn các danh mục trống (nhưng bạn có thể chọn thủ công Is active = No cho mỗi danh mục trong khu vực quản trị-> danh mục-> quản lý danh mục)

Đây là một liên kết trên một bài đăng tuyệt vời từ blog của Josh Prattski , nơi ông đã viết hướng dẫn từng bước về cách thực hiện một phần mở rộng cho mục đích này.


Điều này có vẻ tốt, nhưng vì lý do gì không hoạt động trong cửa hàng của chúng tôi ... có ý tưởng nào để gỡ lỗi không? Không nhận được bất kỳ thông báo lỗi. Thực hiện theo các hướng dẫn đến một tee, nhưng không có thay đổi trong frontend. Đã vô hiệu hóa, sau đó kích hoạt lại trình biên dịch và xóa bộ nhớ cache, v.v.
MagentoMac

4

Nếu bạn chỉ muốn ẩn chúng trong điều hướng danh mục, bạn có thể thêm một điều kiện if trong mẫu để kiểm tra số lượng sản phẩm trong danh mục đó.


4

Có lẽ điều này sẽ giúp quá.

Đi đến phần cuối của trang web của bạn.

Sau đó Catalog > Category > Manage Category, chọn danh mục của bạn và chọn Display settingstab.

Nhãn Display Modecó thể được đặt thành

Show static block only.


4

Để ẩn danh mục trống từ menu Trên cùng, hãy làm như sau:

Chuyển đến app/code/core/Mage/Catalog/BlockThư mục và sao chép Navigation.php .

Ghi đè Navigation.phptrong gói địa phương của bạn. Mở Navigation.php gói của bạn và dán mã sau vào tệp này:

if ($category->getIsActive()) {
    $cat = Mage::getModel('catalog/category')->load($category->getId());
    $products = Mage::getResourceModel('catalog/product_collection')->addCategoryFilter($cat);

    Mage::getSingleton('catalog/product_status')->addVisibleFilterToCollection($products);
    Mage::getSingleton('catalog/product_visibility')->addVisibleInCatalogFilterToCollection($products);
    Mage::getSingleton('cataloginventory/stock')->addInStockFilterToCollection($products);

    if (count($products) == 0) {
        return;
    }
}

Trường hợp trong tập tin đó?
Đánh dấu

3

Điều làm việc cho tôi là tạo một cây danh mục mẫu và thực hiện một hàm điều kiện biểu hiện cây thể loại:

foreach ($children as $child) 
{
    if ($child->getIsActive() && $this->_hasProducts($child->entity_id)) 
    {
        $activeChildren[] = $child;
    }
}
function _hasProducts:

    protected function _hasProducts($category_id) {
    $products = Mage::getModel('catalog/category')->load($category_id)
        ->getProductCollection()
        ->addAttributeToSelect('entity_id')
        ->addAttributeToFilter('status', 1)
        ->addAttributeToFilter('visibility', 4);
    return ( $products->count() > 0 )  ? true : false;
}

2

Bạn có thể thực hiện theo sql để vô hiệu hóa tất cả các danh mục mà không có sản phẩm.

UPDATE `catalog_category_entity_int` AS `status`
INNER JOIN `eav_attribute` AS `attr` ON `attr`.`attribute_code` = 'is_active'
AND `attr`.`entity_type_id` = 3
AND `status`.`attribute_id` = `attr`.`attribute_id`
SET `status`.`value` = IF((SELECT COUNT(`index`.`product_id`)
    FROM `catalog_category_product_index` AS `index`
    WHERE `index`.`category_id` = `status`.`entity_id` GROUP BY `index`.`category_id`) > 0, 1, 0)
WHERE `status`.`store_id` = 0

Thông tin chi tiết bạn có thể tìm thấy ở đây http://quicktips.ru/all/ leather-all-c Chuyên-with-products-and-show-c chuyên-with-pr /


2

những gì tôi đã làm để ẩn các danh mục trống là viết lại Mage_Catalog_Model_Resource_Category_Tree load()chức năng. Tôi đã tham gia bộ sưu tập sản phẩm với bộ sưu tập danh mục như dưới đây.

    $collection = Mage::getResourceModel('catalog/product_collection');
    Mage::getSingleton('cataloginventory/stock')->addInStockFilterToCollection($collection);
    Mage::getSingleton('catalog/product_visibility')->addVisibleInCatalogFilterToCollection($collection);

 $collection->getSelect()->join(
        array('product_category' => Mage::getSingleton('core/resource')->getTableName('catalog/category_product_index')),
        'product_category.product_id = e.entity_id',
        array('')
    );
    $collection->getSelect()->where('product_category.category_id = '.$this->_table.'.entity_id');
    $select->columns(array('product_count' => $collection->getSelectCountSql()));

thêm mã $arrNodes = $this->_conn->fetchAll($select);này trước dòng này

Và bọc mã này với điều kiện này, lớp này được gọi từ mô hình frontend và backend cũng

  if(!Mage::getSingleton('admin/session')->isLoggedIn())

Tôi đã thêm sản phẩm trường bổ sung có chứa số lượng sản phẩm hoạt động thực tế.

Tôi đang sử dụng mô-đun của bên thứ 3 để hiển thị danh mục trên menu trên cùng và tôi đã đặt điều kiện dựa trên số lượng sản phẩm khi menu được hiển thị.

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.