如何扩展Magento API catalog_product列表以包含更多的产品信息XML-RPC


How to extend Magento API catalog_product.list to include more product information XML-RPC

好吧,我的情况是这样的。

我们正在使用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代码将会中断。所以要格外小心,不要改变这里添加的属性代码。