好吧,我的情况是这样的。
我们正在使用Magento商店作为一个在线目录的iPad应用程序的服装店。
有多个类别和几百种产品。
从所有可用的标准api调用到我们使用XML-RPC,我们已经成功地使我们的iPad应用程序工作。
加载类别列表并不需要很长时间。原因在于catalog_product。List只返回产品的基本信息,例如id和sku。因此,我们必须为列表上的每个产品建立一个新的连接,以获得我们需要的其他信息。例如,名称,价格,拇指图像。为100个产品创建一个新的XML-RPC连接非常耗时。目前超过30秒。当然,在第一次加载之后,我们可以将这些信息本地存储在ipad中,但重要的是第一次加载也很快。
示例返回当前方法:catelog_product.list
position = "";
"product_id" = 805;
set = 4;
sku = 1901252;
type = simple;
},
{
position = "";
"product_id" = 807;
set = 4;
sku = 2143405;
type = simple;
},
1) 问题
是否有办法解决这个问题与现有的标准Magento API?
2)问题
如果不是,那么我需要在哪里寻找更新catalog_product。方法,所以它包含了我们需要的额外信息。
注意:我很熟悉PHP,但我不太熟悉Magento的确切结构和它的框架。
转到'app'code'core'Mage'Catalog'Model'Product'Api.php
,找到items方法并查看下一段代码(ce1.6中的第80行)
$result[] = array( // Basic product data
'product_id' => $product->getId(),
'sku' => $product->getSku(),
'name' => $product->getName(),
'set' => $product->getAttributeSetId(),
'type' => $product->getTypeId(),
'category_ids' => $product->getCategoryIds()
);
在这里添加需要的属性,甚至写$result[] = $product->getData();
来获取所有标准属性。如果需要一些自定义属性,请查看代码
$collection = Mage::getModel('catalog/product')->getCollection()
->addStoreFilter($this->_getStoreId($store))
->addAttributeToSelect('name');
上面(我的ce1.6中的第58行)并添加->addAttributeToSelect('<your_attribute_code>')
行。
在app/code/core中修改代码是一个不好的做法。你必须扩展它。
我也遇到了同样的问题,下面是我在Magento CE 1.9.0.1中使用API V2的方法:
-
在app/code/local中创建一个新模块。别忘了在app/etc/modules目录下添加模块。
-
在config.xml中,添加以下重写规则(用你的类名替换):
& lt; global>& lt; models>& lt; catalog>& lt; rewrite>& lt; product_api_v2>NS_Catalog_Model_Product_Api_V2& lt;/rewrite>& lt;/catalog>& lt;/models>& lt;/global>
然后创建类:
class NS_Catalog_Model_Product_Api_V2 extends Mage_Catalog_Model_Product_Api_V2
{
/**
* Retrieve list of products with basic info (id, sku, type, set, name)
*
* @param null|object|array $filters
* @param string|int $store
* @return array
*/
public function items($filters = null, $store = null)
{
$collection = Mage::getModel('catalog/product')->getCollection()
->addStoreFilter($this->_getStoreId($store))
->addAttributeToSelect('name')
->addAttributeToSelect('price')
->addAttributeToSelect('custom_attribute_1')
->addAttributeToSelect('custom_attribute_2') //and so on...
;
/** @var $apiHelper Mage_Api_Helper_Data */
$apiHelper = Mage::helper('api');
$filters = $apiHelper->parseFilters($filters, $this->_filtersMap);
try {
foreach ($filters as $field => $value) {
$collection->addFieldToFilter($field, $value);
}
} catch (Mage_Core_Exception $e) {
$this->_fault('filters_invalid', $e->getMessage());
}
$result = array();
foreach ($collection as $product) {
/** @var Mage_Catalog_Model_Product $product */
$result[] = array(
'product_id' => $product->getId(),
'price' => $product->getPrice(),
'attr_1' => $product->getData('custom_attribute_1'),
'sku' => $product->getSku(),
'name' => $product->getName(),
'set' => $product->getAttributeSetId(),
'type' => $product->getTypeId(),
'category_ids' => $product->getCategoryIds(),
'website_ids' => $product->getWebsiteIds()
);
}
return $result;
}
}
但这还不够……您必须重载wsdl.xml和wsi.xml。
从app/code/core/Mage/Catalog/etc/(wsdl|wsi).xml文件拷贝到你模块的etc目录下
查找实体:complexType name="catalogProductEntity"
将您的自定义属性添加到列表
清除缓存(如果您使用PHP客户端,请记住PHP存储WSDL的副本,默认情况下在/tmp中)
@Zyava已经指出要修改的文件,非常有用。但是我用了另一种方法来修改这个文件:
$result[] = array( // Basic product data
'product_id' => $product->getId(),
'sku' => $product->getSku(),
'name' => $product->getName(),
'set' => $product->getAttributeSetId(),
'type' => $product->getTypeId(),
'category_ids' => $product->getCategoryIds(),
'<your_attribute_code>' => $product->getData('<your_attribute_code>')
);
只需为要检索的属性添加一行。这在我的CE 1.6.1上有效。但是它有一个小问题:如果在Magento管理面板中更改属性代码,API代码将会中断。所以要格外小心,不要改变这里添加的属性代码。