4

Web サービスから Magento ID のリストを取得します。これらを and array にロードするので、次の$product_idsようになります。

Array
(
    [0] => 1965
    [1] => 3371
    [2] => 1052
)

次に、これをコレクションにすることができます。

$collection = Mage::getModel('catalog/product')->getCollection()
            ->addIdFilter($product_ids);

私の Magento インスペクタを使用して、カテゴリ ページがクラスを使用してMage_Catalog_Block_Product_List製品のリストを表示することを確認しました。私は自分のクラスで似たようなことをしたいと思っています。読み込んでみました:

$ProductList = new Mage_Catalog_Block_Product_List();
$ProductList->setCollection($collection);

そして、次のように結果の HTML を読み込もうとしました。

$CollectionHTML = $ProductList->_toHtml();

しかし$CollectionHTML、空です。

リスト ビューに表示される HTML を取得するにはどうすればよいですか (つまり、生成された frontend/base/default/template/catalog/product/list.phtml の出力ですが、コレクションが与えられます)。

4

1 に答える 1

3

Magento では、醜いレガシー コードを操作するよりも、コードを正しく機能させる方がはるかに簡単です。特定の質問がある場合は、コードを適切な方法で作成するのを喜んでお手伝いします. また、長期的には、技術的負債のコストがさらに高くなります。

とにかく、あなたの問題に戻ります。

Magento ブロックでは、他のアプリのようにインスタンス化されません$myvar = new className... ほとんどありません。このチュートリアルは、Magento のレイアウトとブロックをよりよく理解するのに役立ちます。

ただし、ブロックを作成する場合は、次の方法があります。

$block = Mage::getSingleton('core/layout')->createBlock('catalog/product_list')

Mage_Catalog_Block_Product_List::_getProductCollection製品コレクションに関連して、実際の動作を確認する必要があります。これは、単純な製品コレクションではなく、階層化されたナビゲーションを使用しているためです。

さらに、少なくとも Magento コントローラーを使用していて、関数内にいると仮定すると、次のコードは指定されたカテゴリの製品の最初のページを表示します。

//$category_id needs to be set
$layout = Mage::getSingleton('core/layout');
$toolbar = $layout->createBlock('catalog/product_list_toolbar');
$block = $layout->createBlock('catalog/product_list');
$block->setChild('toolbar', $toolbar);
$block->setCategoryId($category_id);
$block->setTemplate('catalog/product/list.phtml');  
$collection = $block->getLoadedProductCollection();
$toolbar->setCollection($collection);
//render block object 
echo $block->renderView();  

特定の ID の表示:

  • $category_id 変数にルート カテゴリ ID を使用します (表示ルート カテゴリが設定されていることも確認します (または、製品 ID を含む別のカテゴリ ID)
  • イベントにフックしてcatalog_block_product_list_collection、ID フィルターをコレクションに追加できます (これは_beforeToHtml関数で呼び出されます) 。

しかし、これらの構造はすべてしっかりしたものではなく、まだ注意が必要な点がいくつかあります (他の子ブロック、フィルターなど)。

于 2012-10-19T22:30:47.093 に答える