Reputation: 2737
I need to update group price in a magento table using a SOAP api
I have tried to done something like this :
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";
It gives error:
Uncaught SoapFault exception: [3] Invalid api path. in /opt/lampp/htdocs/elligatorssilverjewelry/import.php:243 Stack trace: #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} thrown in /opt/lampp/htdocs/elligatorssilverjewelry/import.php on line 243
but if i use 'product_attribute_tier_price.update'
in place of 'product_attribute_group_price.update'
it updates the tier price but I want to update the group price.
Upvotes: 4
Views: 3483
Reputation: 363
I had same problem so I create a custom Module API for soap:
File:
app/local/TreDing/Tapy/. (MyCompany/Module)
.etc/api.xml
.etc/config.xml
.etc/wsdl.xml
.Model/New/Api.php
.Model/New/Api/V2.php
app/etc/modules/TreDing_Tapy.xml
So:
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;
}
}
Method are $soap->newInfo(); $soap->newUpdate();
It's like tier group api. I use this module and it's all ok.
Regards M.
Upvotes: 3
Reputation: 2737
Ok i solve this here i need to use Sql query in place of API
so the whole code would be like :
$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/>";
}
}
Upvotes: 2