Domanda

Il compito è banale. Devo ottenere un elenco di prodotti per una particolare vista del negozio con un catalogo piatto abilitato. La soluzione più ovvia è la seguente:

$collection = Mage::getResourceModel('catalog/product_collection')
    ->setStore($storeId);

Infatti setStore() Il metodo non sta facendo alcuna differenza qui perché viene chiamato dopo _initSelect() metodo di Mage_Catalog_Model_Resource_Product_Collection che ottiene il nome della tabella piatta in base all'ID Store. Poiché l'ID Store non è ancora impostato, prende l'ID Store corrente.

Quindi l'ovvia soluzione alternativa sarebbe quella di impostare un ID del negozio corrente prima di ottenere un modello.

Mage::app()->setCurrentStore($storeId);

$collection = Mage::getResourceModel('catalog/product_collection');

Funzionerà. Ma solo se hai bisogno di ottenere una collezione una volta. Se hai bisogno di ottenere una collezione nel ciclo o ne hai solo bisogno di due collezioni back to back, non sarai in grado di impostare un negozio specifico per loro.

Il motivo è quello Mage_Catalog_Model_Resource_Product_Flat La classe ha la sua _storeId Proprietà e nel costruttore è impostato sull'ID del negozio corrente. Ecco perché sarà impostato per la prima volta. Quindi per qualche motivo (il paradiso sa che spero ce ne sia uno) Mage_Eav_Model_Entity_Collection_Abstract::_init Ogni modulo di risorse viene recuperato come singleton. Quindi nessun costruttore per la seconda chiamata.

Tutto questo sembra così sbagliato che sono abbastanza sicuro di aver torto e non è un altro bug Magento (o due). Spero che qualcuno possa far luce su di esso.

Nessuna soluzione corretta

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a magento.stackexchange
scroll top