답변:
가장 쉬운 방법은 Mage_Catalog_Block_Navigation
블록을 다시 작성하는 것입니다 .
=> 메소드 _renderCategoryMenuItemHtml()
에서 루프를 교체하려는 경우
foreach ($children as $child) {
if ($child->getIsActive()) {
$activeChildren[] = $child;
}
}
=> 이것으로 :
foreach ($children as $child) {
if ($child->getIsActive() && $this->_hasProducts($child->entity_id)) {
$activeChildren[] = $child;
}
}
=> 및 마찬가지로 메소드 renderCategoriesMenuHtml()
에서 코드를 바꿉니다.
foreach ($this->getStoreCategories() as $child) {
if ($child->getIsActive()) {
$activeCategories[] = $child;
}
}
=> 이것으로 :
foreach ($this->getStoreCategories() as $child) {
if ($child->getIsActive() && $this->_hasProducts($child->entity_id)) {
$activeCategories[] = $child;
}
}
=> 마지막으로 코드에서 방금 사용했던 메소드를 추가하십시오.
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;
}
이 방법은 카탈로그 / 범주 모델을 사용하여 각 범주를 개별적으로 확인합니다. 따라서 범주가 많은 경우 성능 문제가 발생하지 않도록 코드를 다시 작성해야 할 수 있습니다. 우리가 운영하는 작은 상점에서는 이것이 잘 작동합니다.
빈 범주를 숨기는 기본 제공 기능은 없습니다 (그러나 관리 영역-> 카탈로그-> 범주 관리에서 각 범주에 대해 활성 = 아니오)를 수동으로 선택할 수 있습니다)
다음은 Josh Prattski의 블로그에 실린 훌륭한 게시물에 대한 링크입니다. 여기 에서이 목적을위한 확장 방법을 단계별로 살펴 보았습니다 .
최상위 메뉴에서 빈 범주를 숨기려면 다음을 수행하십시오.
app/code/core/Mage/Catalog/Block
폴더로 이동하여 복사하십시오Navigation.php
.
Navigation.php
로컬 패키지를 재정의 하십시오. 여Navigation.php
패키지의이 파일에 다음 코드를 붙여 넣습니다 :
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;
}
}
나를 위해 일한 것은 템플릿 카테고리 트리를 만들고 카테고리 트리를 렌더링하는 조건 함수를 구현하는 것입니다.
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;
}
다음 sql을 실행하여 제품없이 모든 범주를 비활성화 할 수 있습니다.
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
자세한 내용은 http://quicktips.ru/all/hide-all-categories-without-products-and-show-categories-with-pr/에서 찾을 수 있습니다.
빈 범주를 숨기려고 한 것은 Mage_Catalog_Model_Resource_Category_Tree
load()
기능 을 다시 작성하는 것입니다. 아래와 같이 카테고리 컬렉션으로 제품 컬렉션에 가입했습니다.
$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()));
$arrNodes = $this->_conn->fetchAll($select);
이 줄 앞에이 코드를 추가하십시오 .
그리고이 코드를이 조건으로 감싸십시오.이 클래스는 프론트 엔드 및 백엔드 모델에서도 호출됩니다.
if(!Mage::getSingleton('admin/session')->isLoggedIn())
실제 활성 제품 수를 포함하는 추가 product_count 필드를 추가했습니다.
타사 모듈을 사용하여 최상위 메뉴에 범주를 표시하고 메뉴가 렌더링 될 때 제품 수를 기준으로 조건을 설정했습니다.