2012-10-05 65 views
1

我正在遍历Magento中的产品列表。我确实使用setCategoryIds()分配了新的分类ID,但旧分配不会被删除。 类似产品A在类别X.现在我想A在类别Y和Z和X.我做一个setCategoryIds(Y,Z),现在产品是在X,Y和Z.如何删除Magento中某个类别的产品分配?

如何不使用SOAP API以编程方式删除它?

回答

2

其实,setCategoryIds应该重置所有先前的类别,如果他们没有被设置的那些之中。我创建了一个测试shell脚本test.php的来测试它:

<?php 
require_once 'abstract.php'; 

/** 
* Magento Test Assignment Script 
* 
* @category Mage 
* @package  Mage_Shell 
*/ 
class Mage_Shell_Test extends Mage_Shell_Abstract 
{ 
    /** 
    * Run script 
    * 
    */ 
    public function run() 
    { 
     $productId = $this->getArg('product'); 
     $catIdsString = $this->getArg('categories'); 
     $catIds = explode(',', $catIdsString); 
     /** @var $product Mage_Catalog_Model_Product */ 
     $product = Mage::getModel('catalog/product')->load($productId); 
     $product->setCategoryIds($catIds); 
     $product->save(); 
     print_r($product->getCategoryIds()); 
    } 

    /** 
    * Retrieve Usage Help Message 
    * 
    */ 
    public function usageHelp() 
    { 
     return <<<USAGE 
Usage: php -f test.php -- [options] 
     php -f test.php -- --product 1 --categories 3,4 

    --product <product>  Product Id 
    --categories <categories> Categories to assign, comma separated 
    help      This help 

USAGE; 
    } 
} 

$shell = new Mage_Shell_Test(); 
$shell->run(); 

你可以将其插入到你的文件夹shell并尝试运行关联。

+0

我会尝试在星期一在工作:3 –

+0

好吧,尝试了一个产品在类别14,15和18.将其设置为15和20,结果是14,15,18和20 ...我真的不明白它... –

+0

有什么比你的代码搞砸了......试图关闭你所有的自定义模块,看看问题是否依然存在。此外,查看错误日志内容也许非常有用,可能是在产品保存过程中被粉碎的东西 –

0

试试这个:

$proxy = new SoapClient('http://magentohost/api/soap/?wsdl'); 
$sessionId = $proxy->login('apiUser', 'apiKey'); 

$categoryId = 5; // Put here your category id 
$storeId = 1; // You can add store level 

$assignedProducts = $proxy->call($sessionId, 'category.assignedProducts', array($categoryId, $storeId)); 
var_dump($assignedProducts); // Will output assigned products. 

// Assign product 
$proxy->call($sessionId, 'category.assignProduct', array($categoryId, 'someProductSku', 5)); 

// Update product assignment postion 
$proxy->call($sessionId, 'category.updateProduct', array($categoryId, 'someProductSku', 25)); 

// Remove product assignment 
$proxy->call($sessionId, 'category.removeProduct', array($categoryId, 'someProductSku')); 

请点击此链接:See Here

+0

我应该提到这一点。客户不允许使用SOAP API。必须有一种方法没有... –

相关问题