dongwuwu6104 2016-04-21 11:33
浏览 41

Prestashop通过带有参考连接的webservice更新产品

I have two shops that should have the same product informations, i’m creating a module that synchronize products in one direction via webservice ; when i update a product in a shop, that should update the same product (with the same reference) in the other shop. In the 2 shops, products haven't always the same IDs. My problem is when i’m making connection by reference i get error ‘id is required when modifying a resource’, and the update finish successfully when i’m making connection by product id

This is my method code:

public function hookActionObjectProductUpdateAfter($params){

define('DEBUG', true);
define('PS_SHOP_PATH', Configuration::get('PS_SHOP_PATH'));
define('PS_WS_AUTH_KEY', Configuration::get('PS_WS_AUTH_KEY'));

// First : We always get the products's list or a specific one
try
{
        $webService = new PrestaShopWebservice(PS_SHOP_PATH, PS_WS_AUTH_KEY, DEBUG);
        $opt = array('resource' => 'products');
        //var_dump($params['object']->id);
        if (isset($params['object']->id)){
          // $opt['id'] = $params['object']->id;
            $opt['display']  = 'full'; 
            $opt['filter']['reference'] = '['.$params['object']->reference.']';

            $xml = $webService->get($opt);
            $x = ($xml->products[0]->product->id);
            $this->id_product = (int)$x;
            //var_dump($x);
        }

        // Here we get the elements from children of customer markup which is children of prestashop root markup
        $resources = $xml->children()->children();

        //$id_product = $resources->id;
        //unset($resources->id);
        var_dump($resources->associations);
        //unset($resources->product->associations);

        unset($resources->manufacturer_name);
        unset($resources->quantity);
        unset($resources->id_shop_default);
        unset($resources->id_default_image);
        unset($resources->associations);
        unset($resources->id_default_combination);
        unset($resources->position_in_category);
        unset($resources->type);
        unset($resources->pack_stock_type);
        unset($resources->date_add);
        unset($resources->date_upd); 
        var_dump($resources);
}
catch (PrestaShopWebserviceException $e)
{
        // Here we are dealing with errors
        $trace = $e->getTrace();
        if ($trace[0]['args'][0] == 404) echo 'Bad ID';
        else if ($trace[0]['args'][0] == 401) echo 'Bad auth key';
        else echo 'Other error<br />'.$e->getMessage();
}
// Second : We update the data and send it to the web service
if ($params['object']->id) // Here we check id cause in every resource there's an id
{
        //print_r($params['product']->categories);exit;
        // get product categories
        $product = $params['object'];
        $categories = $product->getCategories();
        //var_dump($categories);

        $id_lang = Context::getContext()->language->id;
        $resources->product->associations->categories= '';
        foreach($categories as $catId){
          $categorie = new Category((int)$catId);
          $catName = $categorie->name[$id_lang];
          //var_dump($categorie->name);
          //get categorie id in remote shop
          $opt = array();
          $opt['resource'] = 'categories';
            // We set an id if we want to retrieve infos from a customer


          $webService = new PrestaShopWebservice(PS_SHOP_PATH, PS_WS_AUTH_KEY, DEBUG);
          if(isset($catId) && $catName){
            $opt['filter[name]'] = '['.$catName.']' ; // cast string => int for security measures
            $opt['display']     = '[id]'; 
            // Call

            $xml1 = $webService->get($opt);
            $resources1 = $xml1->children()->children();
            //var_dump($resources1[0]);
            if($resources1->category->id[0]!=''){
                $x = $resources->product->associations->categories->addChild('categorie');
                $x->addChild('id', $resources1[0]->id);
            }else{
                $xml3 = $webService->get(array('url' => PS_SHOP_PATH.'/api/categories?schema=blank'));
                $resources3 = $xml3->children()->children();
                unset($resources3->id);
                unset($resources3->position);
                unset($resources3->date_add);
                unset($resources3->date_upd);
                //unset($resources ->id_parent); //if unset category will be root. If set it must have id existing parent category!
                unset($resources3->level_depth);
                unset($resources3->nb_products_recursive);
                $resources3 ->id_parent = '2';
                $resources3->name->language[0][0] = $catName;
                $resources3->link_rewrite->language[0][0] = Tools::link_rewrite($catName);
                $resources3->active = 1;
                $resources3->id_shop_default = 1;
                $resources3->is_root_category = 0;

                $opt = array('resource' => 'categories');

                $opt['postXml'] = $xml3 -> asXML();

                $xml4 = $webService -> add($opt);

                $resources1 = $xml4->children()->children();
                //var_dump($resources1);
                // Clean this object
                $x = $resources->associations->categories->addChild('categorie');
                $x->addChild('id', $resources1->id);

                }
            }


        }
        //update manufacturer
        //get id_manufacturer for current product
       $id_manufacturer = $params['object']->id_manufacturer;
        if($id_manufacturer and $id_manufacturer!=0){

        $manufacturer_name = Manufacturer::getNameById((int)$id_manufacturer);
        //var_dump($manufacturer_name);
        //get remote manufacturer name
        $opt = array();
        $opt['resource'] = 'manufacturers';
        $opt['filter[name]'] = '['.$manufacturer_name.']' ; // cast string => int for security measures
        $opt['display']     = '[id]'; 
            // Call
        $xml2 = $webService->get($opt);
        $resources2 = $xml2->children()->children();
        if($resources2->manufacturers->manufacturer[0]->id)
            $resources->product->id_manufacturer = $resources2->manufacturers->manufacturer[0]->id;
            else {
                //create the manufacturer

                    $xml6 = $webService->get(array('resource' => 'manufacturers?schema=synopsis'));
                    $resources5 = $xml6->children()->children();
                    $resources5->name = $manufacturer_name;  
                    $resources5->active = 1; 
                    unset($resources5 -> link_rewrite);

                    $res = $webService->add(
                        array(
                        'resource' => 'manufacturers',
                        'active' => array(),
                        'postXml' => $xml6->asXML()
                        )
                    );
                   // var_dump($res);
                    $resources->product->id_manufacturer = $resources2->manufacturer->id;

            }
        }else
            unset($resources->product->id_manufacturer);
        // Here we have XML before update, lets update XML with new values
        foreach ($resources as $nodeKey => $node)

        {   
            //->{$nodeKey});
                if(!$params['object']->{$nodeKey})
                    unset($node);

               // elseif($nodeKey == '')

                elseif($nodeKey == 'link_rewrite' or 'name' ==$nodeKey or 'meta_description' == $nodeKey or 'meta_keywords' == $nodeKey or 'meta_title'  == $nodeKey or 'description' == $nodeKey or 'description_short'== $nodeKey  ){

                    $link_rewrite = $params['object']->{$nodeKey};
                        foreach($params['object']->{$nodeKey} as $lang=>$link ){
                              $resources->$nodeKey= '' ; // Clean this object
                              $resources->$nodeKey->addChild('language' ,$link);
                              $resources->$nodeKey->language->AddAttribute('id', $lang);
                        }
                }elseif( $nodeKey ==  'id_category_default'){
                    $categorie = new Category((int)$params['object']->id_category_default);
                    $catName = $categorie->name[$id_lang];
                    //var_dump($catName);
                    //get categorie id in remote shop
                    $opt = array();
                    $opt['resource'] = 'categories';
                      // We set an id if we want to retrieve infos from a customer


                    $webService = new PrestaShopWebservice(PS_SHOP_PATH, PS_WS_AUTH_KEY, DEBUG);
                    if (isset($resources->$nodeKey))
                      $opt['filter[name]'] = '['.$catName.']' ; // cast string => int for security measures
                      $opt['display']     = '[id]'; 
                      // Call
                      $xml1 = $webService->get($opt);
                      if($xml1){
                          $resources1 = $xml1->children()->children();
                          //echo '***************';
                          //var_dump($resources1);
                          $resources->$nodeKey = $resources1[0]->id;
                      }


                }


                else
                $resources->$nodeKey = $params['object']->{$nodeKey};


        }
        // And call the web service
        try
        {
                $opt = array('resource' => 'products');
                //First remove any indentations:
                $opt['putXml'] = $xml->asXML();
                //var_dump($this->id_product);
                $opt['id'] = $this->id_product;
                //$opt['filter[reference]'] = '['.$params['object']->reference.']';
                $xml = $webService->edit($opt);
                // if WebService don't throw an exception the action worked well and we don't show the following message
                echo "Successfully updated.";

                exit;
        }
        catch (PrestaShopWebserviceException $ex)
        {
                // Here we are dealing with errors
                $trace = $ex->getTrace();
                if ($trace[0]['args'][0] == 404) echo 'Bad ID';
                else if ($trace[0]['args'][0] == 401) echo 'Bad auth key';
                else echo 'Other error<br />'.$ex->getMessage();
        }
}



}

