2012-07-02 3 views
1

У меня есть один модуль администрирования, и я хочу, чтобы в этом модуле хранилась коллекция категорий, поэтому как мы можем фильтровать коллекцию с помощью storefilter? addstorefilter не работает для коллекции категорий.Как фильтровать коллекцию категорий с помощью storefilter?

+0

мое решение, пример кода .... [http: // stackoverflow.ком/а/19284088/1266559] [1] [1]: http://stackoverflow.com/a/19284088/1266559 – Magefast

ответ

1

Я добавить ниже код и его работы для меня

$storecategoryid = Mage::app()->getStore($storeid)->getRootCategoryId(); 

из этого кода я получаю магазин корня CategoryID.

$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

use '-> addIsActiveFilter()' и 'addPathsFilter ('/'. $ Storecategoryid. '/')'. – Serjio

+0

ok Спасибо, и мой код выше работает нормально – Mufaddal

+0

Да, но ваш вопрос был не ясен. Вы хотите фильтровать по корневой категории, а не по магазину – Serjio

1

Использование setStore или setStoreId методы:

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

// or $collection = Mage::getModel('catalog/category')->getCollection(); 

$collection->setStoreId($myStoreId) 
    ->load(); 

UPDATE: Существует простой скрипт, чтобы проверить это:

<?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 магазина видит там будет 3 storeIds. Есть 0 - для магазина admin, 1 - для хранилища по умолчанию и 2 (или другое значение) для другого магазина. Я только что проверил это, и он работает.

+0

Это не работает для меня – Mufaddal

+0

@mufaddal это работает Chek обновление. – Serjio

+0

его все еще не работает или меня – Mufaddal

1
$rootCategoryId = Mage::app()->getStore()->getRootCategoryId(); 
$categories = Mage::getModel('catalog/category')->getCollection(); 
$categories->addAttributeToFilter('path', array('like' => "1/{$rootCategoryId}/%")); 
0

Реквизиты для связи @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 оператора в этом случае (см article)

@Serjio «s метод не будет работать с точки зрения различения между различными категориями , То, что он будет делать, - это перенос специфических переводов в магазине. Пример Магазин 1 назвал категорию Кольца, Магазин 2 назвал ту же категорию Мои круги. Если сделать вызов из магазина 2, используя свой код, он будет тянуть все категории независимо от корня, но потянет накопитель 2 в соглашении об именах - Моих Кольца

0

В Magento 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(); 
       } 
Смежные вопросы