之前的提供者通过多次更改Magento 1.6.2.0发行版的核心杀死了几只小猫。
因此,为了在创纪录的时间内解决一个问题,我们不得不拧螺丝,击中小猫的胸襟:我们仍然保留修改后的API:catalog_category.assignProduct
。
到目前为止,我们有这个方法的API:
public function assignProduct($categoryId, $productId, $position = null, $identifierType = null)
{
$datos = explode('|', $categoryId);
$productId = array_shift($datos);
$categorias_actuales = Mage::getModel('catalog/category')
->getCollection()
->addIsActiveFilter()
->addIdFilter($datos)
->addLevelFilter(3)
->getAllIds();
$incat = function($cat) use ($categorias_actuales) {
return in_array($cat, $categorias_actuales);
};
$result = array_combine($datos, array_map($incat, $datos));
try {
$product = Mage::helper('catalog/product')->getProduct($productId, null, $identifierType);
$product->setCategoryIds($categorias_actuales);
$product->save();
} catch (Mage_Core_Exception $e) {
$this->_fault('data_invalid', $e->getMessage());
} catch (Exception $e) {
$this->_fault('internal_error', $e->getMessage());
}
return $result;
}
API的意图是为一个产品同时分配多个类别。然而,这是一个修改过的版本,因为之前的速度慢得令人望而却步。奇怪的事实是,直到最近才起作用。它的意图是:
- 只使用第一个参数,而不是整数值,在这里杀死了一只小猫,API现在期望一个类似
"productId|catgId1|catgId2|cargId3|..."
的字符串,其中第一个值是产品id,倒数第二个值是类别id;它们中的每一个都是整数值。参数由管道字符("|")打断,并弹出产品id。通过这种方式,我们在一个var中有product id,在另一个变量中有categories数组 - 获取categories集合,该集合只保留级别3(即树中类别的深度)中的活动类别,这些活动类别的id在指定的类别中。这意味着:如果提供的类别是数组(3,5,7,8)(例如来自"245|3|5|7|8"参数,即产品id"245"),并且其中一个类别不存在或不活动(例如7不活动,8不存在),则
$categorias_actuales
中的返回值为[3,5] - 对于调试porpuse,将每个输入类别映射到存在性和有效性。这意味着:存在的&;活动&;level=3类别的值为"true",而不存在或不活动的类别的值将为"false"。对于给定的示例,返回的数组将是:array(3=>true,5=>true,7=>false,8=>false),因为7不是活动的,8不存在
- 在try-catch块中:a.检索产品;b.将过滤后的id(在示例中:[3,5])设置为刚刚获取的产品中的产品类别;c.保存产品
但是,我有以下问题:
- 函数返回true,所以返回$result不会给我返回值的数组$results(我的意图是知道产品实际插入了哪些类别)
- 在返回语句中更改为
false
而不是$result
根本没有效果:从API调用获取/显示的值仍然是true
- 抛出
new Exception("something's going on here")
根本没有效果。输出端仍为true
- CCD_ 9和CCD_。还在输出端看到(你猜怎么着?)
true
- 编辑:还尝试了语法错误!!(你猜怎么着?什么都没发生)
我不仅尝试了这些步骤,还刷新了缓存(系统>缓存管理>全选并刷新,甚至单击"刷新Magento缓存"按钮)。
问题:1.考虑到之前的问题:如何调试API调用?2.是什么原因导致产品没有与其类别一起保存?通过调用category.level,我可以看到给定的id(即在category.assignProduct的第一个参数中给定的id)存在。
我是一个n00b@magento API,也许我错过了一些通常显而易见的东西。如有任何帮助,我们将不胜感激。
您禁用编译了吗?你可以用这两种方法中的一种。
-
管理员中的
System -> Tools -> Compilation
-
使用SSH/shell并导航到您的magento根目录。执行以下命令:
cd shell
php -f compiler.php disable
此外,如果您的web服务器在apc.stat
设置为0
的情况下运行PHP APC(您可以通过运行php -i | grep apc.stat
或在任何phpinfo()
输出中查找它来检查这一点),请重新启动您的apache2
web服务器,或者如果您使用php5-fpm
,也要重新启动该服务器。
然后,如果所有其他操作都失败了,请尝试在app/code/local
中查找等效文件。
例如,如果您的文件位于app/code/core/Mage/Path/ToApiFile.php
中的某个位置,请在app/code/local/Mage/Path/ToApiFile.php
中查找本地版本。
最后,一个非常有用的shell命令用于搜索代码实例:
$ cd app/code/
$ grep -rin "function assignProduct" *