好的,这是我的情况。
我们正在使用Magento Store作为服装店iPad App的在线目录。
有多个类别和几百种产品。
从使用XML-RPC的所有标准api调用开始,我们设法让我们的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.list方法,以便它包含我们需要的额外信息。
注意:我对PHP非常熟悉,但我对Magento及其框架的确切结构并不熟悉。
非常感谢任何帮助。
答案 0 :(得分:3)
转到\app\code\core\Mage\Catalog\Model\Product\Api.php
,查找项目方法并查看下一段代码(我的CE 1.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');
以上(我的CE 1.6中的第58行)并添加行->addAttributeToSelect('<your_attribute_code>')
。
答案 1 :(得分:1)
修改app / code / core中的代码是一种不好的做法。你必须扩展它。
我遇到了同样的问题,这就是我在Magento CE 1.9.0.1中使用API V2所做的工作:
在您的app / code / local中创建一个新模块。不要忘记在app / etc / modules目录中添加模块。
在config.xml中,添加以下重写规则(替换为您的类名):
&LT;全局&GT; &LT;型号GT&; &LT;目录&GT; &LT;重写&GT; &LT; product_api_v2&GT; NS_Catalog_Model_Product_Api_V2&LT; / product_api_v2&GT; &LT; /重写&GT; &LT; /目录&GT; &LT; /模型&GT; &LT; /全球&GT;
然后,创建类:
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)
答案 2 :(得分:0)
$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代码将会中断。因此,请特别注意不要更改此处添加的属性代码。