2013-02-08 17 views
10

Ho uno strano problema e sembra che molti stiano avendo lo stesso su internet. Sotto l'immagine definirà il mio problema e anche la mia versione Magento è 1,7magento che mostra il conteggio dei prodotti errato nella categoria

enter image description here

Come ho già evidenziato, SINISTRA dice la categoria dispone di 16 prodotti, ma nella reale Categoria Prodotti scheda mostra 15 prodotti. Tutte le mie categorie sono incasinate. Per favore fatemi sapere cosa non va. Ho provato a disabilitare la cache, ma non ha funzionato.

[Edit]

Ho provato a rimuovere un prodotto dalla categoria, quindi il numero a sinistra è andato a 15 e un totale record di 14. Così ho pensato che può essere un prodotto la cui viene disattivato in là in questa categoria . Ma quando ho cercato prodotti disabilitati, nessuno era presente.

risposta

4

Hi conteggio prodotto deriva dal nome del metodo loadProductCount che è situato in posizione code/core/Mage/Catalog/Model/Resource/Category/Collection.php

Se si scava nel profondo questo conteggio è venuta da una query di join tra due tabelle: catalog_category_product e catalog_category_entity

ho fissato questo problema utilizzando l'osservatore di eventi. puoi fare lo stesso per il tempo. E fammi sapere se trovi una soluzione migliore.

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;   
} 

evento utilizzato in 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's method to be called --> 
<args></args> <!-- additional arguments passed to observer --> 
</catalog_product_delete_after_handler> 
</observers> 
</catalog_product_delete_after> 
</events> 
+0

hai detto che stavi avendo lo stesso problema? –

+0

Sì, stavo affrontando lo stesso problema in Magento 1.7 CE. In qualche modo dopo la cancellazione del prodotto, la voce non veniva rimossa dalla tabella catalog_category_product. –

+0

Quale evento stai osservando? – CarComp

12

Questo li risolverà.

DELETE FROM 
catalog_category_product 
where product_id NOT IN (SELECT entity_id FROM (catalog_product_entity)) 

Quindi, implementare la soluzione nell'osservatore per evitare che accada di nuovo.

2

Una semplice soluzione a questo è andare in app/code/core/Mage/Catalogo/Modello/category.php

o è meglio creare un file locale in modo che non gli effetti, mentre di aggiornamento Magento. Quindi creare app/code/local/Mage/Catalogo/Modello/category.php

In questo modello creare una nuova funzione dire 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(); 

}

Passare al modello file phtml dove si esegue il conteggio del prodotto di categoria. Nel caso generale è: tema/template/catalog/navigazione/left.phtml

ora chiamare la funzione di cui sopra, come richiesto, come:

<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> 
Problemi correlati