Magento: Фильтровать продукты по статусу
У меня возникают серьезные проблемы с 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);
который должен был работать, но, возможно, он устарел.
Кто-нибудь знает, как получить все продукты в категории, включенные и отключенные?
Ответы
Ответ 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
Я думаю, вы можете сделать это, установив для хранилища значение по умолчанию, например
Mage::app()->setCurrentStore(Mage_Core_Model_App::ADMIN_STORE_ID);
убедитесь, что вы сохранили текущее значение хранилища и вернули его после выполнения вышеуказанного.
Или используя script из внешнего пурпурного и вызывать мага
require_once '../app/Mage.php';
$app = Mage::app();
Mage::register('isSecureArea', true);
Ответ 3
Я не нашел ответа как такового на мой вопрос выше. Но я сэкономил много времени, используя другой метод.
Я экспортировал 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, здесь
Итак, теперь я могу выжить. однако ответ на этот вопрос по-прежнему необходим!
Ответ 4
Ничего не работает, если catalog_flat_product
включен в конфигурацию backend configuration- > .
попробуйте это.. это даст всем включенным и отключенным продуктам в конечном счете
$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>";
}
его действительно просто, и после этого вы можете легко фильтровать продукты по статусу
Ответ 5
$products = Mage::getModel('catalog/category')->load($category_id)
->getProductCollection()
->addAttributeToSelect('*')
->addAttributeToFilter('status', 1)
->addAttributeToFilter('visibility', 4)
->setOrder('price', 'ASC');