【问题标题】:How to extend Magento API catalog_product.list to include more product information XML-RPC如何扩展 Magento API catalog_product.list 以包含更多产品信息 XML-RPC
【发布时间】:2011-12-09 10:58:37
【问题描述】:

好的,这是我的情况。

我们将 Magento Store 用作服装店 iPad 应用程序的在线目录。

有多个类别和数百种产品。

通过使用 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 及其框架的确切结构不是很熟悉。

任何帮助将不胜感激。

【问题讨论】:

    标签: php api magento xml-rpc


    【解决方案1】:

    转到\app\code\core\Mage\Catalog\Model\Product\Api.php,找到 items 方法并查看下一段代码(我的 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>')

    【讨论】:

      【解决方案2】:

      修改 app/code/core 中的代码是一种不好的做法。您将不得不对其进行扩展。

      我遇到了同样的问题,这是我为在 Magento CE 1.9.0.1 中使用 API V2 所做的工作:

      • 在您的 app/code/local 中创建一个新模块。不要忘记在你的 app/etc/modules 目录中添加模块。

      • 在您的 config.xml 中,添加以下重写规则(替换为您的类名):

        NS_Catalog_Model_Product_Api_V2重写> 目录> 模型> 全球>

      然后,创建类:

      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。

      • 从模块的 etc 目录中的 app/code/core/Mage/Catalog/etc/(wsdl|wsi).xml 复制文件。

      • 找到实体:complexType name="catalogProductEntity"

      • 将您的自定义属性添加到列表中

      • 清除缓存(如果您使用 PHP 客户端,请记住 PHP 存储 WSDL 的副本,默认情况下在 /tmp 中)

      【讨论】:

        【解决方案3】:

        @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 代码将中断。所以要特别注意不要更改这里添加的属性代码。

        【讨论】:

        • 属性码在创建后会灰显,不能“意外”更改;)
        猜你喜欢
        • 2012-08-06
        • 2012-03-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-06-27
        • 2013-11-20
        • 2017-04-05
        • 2015-06-14
        相关资源
        最近更新 更多