Magento показывает неправильный товар в категории
У меня странная проблема, и многие из них имеют то же самое в Интернете. Ниже снимок будет определять мою проблему, а также мою версию magento составляет 1.7
![enter image description here]()
Как я выделил, LEFT говорит, что в категории есть 16 продуктов, но на самом деле вкладка Category Products отображает 15 продуктов. Все мои категории испорчены. Пожалуйста, дайте мне знать, что происходит не так. Я попытался отключить кеш, но он не сработал.
[изменить]
Я попытался удалить один продукт из категории, затем число слева составило 15 и общее количество записей 14. Поэтому я думал, что это продукт, который отключен там в этой категории. Но когда я искал отключенные продукты, их не было.
Ответы
Ответ 1
Привет, кол-во продуктов приходит из имени метода loadProductCount, который находится в местоположении code/core/Mage/Catalog/Model/Resource/Category/Collection.php
Если вы будете углубляться, этот счет исходит из запроса соединения между двумя таблицами: catalog_category_product
и catalog_category_entity
Я исправил эту проблему, используя event observer. вы можете сделать то же самое на время. И дайте мне знать, если вы найдете лучшее решение.
public function deleteCountCategory (Varien_Event_Observer $observer) {
try {
$product = $observer->getEvent()->getProduct();
$productId = $product->getId();
$resource = Mage::getSingleton('core/resource');
$writeConnection = $resource->getConnection('core_write');
$tableName = $resource->getTableName('catalog_category_product');
$query = "DELETE FROM {$tableName} WHERE product_id = ".(int)$productId;
$writeConnection->query($query);
} catch (Exception $e) {
throw $e;
}
return $this;
}
Событие, используемое в config.xml
<events>
<catalog_product_delete_after> <!-- identifier of the event we want to catch -->
<observers>
<catalog_product_delete_after_handler> <!-- identifier of the event handler -->
<type>model</type> <!-- class method call type; valid are model, object and singleton -->
<class>countfix/observer</class> <!-- observers class alias -->
<method>deleteCountCategory</method> <!-- observer method to be called -->
<args></args> <!-- additional arguments passed to observer -->
</catalog_product_delete_after_handler>
</observers>
</catalog_product_delete_after>
</events>
Ответ 2
Это исправит их все.
DELETE FROM
catalog_category_product
where product_id NOT IN (SELECT entity_id FROM (catalog_product_entity))
Затем реализуем решение в наблюдателе, чтобы оно не повторялось.
Ответ 3
Простое решение для этого - перейти к app/code/core/Mage/Catalog/Model/Category.php
или лучше создать локальный файл, чтобы он не срабатывал при обновлении magento. Итак, создайте
app/code/local/Маг/Каталог/Модель/Категория .php
В этой модели создайте новую функцию: getFrontentProductCount()
public function getFrontentProductCount()
{
$collection = Mage::getResourceModel('catalog/product_collection')
->addCategoryFilter($this);
Mage::getSingleton('catalog/product_status')->addVisibleFilterToCollection($collection);
Mage::getSingleton('catalog/product_visibility')->addVisibleInCatalogFilterToCollection($collection);
return $collection->count();
}
Теперь перейдите в файл шаблона phtml, в котором вы выполняете подсчет продукта категории. В общем случае это: theme/template/catalog/navigation/left.phtml
теперь вызовите вышеуказанную функцию по мере необходимости, например:
<ol>
<?php foreach ($_categories as $_category): ?>
<?php if($_category->getIsActive()): ?>
<li>
<a href="<?php echo $this->getCategoryUrl($_category) ?>"<?php if ($this->isCategoryActive($_category)): ?> class="current"<?php endif; ?>><?php echo $this->htmlEscape($_category->getName()) ?></a> (<?php echo $_category->getFrontentProductCount() ?>)
</li>
<?php endif; ?>
<?php endforeach ?>
</ol>