管理モジュールが 1 つあり、そのモジュールでストアごとにカテゴリ コレクションを取得したいので、storefilter を使用してコレクションをフィルタリングするにはどうすればよいですか? addstorefilter はカテゴリ コレクションでは機能しません。
5 に答える
setStore または setStoreId メソッドを使用します。
$collection = Mage:getResourceModel('catalog/category_collection');
// or $collection = Mage::getModel('catalog/category')->getCollection();
$collection->setStoreId($myStoreId)
->load();
更新: これを確認するための簡単なスクリプトがあります。
<?php
require 'app/Mage.php';
Mage::app('admin');
$collection = Mage::getModel('catalog/category')->getCollection()
->addAttributeToSelect('name')
->setStoreId(2)
->load();
echo $collection->count(), "\n";
foreach ($collection as $item) {
echo $item->getName(), "\n";
}
ストア ビューが 3 つある場合、storeId は 3 つになります。管理ストアの場合は 0、デフォルト ストアの場合は 1、別のストアの場合は 2 (またはその他の値) があります。これを確認したところ、動作します。
以下のコードを追加しましたが、それは私のために働いています
$storecategoryid = Mage::app()->getStore($storeid)->getRootCategoryId();
このコードからストアのルート カテゴリ ID を取得します。
$category = Mage::getModel('catalog/category')->getCollection()->addFieldToFilter('is_active',array('eq' => 1))->load();
これから、カテゴリコレクション全体を取得します
foreach($category as $cat)
{
if($cat->getData('level')==2 && $cat->getData('parent_id')==$storecategoryid)
{
echo 'my code';
}
}
このようにして、ストアのカテゴリを取得します。
マジェント1.9で
$storeId=2;
$rootCategoryId = Mage::app()->getStore($storeId)->getRootCategoryId();
$categories = Mage::getModel('catalog/category')
->getCollection()
->setStoreId($storeId)
->addFieldToFilter('is_active', 1)
->addAttributeToFilter('path', array('like' => "1/{$rootCategoryId}/%"))
->addAttributeToSelect('*');
foreach($categories as $categorie)
{
$catid=$cat->getId();
$catname=$categorie->getName();
$catp=catp$categorie->getParent_id();
}
正解は@xpobackに送ってください。多少正しい答えとそうでない答えがいくつかあるので、答えを繰り返したいと思いました。
短い答え、これを使用してください:
$rootId = Mage::app()->getStore()->getRootCategoryId();
$collection = Mage::getModel('catalog/category')
->getResourceCollection()
->addAttributeToSelect('*')
->addFieldToFilter('path', array('like' => "1/{$rootId}/%"))
->addIsActiveFilter();
他の回答の問題を知りたいすべての人のために、読み進めてください。
まず、@Muffadalの回答は機能的ですが、パフォーマンスの点で非常に遅いです。データのクエリを mySQL まで維持し、PHP を使用して大きなコレクションをループさせないようにする必要があります (ストアに複数のカテゴリがある場合)。
使用するその回答の下のコメントaddPathsFilter('/' . $storecategoryid . '/')
も正しいですが、この場合、LIKE 演算子を使用するよりも遅くなります (記事を参照)
@Serjioの方法は、異なるカテゴリを区別するという点では機能しません。それが行うことは、ストア固有の翻訳をプルすることです。例 ストア 1 はカテゴリにRingsという名前を付け、ストア 2 は同じカテゴリにMy Ringsという名前を付けました。彼のコードを使用してストア 2 から呼び出しを行うと、ルートに関係なくすべてのカテゴリがプルされますが、ストア 2 の命名規則であるMy Ringsがプルされます。