如何通过SOAP api更新组价格

时间:2013-06-12 07:50:37

标签: php magento soap

我需要使用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',则会更新套餐价格,但我想更新套餐价格。

2 个答案:

答案 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/>";
    }

    }