The XML Sent

<?xml version="1.0" encoding="UTF-8"?>
<prestashop xmlns:xlink="http://www.w3.org/1999/xlink">
<products>
<product>
<id>1</id>
<id_manufacturer xlink:href="http://www.website.com/api/manufacturers/1">116</id_manufacturer>
<id_supplier>0</id_supplier>
<id_category_default xlink:href="http://www.website.com/api/categories/2">2</id_category_default>
<new/>
<cache_default_attribute>0</cache_default_attribute>
<id_default_image xlink:href="http://www.website.com/api/images/products/1/61" notFilterable="true">61</id_default_image>
<id_default_combination notFilterable="true"/>
<id_tax_rules_group xlink:href="http://www.website.com/api/tax_rule_groups/8">8</id_tax_rules_group>
<position_in_category notFilterable="true">0</position_in_category>
<manufacturer_name notFilterable="true">Abac</manufacturer_name>
<quantity notFilterable="true">0</quantity>
<type notFilterable="true">simple</type>
<id_shop_default>1</id_shop_default>
<reference>VIPCARD</reference>
<supplier_reference/>
<location/>
<width>0.000000</width>
<height>0.000000</height>
<depth>0.000000</depth>
<weight>0.000000</weight>
<quantity_discount>0</quantity_discount>
<ean13/>
<upc/>
<cache_is_pack>0</cache_is_pack>
<cache_has_attachments>0</cache_has_attachments>
<is_virtual>0</is_virtual>
<on_sale>0</on_sale>
<online_only>0</online_only>
<ecotax>0.000000</ecotax>
<minimal_quantity>1</minimal_quantity>
<price>99.170000</price>
<wholesale_price>0.000000</wholesale_price>
<unity/>
<unit_price_ratio>0.000000</unit_price_ratio>
<additional_shipping_cost>0.00</additional_shipping_cost>
<customizable>0</customizable>
<text_fields>0</text_fields>
<uploadable_files>0</uploadable_files>
<active>1</active>
<redirect_type>404</redirect_type>
<id_product_redirected>0</id_product_redirected>
<available_for_order>1</available_for_order>
<available_date>0215-09-01</available_date>
<condition>new</condition>
<show_price>1</show_price>
<indexed>1</indexed>
<visibility>both</visibility>
<advanced_stock_management>0</advanced_stock_management>
<date_add>2016-04-21 12:19:16</date_add>
<date_upd>2016-04-21 12:19:16</date_upd>
<pack_stock_type>0</pack_stock_type>
<meta_description><language id="1" xlink:href="http://www.website.com/api/languages/1"></language></meta_description>
<meta_keywords><language id="1" xlink:href="http://www.website.com/api/languages/1"></language></meta_keywords>
<meta_title><language id="1" xlink:href="http://www.website.com/api/languages/1">Carte VIP</language></meta_title>
<link_rewrite><language id="1" xlink:href="http://www.website.com/api/languages/1">carte-vip</language></link_rewrite>
<name><language id="1" xlink:href="http://www.website.com/api/languages/1">Carte VIP</language></name>
<description><language id="1" xlink:href="http://www.website.com/api/languages/1">&lt;p&gt;Cette carte virtuelle vous permet de bénéficier d’une réduction systématique de 5% sur tous vos achats. Elle coûte seulement 99€ et reste valable à vie. Elle peut également ouvrir droit à certaines opérations et promotions spéciales.&lt;/p&gt;</language></description>
<description_short><language id="1" xlink:href="http://www.website.com/api/languages/1"></language></description_short>
<available_now><language id="1" xlink:href="http://www.website.com/api/languages/1"></language></available_now>
<available_later><language id="1" xlink:href="http://www.website.com/api/languages/1"></language></available_later>
<associations>
<categories nodeType="category" api="categories"><categorie><id>2</id> </categorie></categories>
<images nodeType="image" api="images">
<image xlink:href="http://www.website.com/api/images/products/1/61">
<id>61</id>
</image>
</images>
<combinations nodeType="combination" api="combinations"/>
<product_option_values nodeType="product_option_value" api="product_option_values"/>
<product_features nodeType="product_feature" api="product_features"/>
<tags nodeType="tag" api="tags"/>
<stock_availables nodeType="stock_available" api="stock_availables">
<stock_available xlink:href="http://www.website.com/api/stock_availables/1">
<id>1</id>
<id_product_attribute>0</id_product_attribute>
</stock_available>
</stock_availables>
<accessories nodeType="product" api="products"/>
<product_bundle nodeType="product" api="products"/>
</associations>
</product>
</products>
</prestashop>
  • 写回答

0条回答 默认 最新

    报告相同问题?

    悬赏问题

    • ¥15 制裁名单20240508芯片厂商
    • ¥20 易康econgnition精度验证
    • ¥15 线程问题判断多次进入
    • ¥15 msix packaging tool打包问题
    • ¥28 微信小程序开发页面布局没问题,真机调试的时候页面布局就乱了
    • ¥15 python的qt5界面
    • ¥15 无线电能传输系统MATLAB仿真问题
    • ¥50 如何用脚本实现输入法的热键设置
    • ¥20 我想使用一些网络协议或者部分协议也行,主要想实现类似于traceroute的一定步长内的路由拓扑功能
    • ¥30 深度学习,前后端连接