【问题标题】:How to update group price via SOAP api如何通过 SOAP api 更新团体价格
【发布时间】:2013-06-08 06:11:52
【问题描述】:

我需要使用 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->call('045aea7add6d7b7...', 'product_attribu...', Array) #2 {main} 抛出 /opt/lampp/htdocs/ elliigatorssilverjewelry/import.php 在第 243 行

但是如果我使用'product_attribute_tier_price.update' 代替'product_attribute_group_price.update' 它会更新等级价格,但我想更新团体价格。

【问题讨论】:

    标签: php magento soap


    【解决方案1】:

    好的,我解决了 这里我需要使用 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/>";
        }
    
        }
    

    【讨论】:

      【解决方案2】:

      我有同样的问题,所以我为soap创建了一个自定义模块API:

      文件:

      应用程序/本地/TreDing/Tapy/。 (我的公司/模块)

      .etc/api.xml

      .etc/config.xml

      .etc/wsdl.xml

      .Model/New/Api.php

      .Model/New/Api/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->newInfo(); $soap->newUpdate();

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

      问候 M.

      【讨论】:

        猜你喜欢
        • 2022-01-27
        • 2015-02-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多