Magento Soap - 只需一个电话即可获得详细的产品列表

时间:2013-04-04 21:18:34

标签: magento soap magento-1.7 soap-client

我目前正在使用名为'catalogProductList'(http://www.magentocommerce.com/api/soap/catalog/catalogProduct/catalog_product.list.html)的SOAP方法来检索catalogProductEntity数组。

问题是catalogProductEntity没有像'price'和'description'这样的属性。问题是:是否有任何(已经实现的)SOAP方法通过一次调用向我提供此信息?

如果没有,我如何/在哪里可以将此字段添加到返回的值?我的意思是,更改服务器端的PHP代码,以便在一次调用中获得这个“详细的产品列表”。

我正在尝试避免对每个产品进行多次查询以获取此信息。

PS:我正在使用Magento 1.7。


被修改

按照@Mat提示,我编辑了\ app \ code \ core \ Mage \ Catalog \ Model \ Product \ Api.php文件,我的方法items就像这样:

public function items($filters = null, $store = null)
{
    $collection = Mage::getModel('catalog/product')->getCollection()
        ->addStoreFilter($this->_getStoreId($store))
        ->addAttributeToSelect('price')
        ->addAttributeToSelect('description')
        ->addAttributeToSelect('name');

    /** @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) {
        $result[] = array(
            'product_id' => $product->getId(),
            'sku'        => $product->getSku(),
            'price'      => $product->getData('price'),
            'description'=> $product->getData('description'),
            'name'       => $product->getName(),
            'set'        => $product->getAttributeSetId(),
            'type'       => $product->getTypeId(),
            'category_ids' => $product->getCategoryIds(),
            'website_ids'  => $product->getWebsiteIds()
        );
    }
    error_log(print_r($result, true) . "\n", 3, "c:\log.txt");
    return $result;
}

日志文件输出以下结果:

 Array
(
    [0] => Array
        (
            [product_id] => 3
            [sku] => sim12ple1235
            [price] => 99.9500
            [description] => Simple Description
            [name] => Simple Product
            [set] => 4
            [type] => simple
            [category_ids] => Array
                (
                )
            [website_ids] => Array
                (
                    [0] => 1
                )
        )
)

请注意,价格和描述在$ result变量中,但我在客户端应用程序中获得的xml响应是:

<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="urn:Magento" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<SOAP-ENV:Body>
<ns1:catalogProductListResponse>
<storeView SOAP-ENC:arrayType="ns1:catalogProductEntity[1]" xsi:type="ns1:catalogProductEntityArray">
<item xsi:type="ns1:catalogProductEntity">
<product_id xsi:type="xsd:string">3</product_id>
<sku xsi:type="xsd:string">sim12ple1235</sku>
<name xsi:type="xsd:string">Simple Product</name>
<set xsi:type="xsd:string">4</set>
<type xsi:type="xsd:string">simple</type>
<category_ids SOAP-ENC:arrayType="xsd:string[0]" xsi:type="ns1:ArrayOfString"/>
<website_ids SOAP-ENC:arrayType="xsd:string[1]" xsi:type="ns1:ArrayOfString">
<item xsi:type="xsd:string">1</item>
</website_ids>
</item>
</storeView>
</ns1:catalogProductListResponse>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>

我的问题是:是否有任何xml架构或其他配置文件指定输出?我还缺少在服务器端编辑的其他内容吗?

2 个答案:

答案 0 :(得分:3)

要获取产品信息,您必须使用catalog_product.info

您在获取列表之前,然后在列表中循环以获取产品详细信息。

$list = $proxy->catalogProductList($sessionId, $filters);
for($i = 0; $i < count($list); $i ++){
  $current = $list[$i];
  $product = $proxy->catalogProductInfo($sessionId, $current['product_id']);
}

////更新////

更改catalogProductList代码转到

\app\code\core\Mage\Catalog\Model\Product\Api.php

并在

中添加所需的参数
public function items

在周期之前做这样的事情

$collection = Mage::getModel('catalog/product')->getCollection()
        ->addStoreFilter($this->_getStoreId($store))
        ->addAttributeToSelect('name');

你必须添加

->addAttributeToSelect('what_you_need');

    foreach ($collection as $product) {
        $result[] = array(
            'product_id' => $product->getId(),
            'sku'        => $product->getSku(),
            'name'       => $product->getName(),
            'set'        => $product->getAttributeSetId(),
            'type'       => $product->getTypeId(),
            'category_ids' => $product->getCategoryIds(),
            'website_ids'  => $product->getWebsiteIds(),
            'what_you_need' => $product->getData('what_you_need')

        );
    }

////更新///(感谢@matheusjardimb)

最后你需要添加

what_you_need

要素

app/code/core/mage/catalog/etc/wsdl.xml

在xml的这一部分

<complexType name="catalogProductEntity">
            <all>
                <element name="product_id" type="xsd:string"/>
                <element name="sku" type="xsd:string"/>
                <element name="name" type="xsd:string"/>
                <element name="set" type="xsd:string"/>
                <element name="type" type="xsd:string"/>
                <element name="category_ids" type="typens:ArrayOfString"/>
                <element name="website_ids" type="typens:ArrayOfString"/>
                <element name="**what_you_need**" type="xsd:string"/>
            </all>
        </complexType>

答案 1 :(得分:2)

问题是在应用php更改后,文件app / code / core / Mage / Catalog / etc / wsdl.xml中缺少此字段(价格和描述)。

...
<complexType name="catalogProductEntity">
<all>
    <element name="product_id" type="xsd:string"/>
    <element name="sku" type="xsd:string"/>
    <element name="name" type="xsd:string"/>
    <element name="set" type="xsd:string"/>
    <element name="type" type="xsd:string"/>
    <element name="category_ids" type="typens:ArrayOfString"/>
    <element name="website_ids" type="typens:ArrayOfString"/>

    <element name="price" type="xsd:string"/>
    <element name="description" type="xsd:string"/>
</all>
</complexType>
...

并且不要忘记清理CACHE!