web-dev-qa-db-fra.com

Magento: Filtrer les produits par statut

J'ai de sérieux problèmes avec Magento ici. Comme prévu, les éléments suivants:

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

Renvoie tous les produits activés pour mon $ category_id. Cependant ceci:

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

Ne renvoie pas les produits désactivés. Je n'arrive pas à trouver un moyen de retourner les produits désactivés, et je ne sais pas pourquoi.

J'ai essayé ça:

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

Ce qui était censé avoir fonctionné, mais aurait peut-être été déprécié.

Est-ce que quelqu'un sait comment activer et désactiver tous les produits d'une catégorie?

22
Tristar Web Design

Ne vous inquiétez pas, vous avez simplement été piégé par une définition constante très inhabituelle ^^. Essayez simplement:

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

Pour quelque raison que ce soit, Varien a décidé de définir ce STATUS_DISABLED constant avec une valeur de 2, au lieu de la valeur plus intuitive (et couramment utilisée) de 0.

45
Jürgen Thelen

Je pense que vous pouvez le faire en définissant le magasin par défaut comme

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

assurez-vous que vous enregistrez la valeur actuelle du magasin et la définissez après avoir fait ce qui précède.

Ou en utilisant un script extérieur à magento et en invoquant mage par

require_once '../app/Mage.php';
$app = Mage::app();
Mage::register('isSecureArea', true);
3
Nasaralla
$products = Mage::getModel('catalog/category')->load($category_id)
        ->getProductCollection()
        ->addAttributeToSelect('*') 
        ->addAttributeToFilter('status', 1) 
        ->addAttributeToFilter('visibility', 4) 
        ->setOrder('price', 'ASC'); 
1
Hassan Ali Shahzad

Rien ne fonctionne si catalog_flat_product est activé dans la configuration du backend-> catalogue.

essayez ceci ... cela donnera finalement tous les produits activés et désactivés

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

c'est vraiment simple et après cela, vous pouvez facilement filtrer les produits par statut

0
Kingshuk Deb

Je n'ai pas trouvé de réponse en tant que telle à ma question ci-dessus. Mais j'ai gagné beaucoup de temps en utilisant une méthode différente.

J'ai exporté un CSV de tous les produits de mon Magento, supprimé toutes les colonnes sauf l'ID de catégorie et le SKU (c'est tout ce dont j'avais besoin), puis filtré cela pour renvoyer tous les skus à la place.

Si cela aide quelqu'un, voici le code -

<?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++;
}

Cette solution a été créée en utilisant une rubrique précédente sur le filtrage des CSV, ici

Donc pour l'instant, je peux survivre. cependant - une réponse à cette question est encore nécessaire!

0
Tristar Web Design