2013-02-26 11 views
5

私はmagento製品のコレクションを無効状態でフィルタリングする必要があります。 Magentoは、デフォルトでは、コレクションをロードするときに無効な製品を無視するように見えます。障害のある商品を含むMagento荷物コレクション

は私の質問には2つの部分があります。

1 - どのように私は無効になった製品を含むMagentoの中でコレクションを読み込むことができますか? 2 - Magentoは、コレクション内の無効な製品を最初に読み込まないのはなぜですか?

私は、コレクションをロードするための標準的なコードを使用しています:

$collction = Mage::getModel('catalog/product')->getCollection() 

これが無効になった製品をロードすることはありません。

答えて

7

あなたが製品フラット構造を使用する場合は、

$col = Mage::getModel('catalog/product')->getCollection(); 

(例えば。catalog_product_flat_1)平らなテーブルを使用しますが、とdisabled製品は、そのテーブルの一部ではありません。

変更「NO」に設定Use Flat Catalog Product、あなたは、コレクション内のすべての製品を持つことになります。 catalog-flat

それはすべての製品をこのようにロードします。

+0

の無効コレクションを取得するには2

にDISABLE変更ステータスをロードしたい場合、これは途中でそこに私を得ました。それはフラットテーブルの使用を中止しましたが、まだ 'mage_catalog_category_product'の代わりに' mage_catalog_category_product_index'テーブルに加わっていますので、まだ無効な製品を手に入れることはできません。 –

+0

' - > setStoreId(Mage_Core_Model_App :: ADMIN_STORE_ID)'を適用して動作させました。フラットカタログ製品の使用をオフにしない限り、Magentoはそれが想定されていないときに使用してエラーをスローします。だから私はそれらを一緒に使用しなければならなかった –

-5

これは、無効な製品によってフィルタリングされたコレクションを読み込む必要があります。

$products = Mage::getModel('catalog/product')->getCollection() 
     ->setStoreId(Mage::app()->getStore()->getId()) 
     ->addAttributeToFilter('status', '0'); 
+4

まず、無効状態は '2'です。第二に、無効にされた製品は最初からコレクションに含まれていないため、フィルタリングは役に立ちません。 –

+0

無効な製品stautsは「2」で、「0」ではありません。 – Mohamed23gharbi

2

あなたは(良好な性能を維持するために)バックオフィスであなたの設定を変更したくない場合は、私が唯一の無効製品をしたいので、私は、あなたの要求が処理されている間だけの値を変更し、この解決策を見つけたが特定の機能のために:

Mage::app()->getStore()->setConfig('catalog/frontend/flat_catalog_product', 0); 

あなたが呼び出す最初の時間の前にこれを設定する必要があります:私はあなたが同じ要求時に1に戻って、それを設定することはできません気づい

Mage::getModel('catalog/product')->getCollection() 

、プロなぜならコレクションモデルストアはこのフラグをメモリに保持しているからです。

このようにして、私のデータベースの設定は変更されませんでした。有効な平らな製品で

0

、あなたはより良いあなたが無効になり、対応製品を検索することができるようになります

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

を使用すると思います。

より良い説明のためにこの回答を参照してください。 https://magento.stackexchange.com/a/40001/32179

0

あなたのコレクションを取得したら、あなたが使用してテーブルに参加することができます - > joinTable( 'cayaloginventory/stock_item'、 'PRODUCT_ID = ENTITY_ID'、配列( 'stock_statusを' = > 'is_in_stock'))

これは在庫がある製品で必要なテーブルを読み込みます。addAttributeToFilter( 'status'、array( 'eq' => 1))... this AVAILABLEのみをロードします。あなたはすべての製品

 $collection = Mage::getModel('catalog/product') 
        ->getCollection() 
        ->joinTable('cataloginventory/stock_item', 'product_id=entity_id', array("stock_status" => "is_in_stock"))   
        ->addAttributeToFilter('status', array('eq' => 2));