我有同样的问题,所以我为soap创建了一个自定义模块API:
文件:
应用程序/本地/TreDing/Tapy/。(我的公司/模块)
.etc/api.xml
.etc/config.xml
.etc/wsdl.xml
.Model/New/Api.php
.Model/New/Api/V2.php
应用程序/etc/modules/TreDing_Tapy.xml
所以:
TreDing_Tapy.xml
<?xml version="1.0"?>
<config>
<modules>
<TreDing_Tapy>
<active>true</active>
<codePool>local</codePool>
<depends>
<Mage_Api />
</depends>
</TreDing_Tapy>
</modules>
</config>
api.xml
<?xml version="1.0"?>
<config>
<api>
<resources>
<tapy_new translate="title" module="tapy">
<model>tapy/new_api</model>
<acl>tapy/new</acl>
<title>Test Api</title>
<methods>
<info translate="title" module="tapy">
<title>func Test</title>
<method>info</method>
<acl>tapy/new/info</acl>
</info>
<update translate="title" module="tapy">
<title>func Test</title>
<method>update</method>
<acl>tapy/new/update</acl>
</update>
</methods>
</tapy_new>
</resources>
<acl>
<resources>
<all>
</all>
</resources>
</acl>
<v2>
<resources_function_prefix>
<new>new</new>
</resources_function_prefix>
</v2>
<resources_alias>
<new>tapy_new</new>
</resources_alias>
</api>
</config>
配置文件
<?xml version="1.0"?>
<config>
<modules>
<TreDing_Tapy>
<active>true</active>
<version>1.0</version>
</TreDing_Tapy>
</modules>
<global>
<models>
<tapy>
<class>TreDing_Tapy_Model</class>
</tapy>
</models>
</global>
wsdl.xml
<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns:typens="urn:{{var wsdl.name}}" xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
xmlns="http://schemas.xmlsoap.org/wsdl/"
name="{{var wsdl.name}}" targetNamespace="urn:{{var wsdl.name}}">
<types>
<schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="urn:Magento">
<import namespace="http://schemas.xmlsoap.org/soap/encoding/" schemaLocation="http://schemas.xmlsoap.org/soap/encoding/" />
<!--<complexType name="catalogProductGroupPriceEntityArray">
<complexContent>
<restriction base="soapenc:Array">
<attribute ref="soapenc:arrayType" wsdl:arrayType="typens:catalogProductGroupPriceEntity[]"/>
</restriction>
</complexContent>
</complexType>-->
<complexType name="catalogProductGroupPriceEntity">
<all>
<element name="customer_group_id" type="xsd:string" minOccurs="0"/>
<element name="website" type="xsd:string" minOccurs="0"/>
<element name="price" type="xsd:double" minOccurs="0"/>
</all>
</complexType>
<complexType name="catalogProductGroupPriceEntityArray">
<complexContent>
<restriction base="soapenc:Array">
<attribute ref="soapenc:arrayType" wsdl:arrayType="typens:catalogProductGroupPriceEntity[]"/>
</restriction>
</complexContent>
</complexType>
</schema>
</types>
<message name="newInfoRequest">
<part name="sessionId" type="xsd:string"/>
<part name="product" type="xsd:string"/>
<part name="identifierGroup" type="xsd:string"/>
</message>
<message name="newInfoResponse">
<!--<part name="result" type="xsd:string" />-->
<part name="result" type="typens:catalogProductGroupPriceEntityArray"/>
</message>
<message name="newUpdateRequest">
<part name="sessionId" type="xsd:string"/>
<part name="product" type="xsd:string"/>
<part name="group_price" type="typens:catalogProductGroupPriceEntityArray"/>
<part name="identifierType" type="xsd:string"/>
</message>
<message name="newUpdateResponse">
<part name="result" type="xsd:int"/>
</message>
<portType name="{{var wsdl.handler}}PortType">
<operation name="newInfo">
<documentation>api test</documentation>
<input message="typens:newInfoRequest" />
<output message="typens:newInfoResponse" />
</operation>
<operation name="newUpdate">
<documentation>Update product group prices</documentation>
<input message="typens:newUpdateRequest"/>
<output message="typens:newUpdateResponse"/>
</operation>
</portType>
<binding name="{{var wsdl.handler}}Binding" type="typens:{{var wsdl.handler}}PortType">
<soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http" />
<operation name="newInfo">
<soap:operation soapAction="urn:{{var wsdl.handler}}Action" />
<input>
<soap:body namespace="urn:{{var wsdl.name}}" use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" />
</input>
<output>
<soap:body namespace="urn:{{var wsdl.name}}" use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" />
</output>
</operation>
<operation name="newUpdate">
<soap:operation soapAction="urn:{{var wsdl.handler}}Action"/>
<input>
<soap:body namespace="urn:{{var wsdl.name}}" use="encoded"
encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
</input>
<output>
<soap:body namespace="urn:{{var wsdl.name}}" use="encoded"
encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
</output>
</operation>
</binding>
<service name="{{var wsdl.name}}Service">
<port name="{{var wsdl.handler}}Port" binding="typens:{{var wsdl.handler}}Binding">
<soap:address location="{{var wsdl.url}}" />
</port>
</service>
api.php
<?php
class TreDing_Tapy_Model_New_Api extends Mage_Api_Model_Resource_Abstract
{
const ATTRIBUTE_CODE = 'group_price';
public function __construct()
{
$this->_storeIdSessionField = 'product_store_id';
}
public function info($productId, $identifierType = null)
{
$product = $this->_initProduct($productId, $identifierType);
$groupPrices = $product->getData(self::ATTRIBUTE_CODE);
if (!is_array($groupPrices)) {
return array();
}
$result = array();
foreach ($groupPrices as $groupPrice) {
$row = array();
$row['customer_group_id'] = $groupPrice['cust_group'];
$row['website'] = ($groupPrice['website_id'] ?
Mage::app()->getWebsite($groupPrice['website_id'])->getCode() :
'all'
);
$row['price'] = $groupPrice['price'];
$result[] = $row;
}
return $result;
}
public function update($productId, $groupPrices, $identifierType = null)
{
$product = $this->_initProduct($productId, $identifierType);
$updatedGroupPrices = $this->prepareGroupPrices($product, $groupPrices);
if (is_null($updatedGroupPrices)) {
$this->_fault('data_invalid', Mage::helper('catalog')->__('Invalid Group Prices'));
}
$product->setData(self::ATTRIBUTE_CODE, $updatedGroupPrices);
try {
/**
* @todo implement full validation process with errors returning which are ignoring now
* @todo see Mage_Catalog_Model_Product::validate()
*/
if (is_array($errors = $product->validate())) {
$strErrors = array();
foreach($errors as $code=>$error) {
$strErrors[] = ($error === true)? Mage::helper('catalog')->__('Value for "%s" is invalid.', $code) : Mage::helper('catalog')->__('Value for "%s" is invalid: %s', $code, $error);
}
$this->_fault('data_invalid', implode("\n", $strErrors));
}
$product->save();
} catch (Mage_Core_Exception $e) {
$this->_fault('not_updated', $e->getMessage());
}
return true;
}
public function prepareGroupPrices($product, $groupPrices = null)
{
if (!is_array($groupPrices)) {
return null;
}
if (!is_array($groupPrices)) {
$this->_fault('data_invalid', Mage::helper('catalog')->__('Invalid Group Prices'));
}
$updateValue = array();
foreach ($groupPrices as $groupPrice) {
if (!is_array($groupPrice)
|| !isset($groupPrice['price'])) {
$this->_fault('data_invalid', Mage::helper('catalog')->__('Invalid Group Prices'));
}
if (!isset($groupPrice['website']) || $groupPrice['website'] == 'all') {
$groupPrice['website'] = 0;
} else {
try {
$groupPrice['website'] = Mage::app()->getWebsite($groupPrice['website'])->getId();
} catch (Mage_Core_Exception $e) {
$groupPrice['website'] = 0;
}
}
if (intval($groupPrice['website']) > 0 && !in_array($groupPrice['website'], $product->getWebsiteIds())) {
$this->_fault('data_invalid', Mage::helper('catalog')->__('Invalid group prices. The product is not associated to the requested website.'));
}
$updateValue[] = array(
'website_id' => $groupPrice['website'],
'cust_group' => $groupPrice['customer_group_id'],
'price' => $groupPrice['price']
);
}
return $updateValue;
}
protected function _initProduct($productId, $identifierType = null)
{
$product = Mage::helper('catalog/product')->getProduct($productId, 0, $identifierType);
if (!$product->getId()) {
$this->_fault('product_not_exists');
}
return $product;
}
}
V2.php
<?php
class TreDing_Tapy_Model_New_Api_V2 extends TreDing_Tapy_Model_New_Api
{
public function Foo()
{
$a = 1;
return "test".$a;
}
public function prepareGroupPrices($product, $groupPrices = null)
{
if (!is_array($groupPrices)) {
return null;
}
$updateValue = array();
foreach ($groupPrices as $groupPrice) {
if (!is_object($groupPrice)
|| !isset($groupPrice->price)) {
$this->_fault('data_invalid', Mage::helper('catalog')->__('Invalid Group Prices'));
}
if (!isset($groupPrice->website) || $groupPrice->website == 'all') {
$groupPrice->website = 0;
} else {
try {
$groupPrice->website = Mage::app()->getWebsite($groupPrice->website)->getId();
} catch (Mage_Core_Exception $e) {
$groupPrice->website = 0;
}
}
if (intval($groupPrice->website) > 0 && !in_array($groupPrice->website, $product->getWebsiteIds())) {
$this->_fault('data_invalid', Mage::helper('catalog')->__('Invalid group prices. The product is not associated to the requested website.'));
}
/*if (!isset($groupPrice->customer_group_id)) {
$tierPrice->customer_group_id = 'all';
}
if ($tierPrice->customer_group_id == 'all') {
$tierPrice->customer_group_id = Mage_Customer_Model_Group::CUST_GROUP_ALL;
}*/
$updateValue[] = array(
'website_id' => $groupPrice->website,
'cust_group' => $groupPrice->customer_group_id,
'price' => $groupPrice->price
);
}
return $updateValue;
}
}
方法是 $soap->newInfo(); $soap->newUpdate();
这就像层组 api。我使用这个模块,一切正常。
问候 M。