Magento: фильтр продуктов по статусу - PullRequest
22 голосов
/ 11 июля 2011

У меня здесь серьезные проблемы с 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);

Что должно было сработать,но, видимо, возможно, устарела.

Кто-нибудь знает, как получить все продукты в категории, включить и отключить?

Ответы [ 5 ]

45 голосов
/ 12 июля 2011

Не волнуйтесь, вы просто попали в ловушку очень необычного определения константы ^^. Просто попробуйте:

$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.

3 голосов
/ 11 июля 2011

Я думаю, что вы можете сделать это, установив для хранилища значение по умолчанию, например

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

, убедитесь, что вы сохранили текущее значение хранилища и вернули его после выполнения вышеуказанного.

Или с помощьюскрипт извне magento и вызов мага

require_once '../app/Mage.php';
$app = Mage::app();
Mage::register('isSecureArea', true);
1 голос
/ 15 марта 2017
$products = Mage::getModel('catalog/category')->load($category_id)
        ->getProductCollection()
        ->addAttributeToSelect('*') 
        ->addAttributeToFilter('status', 1) 
        ->addAttributeToFilter('visibility', 4) 
        ->setOrder('price', 'ASC'); 
0 голосов
/ 11 сентября 2013

Ничего не работает, если в конфигурации бэкенда-> каталог включен catalog_flat_product.

попробуйте это ... в итоге все продукты будут включены и отключены

<code>$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"
"; }

это действительно просто, и после этого вы можете легко фильтровать товары по статусу

0 голосов
/ 11 июля 2011

Я не нашел ответа как такового на мой вопрос выше. Но я сэкономил много времени, используя другой метод.

Я экспортировал CSV из всех продуктов в моем Magento, удалил все столбцы, кроме ID категории и SKU (это все, что мне было нужно), а затем отфильтровал это, чтобы вместо этого вернуть все skus.

Если это кому-нибудь поможет, вот код -

<?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, здесь

Так что пока я могу выжить. однако - ответ на этот вопрос все еще необходим!

...