加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

php – 如何通过SOAP api更新组价格

发布时间:2020-12-13 17:24:31 所属栏目:PHP教程 来源:网络整理
导读:我需要使用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
我需要使用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";

它给出了错误:

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’,它会更新等级价格,但我想更新团体价格.

解决方法

我有同样的问题,所以我为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;
    }
}

方法是
$soap-> newInfo();
$soap-> newUpdate();

这就像是一个层组api.
我使用这个模块,一切都好.

问候M.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读