【发布时间】:2012-09-26 09:08:51
【问题描述】:
我正在遍历 Magento 中的产品列表。我确实使用setCategoryIds() 分配了新的类别ID,但不会删除旧的分配。
就像产品 A 在类别 X 中一样。现在我希望 A 在类别 Y 和 Z 中并且不在 X 中。我执行 setCategoryIds(Y,Z),现在产品在 X、Y 和 Z 中。
如何在不使用 SOAP API 的情况下以编程方式删除它?
【问题讨论】:
我正在遍历 Magento 中的产品列表。我确实使用setCategoryIds() 分配了新的类别ID,但不会删除旧的分配。
就像产品 A 在类别 X 中一样。现在我希望 A 在类别 Y 和 Z 中并且不在 X 中。我执行 setCategoryIds(Y,Z),现在产品在 X、Y 和 Z 中。
如何在不使用 SOAP API 的情况下以编程方式删除它?
【问题讨论】:
实际上,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 文件夹并尝试运行关联。
【讨论】:
Mage::getSingleton('catalog/category_api')->assignProduct($category->getId(),$product->getId()) 是我之前使用的,它只是添加到类别中。 $product->setCategoryIds($catIds) 帮助清理了类别,只设置我说要设置的内容,并清除任何其他类别。
getSingleton,您可以通过Mage::getSingleton('catalog/category_api')->removeProduct($category->getId(),$product->getId());从类别中删除产品
试试这个:
$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
【讨论】: