如何通过SOAP API更新团体价格 [英] How to update group price via SOAP api

查看:48
本文介绍了如何通过SOAP API更新团体价格的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我需要使用SOAP API更新magento表中的团体价格

I need to update group price in a magento table using a 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行

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

但是如果我使用'product_attribute_tier_price.update'代替'product_attribute_group_price.update',它将更新等级价格,但我想更新组价格.

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.

推荐答案

我遇到了同样的问题,所以我为肥皂创建了一个自定义模块API:

I had same problem so I create a custom Module API for soap:

文件:

app/本地/TreDing/Tapy/. (我的公司/模块)

app/local/TreDing/Tapy/. (MyCompany/Module)

.etc/api.xml

.etc/api.xml

.etc/config.xml

.etc/config.xml

.etc/wsdl.xml

.etc/wsdl.xml

.Model/New/Api.php

.Model/New/Api.php

.Model/New/Api/V2.php

.Model/New/Api/V2.php

app/etc/modules/TreDing_Tapy.xml

app/etc/modules/TreDing_Tapy.xml

所以:

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

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();

Method are $soap->newInfo(); $soap->newUpdate();

这就像层组api. 我使用此模块,一切正常.

It's like tier group api. I use this module and it's all ok.

问候 M.

这篇关于如何通过SOAP API更新团体价格的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