php – 如何通过SOAP api更新组价格
我需要使用SOAP api更新magento表中的组价格
我试图做这样的事情: require_once 'app/Mage.php'; $proxy = new SoapClient('http://example.com/api/soap/?wsdl'); $sessionId = $proxy->login('abhi','123456'); $productId = 1; $price = 200; $tierPrices = array( array('customer_group_id' => '2','website' => '0','qty' => '1','price' => $price) ); $result = $proxy->call( $sessionId,'product_attribute_group_price.update',array( $productId,$tierPrices ) ); if($result) echo "Price has been update successfully"; 它给出了错误:
但如果我使用’product_attribute_tier_price.update’代替’product_attribute_group_price.update’,它会更新等级价格,但我想更新团体价格. 解决方法
我有同样的问题,所以我为soap创建了一个自定义模块API:
文件: 应用程序/本地/ TreDing / Tapy /. (MyCompany的/模块) .etc / api.xml .etc / config.xml中 .etc / wsdl.xml .型号/新建/ Api.php .型号/新/原料药/ V2.php 应用程序的/ etc /模块/ 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> config.xml中 <?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); $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,$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; } } 方法是 这就像是一个层组api. 问候M. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |