Мне нужно обновить групповую цену в таблице пурпурного цвета, используя SOAP api
Я попытался сделать что-то вроде этого:
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";
Это дает ошибку:
Непринятое исключение SoapFault: [3] Недопустимый путь api. в /opt/lampp/htdocs/elligatorssilverjewelry/import.php:243 Трассировка стека: # 0 /opt/lampp/htdocs/elligatorssilverjewelry/import.php(243): SoapClient -> __ call ('call', Array) # 1 / opt / lampp / htdocs / elligatorssilverjewelry / import.php (243): SoapClient-> call ('045aea7add6d7b7 …', 'product_attribu …', Array) # 2 {main} брошен в / opt / lampp / htdocs / elligatorssilverjewelry / import.php в строке 243
но если я использую 'product_attribute_tier_price.update'
вместо 'product_attribute_group_price.update'
он обновляет цену уровня, но я хочу обновить групповую цену.
У меня была такая же проблема, поэтому я создаю собственный API-интерфейс модуля для мыла:
Файл:
приложение / местные / TreDing / Tapy /. (MyCompany / Module)
.etc / api.xml
.etc / config.xml
.etc / wsdl.xml
.MODEL / New / Api.php
.MODEL / New / Api / V2.php
приложение / и т.д. / модули / 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 = 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. Я использую этот модуль, и все в порядке.
С уважением М.
Хорошо, я решил это здесь, мне нужно использовать запрос Sql вместо API
поэтому весь код будет выглядеть так:
$productQuery = mysql_query("select a.entity_id, a.value from `catalog_product_entity_varchar` as a left join `catalog_product_entity_int` as b on a.entity_id = b.entity_id where a.attribute_id = 56 and b.attribute_id = 80"); $i=0; while($product = mysql_fetch_assoc($productQuery)) { $i++; echo "{$i} : For <b>'{$product['value']}'</b> whos id is <b>'{$product['entity_id']}'</b> ---------- <br>"; $price = 'your desired price'; $productId = $product['entity_id']; $result = mysql_query("INSERT INTO `catalog_product_entity_group_price` SET `entity_id` = {$productId}, `all_groups` = 0, `customer_group_id` = 2, `value`= {$price}, `website_id` = 0 "); if(!$result) { mysql_query(" UPDATE `catalog_product_entity_group_price` SET `all_groups` = 0, `customer_group_id` = 2, `value`= {$price}, `website_id` = 0 where `entity_id` = {$productId} "); echo "Group Price of {$price} has been update successfully. <br/><br/>"; } else { echo "Group Price of {$price} has been added successfully .<br/><br/>"; } }