我需要使用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";
它给出错误:
未捕获的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->在/ opt / lampp /中调用('045aea7add6d7b7 ...','product_attribu ...',数组)#2 {main}第243行的htdocs / elligatorssilverjewelry / import.php
但如果我使用'product_attribute_tier_price.update'
代替'product_attribute_group_price.update'
,则会更新套餐价格,但我想更新套餐价格。
答案 0 :(得分:3)
我遇到了同样的问题,因此我为soap创建了一个自定义模块API:
文件:
应用程序/本地/ TreDing / Tapy /。 (MyCompany的/模块)
.etc / api.xml
.etc / config.xml中
.etc / wsdl.xml
。型号/新建/ Api.php
。型号/新/原料药/ V2.php
app / 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>
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-&GT; newInfo(); $ soap-&GT; newUpdate();
它就像层组api。 我使用这个模块就可以了。
此致 微米。
答案 1 :(得分:2)
好的我解决了这个问题 在这里,我需要使用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/>";
}
}