0

商品をサブカテゴリーに分けてカテゴリーページを整理しようとしています。サブカテゴリ (catalog\product\list.phtml) をコードでループすると:

$child_cat = Mage::getModel('catalog/category')->load($child_id); $_productCollection = Mage::getResourceModel('catalog/product_collection')->addCategoryFilter($child_cat);

次に、製品をループします...

foreach ($_productCollection を $_product として):

表示されるように設定されている製品と表示されていない製品を区別していないようです (両方が表示されます)。また、画像、価格、またはその他の情報も表示されません。私が得た唯一の正しい情報は、製品の URL です。

なぜこれが起こっているのですか?どうすれば修正できますか?

4

1 に答える 1

3

デフォルトでは、製品コレクションをロードすると、製品に関する最小限の情報が取得されます。元:

Array
(
    [entity_id] => 9
    [entity_type_id] => 4
    [attribute_set_id] => 4
    [type_id] => simple
    [sku] => DLKJFER343
    [has_options] => 0
    [required_options] => 0
    [created_at] => 2012-12-07 16:04:58
    [updated_at] => 2012-12-11 16:21:37
    [cat_index_position] => 0
    [stock_item (Varien_Object)] => Array
        (
        )

)

追加情報をロードするか、次のような値でフィルタリングするように Magento に明示的に指示する必要があります。

$_productCollection = Mage::getResourceModel( 'catalog/product_collection' );
// Filter by enabled products
$_productCollection->addAttributeToFilter( 'status', 1 );
// Load all product information
$_productCollection->addAttributeToSelect( '*' );
$_productCollection->addCategoryFilter( $category );

次のようなものが表示されます ($_product->debug()いくつかの情報をダンプするために使用します)。

Array
(
    [entity_id] => 3
    [entity_type_id] => 4
    [attribute_set_id] => 4
    [type_id] => simple
    [sku] => DLKJFER343
    [has_options] => 0
    [required_options] => 0
    [created_at] => 2012-12-05 18:47:39
    [updated_at] => 2012-12-11 16:20:25
    [cat_index_position] => 0
    [status] => 1
    [visibility] => 4
    [enable_googlecheckout] => 1
    [tax_class_id] => 2
    [is_recurring] => 0
    [weight] => 3.0000
    [price] => 534.2500
    [name] => Sample Product
    [url_key] => some-product
    [is_returnable] => 2
    [msrp_enabled] => 2
    [msrp_display_actual_price_type] => 4
    [image] => /w/r/something.png
    [small_image] => /w/r/something_sm.png
    [thumbnail] => /w/r/something_th.png
    [options_container] => container2
    [url_path] => some-product.html
    [image_label] => One image label
    [small_image_label] => Another image label
    [thumbnail_label] => An image label
    [description] => Long winded blah, blah, blah.
    [short_description] => Blah, blah, blah.
    [stock_item (Varien_Object)] => Array
        (
        )

)

メディア ギャラリー情報 (ラベルなど) は別物であり、オブジェクトのgetMediaGalleryImages()メソッドを通じて具体的に要求する必要があります。Mage_Catalog_Model_Product

ただしNULL、製品コレクションのループ中に呼び出された場合、このメソッドは戻ります。奇妙なことに、製品モデルを明示的にロードしないと、このデータにアクセスできません (理由については、この回答では説明しません)。したがって、次のようなことを試す必要があります。

$product = Mage::getModel( 'catalog/product' )->load( $_product->getId() );
$images = $product->getMediaGalleryImages();

ただし、コレクション ループでこれを行うとパフォーマンスが低下するため、注意してください。


編集:

Mage_Catalog_Block_Product->getLoadedProductCollection()

長い、長い、長い話です(このメソッドは深く掘り下げます)...私が知る限り、に 設定されたgetLoadedProductCollection()属性のみが表示されます。Used In Product ListingYes

ここに画像の説明を入力

その理由は Mage_Catalog_Model_Resource_Config にあります...

public function getAttributesUsedInListing()
{
        // ... some code above omitted...
        ->where('main_table.entity_type_id = ?', (int)$this->getEntityTypeId())
        // THIS RIGHT HERE IS WHY
        ->where('additional_table.used_in_product_listing = ?', 1);

    return $adapter->fetchAll($select);
}
于 2013-01-07T16:08:32.403 に答える