Câu trả lời:
Cách dễ nhất để làm điều này là chỉ viết lại Mage_Catalog_Block_Navigation
khố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.
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.
Để ẩ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/Block
Thư mục và sao chépNavigation.php
.Ghi đè
Navigation.php
trong 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;
}
}
Đ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;
}
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 /
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ị.