如何扩展Magento API catalog_product.list以包含更多产品信息XML-RPC

时间:2011-10-17 16:42:11

标签: php api magento xml-rpc

好的,这是我的情况。

我们正在使用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及其框架的确切结构并不熟悉。

非常感谢任何帮助。

3 个答案:

答案 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)

@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代码将会中断。因此,请特别注意不要更改此处添加的属性代码。