【问题标题】:Magento - Filter category resource collection by store_idMagento - 按 store_id 过滤类别资源集合
【发布时间】:2012-12-07 05:02:32
【问题描述】:

我正在尝试提取仅属于当前商店的类别,但它似乎不起作用。任何人都可以在我的代码中看到任何问题吗?

$categoryCollection = Mage::getResourceModel('catalog/category_collection')
  ->setStoreId(Mage::app()->getStore()->getId())
  ->addFieldToFilter('include_in_menu', array('eq' => 1))
  ->addFieldToFilter('is_active', array('eq' => 1))
  ->addFieldToFilter('level', array('eq' => 2))
  ->addAttributeToSelect(array('name','url_path','image','description'))
  ->setOrder('position', 'asc');

$categoryCollection->printLogQuery(true);

这也是从 store_id 0 获取数据,但我只想从 store_id 2 获取数据

SELECT `e`.*, IF(at_include_in_menu.value_id > 0, at_include_in_menu.value, at_include_in_menu_default.value) AS `include_in_menu`, IF(at_is_active.value_id > 0, at_is_active.value, at_is_active_default.value) AS `is_active` FROM `catalog_category_entity` AS `e`
 INNER JOIN `catalog_category_entity_int` AS `at_include_in_menu_default` ON (`at_include_in_menu_default`.`entity_id` = `e`.`entity_id`) AND (`at_include_in_menu_default`.`attribute_id` = '67') AND `at_include_in_menu_default`.`store_id` = 0
 LEFT JOIN `catalog_category_entity_int` AS `at_include_in_menu` ON (`at_include_in_menu`.`entity_id` = `e`.`entity_id`) AND (`at_include_in_menu`.`attribute_id` = '67') AND (`at_include_in_menu`.`store_id` = 2)
 INNER JOIN `catalog_category_entity_int` AS `at_is_active_default` ON (`at_is_active_default`.`entity_id` = `e`.`entity_id`) AND (`at_is_active_default`.`attribute_id` = '42') AND `at_is_active_default`.`store_id` = 0
 LEFT JOIN `catalog_category_entity_int` AS `at_is_active` ON (`at_is_active`.`entity_id` = `e`.`entity_id`) AND (`at_is_active`.`attribute_id` = '42') AND (`at_is_active`.`store_id` = 2) WHERE (`e`.`entity_type_id` = '3') AND (IF(at_include_in_menu.value_id > 0, at_include_in_menu.value, at_include_in_menu_default.value) = 1) AND (IF(at_is_active.value_id > 0, at_is_active.value, at_is_active_default.value) = 1) AND (`e`.`level` = 2)

更新

我只是添加了解决问题的路径过滤器而不是商店过滤器,但仍然想知道商店过滤器是否有效。

$storeId = Mage::app()->getStore()->getId();
$categoryRootId = Mage::app()->getStore($storeId)->getRootCategoryId();;

$categoryCollection = Mage::getResourceModel('catalog/category_collection')
    ->addFieldToFilter('path', array('like' => "%/{$categoryRootId}/%"))
    ->addFieldToFilter('include_in_menu', array('eq' => 1))
    ->addFieldToFilter('is_active', array('eq' => 1))
    ->addFieldToFilter('level', array('eq' => 2))
    ->addAttributeToSelect(array('name','url_path','image','description','store_id'))
    ->setOrder('position', 'asc')
    ->load();

【问题讨论】:

    标签: magento


    【解决方案1】:

    我知道这是一个老问题,但如果有人像我一样在寻找答案:

    ->addStoreFilter( {storeID} )
    

    为我做的...

    【讨论】:

      【解决方案2】:

      我花了很多时间...... 这对我有用...

      $store = Mage::app()->getStore()->getId();
      $rootCategoryId = Mage::app()->getStore()->getRootCategoryId();
      
      $rootpath = Mage::getModel('catalog/category')
                          ->setStoreId($store)
                          ->load($rootCategoryId)
                          ->getPath();
      
      $categories = Mage::getModel('catalog/category')->setStoreId($store)
                          ->getCollection()
                          ->addAttributeToSelect('*')
                          ->addAttributeToFilter('path', array("like"=>$rootpath."/"."%")); 
      

      修复多商店 :)

      setStoreId - 无效,可以删除

      【讨论】:

        【解决方案3】:

        试试这个

        $categoriesCollection = Mage::getModel('catalog/category')
        ->getCollection()
        ->setStoreId(1) 
        ->addFieldToFilter('include_in_menu', array('eq' => 1))
        ->addFieldToFilter('level', array('eq' => 2))
        ->addFieldToFilter('is_active', array('eq'=>'1'))
        ->setOrder('position', 'asc')
        ->addAttributeToSelect('*');
        

        【讨论】:

        • 那也行不通。测试和相同的结果。看起来只有路径过滤器才能完美运行。
        【解决方案4】:

        setStoreId()addAttributeToFielter('store_id', $storeId) 都不起作用,因为类别表中没有 store_id。下面的代码完美运行:

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

        【讨论】:

          【解决方案5】:

          在 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();
          
                              }
          

          【讨论】:

            【解决方案6】:

            你好,看看下面的代码可能对你有帮助

            ->addFieldToFilter('store_id', Mage::app()->getStore()->getId());
            

            $storeId =Mage::app()->getStore()->getStoreId();
            
            $collection->setStoreId($storeId);
            
            $collection->addStoreFilter($storeId);
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2014-02-02
              • 1970-01-01
              • 1970-01-01
              • 2012-03-13
              相关资源
              最近更新 更多