【问题标题】:Magento: Filter products by StatusMagento:按状态过滤产品
【发布时间】:2011-10-02 19:44:11
【问题描述】:

我在这里遇到了一些严重的 Magento 问题。正如预期的那样:

$products = Mage::getModel('catalog/category')->load($category_id)
->getProductCollection()
->addAttributeToSelect('*')
->addAttributeToFilter('status', array('eq' => 1));

将为我的 $category_id 返回所有已启用的产品。然而这个:

$products = Mage::getModel('catalog/category')->load($category_id)
->getProductCollection()
->addAttributeToSelect('*')
->addAttributeToFilter('status', array('eq' => 0));

不退回已禁用的产品。我似乎找不到退货的方法,我也不知道为什么。

我试过了:

Mage::getSingleton('catalog/product_status')->addVisibleFilterToCollection($products);

这本来是可行的,但显然可能已被弃用。

有谁知道如何获取一个类别中的所有产品,启用和禁用?

【问题讨论】:

  • 如果您使用平面目录,您将无法退回已禁用的产品,因为平面目录仅收集已启用的产品。
  • 我明白了,有没有办法解决这个问题?编辑:查看我的设置,使用平面目录产品和使用平面目录类别都设置为否。这是否意味着我没有使用平面目录?
  • 确实,说明你没有使用平面目录...
  • 那么从技术上讲,我应该能够退回已禁用的产品!

标签: magento collections filter status


【解决方案1】:

别担心,你只是被一个非常不寻常的常量定义困住了^^。试试看:

$products = Mage::getModel('catalog/category')->load($category_id)
->getProductCollection()
->addAttributeToSelect('*')
->addAttributeToFilter(
    'status',
    array('eq' => Mage_Catalog_Model_Product_Status::STATUS_DISABLED)
);

无论出于何种原因,Varien 决定将这个 STATUS_DISABLED 常量定义为值 2,而不是更直观(且常用)的值 0

【讨论】:

  • 很好的答案!我没有时间测试它,但你似乎知道它会起作用。我将其标记为正确并稍后测试!
  • 救命稻草!禁用=2。谁会想到它。
  • 实际上......这仅在您不使用平面表时才有效。禁用的产品不包含在平面表中,因此无法从产品集合中检索。
  • @Benubird:除了OP的系统使用EAV(不是平面)之外,无论如何,你的主要观点是错误的。没错,平面产品表不包含禁用产品。但是你错了,当启用平面产品时,无法从产品集合中检索禁用的产品。你可以。只需使用管理商店。
  • @JürgenThelen 我刚刚又检查了一遍,你是对的。我记得看过 getProductCollection 的定义,它为管理员使用了平面表,但现在我找不到了;我一定是一开始就读错了。仍然认为值得注意的是,好像您要按状态和存储进行过滤(这是隐含的),它变得更加复杂。而且您还没有在答案中包含 setStore() 。
【解决方案2】:

我认为你可以通过将 store 设置为默认值来做到这一点

Mage::app()->setCurrentStore(Mage_Core_Model_App::ADMIN_STORE_ID);

确保您保存当前存储值并在执行上述操作后将其重新设置。

或者通过使用外部magento的脚本并调用mage by

require_once '../app/Mage.php';
$app = Mage::app();
Mage::register('isSecureArea', true);

【讨论】:

    【解决方案3】:
    $products = Mage::getModel('catalog/category')->load($category_id)
            ->getProductCollection()
            ->addAttributeToSelect('*') 
            ->addAttributeToFilter('status', 1) 
            ->addAttributeToFilter('visibility', 4) 
            ->setOrder('price', 'ASC'); 
    

    【讨论】:

    • 如何添加过滤器状态,created_at,entity_name for -> $order->getStatusHistoryCollection()->getData(); @Hassan Ali Shahzad
    【解决方案4】:

    我还没有找到上述问题的答案。但是我通过使用不同的方法节省了很多时间。

    我导出了 Magento 中所有产品的 CSV,删除了除类别 ID 和 SKU 之外的所有列(这就是我所需要的),然后过滤它以返回所有 sku。

    如果这里的代码对任何人有帮助 -

    <?php
    $file  = fopen('allprods.csv', 'r');
    
    // You can use an array to store your search ids, makes things more flexible.
    // Supports any number of search ids.
    $id = array($_GET['id']);    
    // Make the search ids safe to use in regex (escapes special characters)
    $id = array_map('preg_quote', $id);
    // The argument becomes '/id/i', which means 'id, case-insensitive'
    $regex = '/'.implode('|', $id).'/i';
    
    $skus = array();
    while (($line = fgetcsv($file)) !== FALSE) {  
        list($ids, $sku) = $line;
    
        if(preg_match($regex, $ids)) {
            $skus[] = $sku;
        }
    }
    
    $count = count($skus);
    $i = 1;
    
    echo $category_id;
    foreach ($skus as $sku){
        echo $sku;
        if($i != $count) { echo "`"; }
        $i++;
    }
    

    此解决方案是使用先前有关过滤 CSV 的主题 here

    创建的

    所以现在,我可以活下来。但是 - 这个问题的答案仍然需要!

    【讨论】:

      【解决方案5】:

      如果catalog_flat_product 在后端配置->目录中打开,则不起作用。

      试试这个..这将最终启用和禁用所有产品

      $collection = Mage::getResourceModel('catalog/product_collection'); //this will give you all products
      foreach($collection as $col)
      {
      $var = Mage::getModel('catalog/product')->loadByAttribute('sku',$col->getSku());
      echo"<pre>";print_r($var->getData());echo"</pre>";
      }
      

      它真的很简单,之后您可以轻松地按状态过滤产品

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-04-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-09-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多