Перейти до вмісту
Пошук в
  • Детальніше...
Шукати результати, які ...
Шукати результати в ...

Изменение обработки XML данных (с элементов на атрибуты) в PHP


Recommended Posts

Здравствуйте уважаемые форумчане!

 

(извините, не нашел в редакторе возможность скрыть блоки с кодом под спойлер)

 Необходимо изменить обработку XML документов в PHP скрипте.

 

 Ранее скрипт обрабатывал файл прайс-листа поставщика в XML формате, в котором структура состояла только из элементов,

(пример)



<product> <id>артикул</id> <category> <catName>категория 1 уровня</catName> <subName>категория 2 уровня</subName> </category> <name>название товара</name> <description>описание товара</description> <vendor>производитель</vendor> <vendorCode>номер производителя</vendorCode> <price>розничная цена</price> <wholesale>оптовая цена</wholesale> <pictureSmall>ссылка на миниатюру</pictureSmall> <pictures> <picture>ссылка изображения 1</picture> <picture>ссылка изображения 2</picture> </pictures> <assort> <color>цвет</color> <size>размер</size> <sklad>кол-во наличие на складе</sklad> <time>дата отгрузки</time> <aID>номер поставщика</aID> <barcode>баркод</barcode> </assort> </product>

 

а с недавнего времени, поставщик изменил структуру XML документа, добавив к элементам атрибуты

(пример)



<product prodID="артикул" vendorCode="номер производителя" name="название товара" vendor="производитель" brutto="вес" batteries="тип и кол-во батареек" pack="тип упаковки" material="материал" lenght="длина" diameter="диаметр" CollectionName="название коллекции"> <description>описание товара</description> <categories> <category Name="категория 1 уровня" subName="категория 2 уровня"/> </categories> <price RetailPrice="розничная цена" BaseRetailPrice="розничная цена" WholePrice="оптовая цена" BaseWholePrice="оптовая цена" Discount="размер скидки"/> <pictureSmall>ссылка на миниатюру</pictureSmall> <pictures> <picture>ссылка изображения 1</picture> <picture>ссылка изображения 2</picture> </pictures> <assortiment> <assort aID="номер поставщика" sklad="кол-во наличие на складе" color="цвет" size="размер" barcode="баркод" ShippingDate="дата отгрузки"/> </assortiment> </product>

Из-за чего, конечно же, скрипт работать перестал.

 

 На сегодняшний день мы имеем два XML файла с измененной структурой. Первый отвечает за загрузку новых товаров на сайт, второй за обновление остатков и цен всех товаров сайта товаров. (назовем их условно product.xml и product-stock.xml)

 

Новая структура для товара в файле product.xml выглядит так:



<product prodID="артикул" vendorCode="номер производителя" name="название товара" vendor="производитель" brutto="вес" batteries="тип и кол-во батареек" pack="тип упаковки" material="материал" lenght="длина" diameter="диаметр" CollectionName="название коллекции"> <description>описание товара</description> <categories> <category Name="категория 1 уровня" subName="категория 2 уровня"/> </categories> <price RetailPrice="розничная цена" BaseRetailPrice="розничная цена" WholePrice="оптовая цена" BaseWholePrice="оптовая цена" Discount="размер скидки"/> <pictureSmall>ссылка на миниатюру</pictureSmall> <pictures> <picture>ссылка изображения 1</picture> <picture>ссылка изображения 2</picture> </pictures> <assortiment> <assort aID="номер поставщика" sklad="кол-во наличие на складе" color="цвет" size="размер" barcode="баркод" ShippingDate="дата отгрузки"/> </assortiment> </product>

А старая структура XML документа файле product.xml выглядела так:



<product> <id>артикул</id> <category> <catName>категория 1 уровня</catName> <subName>категория 2 уровня</subName> </category> <name>название товара</name> <description>описание товара</description> <vendor>производитель</vendor> <vendorCode>номер производителя</vendorCode> <price>розничная цена</price> <wholesale>оптовая цена</wholesale> <pictureSmall>ссылка на миниатюру</pictureSmall> <pictures> <picture>ссылка изображения 1</picture> <picture>ссылка изображения 2</picture> </pictures> <assort> <color>цвет</color> <size>размер</size> <sklad>кол-во наличие на складе</sklad> <time>дата отгрузки</time> <aID>номер поставщика</aID> <barcode>баркод</barcode> </assort> </product>

 

Новая структура для товара в файле product-stock.xml (остатки и цены) выглядит так:



<product prodID="артикул"> <price RetailPrice="розничная цена" BaseRetailPrice="розничная цена" WholePrice="оптовая цена" BaseWholePrice="оптовая цена" Discount="размер скидки"/> <assortiment> <assort aID="номер поставщика" sklad="кол-во наличие на складе" barcode="баркод" ShippingDate="дата отгрузки"/> </assortiment> </product>

А старая структура XML документа в файле product_stock.xml выглядела так:



<product> <id>артикул</id> <price>розничная цена</price> <wholesale>оптовая цена</wholesale> <assort> <color>цвет</color> <size>размер</size> <sklad>кол-во наличие на складе</sklad> <time>дата отгрузки</time> <aID>номер поставщика</aID> </assort> </product>

 

 

В новой и старой структуре документов, кроме собственно структуры, различаются еще и названия некоторых элементов. Вот список изменений в названиях, которые были задействованы в скрипте, и понадобятся для того чтобы ничего не упустить в процессе работы  (слева - названия из старых xml файлов, справа - то как они называются в новых файлах):

id -> prodID

price -> BaseRetailPrice

Изменена структура блоков

category -> categories

assort -> assortiment

 

 Далее привожу пример того как это работало, и что нужно будет переписать в php:

XML файл получали через file_get_contents и обрабатывали в simplexml_load_string. Затем, если мы добавляем новые товары из XML файла product.xml то выполняется такой код (здесь как раз и работали с элементами, ранее полученными из XML):



public function addProducts($product) { $prc=1; file_put_contents('/var/www/u1234567/data/www/site.ru/4.txt',serialize($product)); $data=array(); $data['sku']=(!empty($product['sku']))?$product['id']:'none'; $data['upc']=(!empty($product['upc']))?$product['upc']:''; $data['model']=(!empty($product['id']))?$product['id']:'none'; $data['price']=(!empty($product['price']))?(float)$product['price']:0; $data['price']=(float)$data['price']*0.93; $data['quantity']=(!empty($product['quantity']))?$product['quantity']:10; $data['name']=(!empty($product['name']))?$product['name']:''; $data['weight']=(!empty($product['weight']))?$product['weight']:1; $data['description']=(!empty($product['description']))?$product['description']:''; $data['manufacturer_id']=(!empty($product['vendor']))?$this->getmanufacturer_id($product['vendor']):0; $data['product_category']='621'; $data['options']=array(); if(!empty($product['assort'][0]['aID'])) { $data['options']=$product['assort']; } else { $data['options'][]=$product['assort']; } //$img=(!empty($product['pictureSmall']))?$product['pictureSmall']:''; //$imgs=str_replace(‘http://external_site.ru/images/big/','data/catalog/',$img); $imgs='data/catalog/'.$product["id"].'.jpg'; //if(file_exists(DIR_IMAGE.$imgs)) { $data['image']=$imgs; //} $product_id=$this->getProductbyModel($data['model']); if(empty($product_id)) { $this->session->data['new']=$this->session->data['new']+1; $this->db->query("INSERT INTO " . DB_PREFIX . "product SET upc = '" . $this->db->escape($data['upc']) . "', sku = '" . $this->db->escape($data['sku']) . "', price = '" . $data['price']. "',quantity = '" . (int)$data['quantity'] . "', weight = '" . (float)$data['weight'] . "', model = '" . $this->db->escape($data['model']) . "', manufacturer_id = '" . (int)$data['manufacturer_id'] . "', status = '1', date_added = NOW()"); $product_id = $this->db->getLastId(); $this->session->data['newmodels'][]=$data['model'].'-'.$data['name']; $this->db->query("INSERT INTO " . DB_PREFIX . "product_description SET product_id = '" . (int)$product_id . "', language_id = '1', name = '" . $this->db->escape($data['name']) . "' , description = '" . $this->db->escape($data['description']) . "' "); //$this->db->query("DELETE FROM " . DB_PREFIX . "product_to_store WHERE product_id = '" . (int)$product_id . "'"); //$this->db->query("DELETE FROM " . DB_PREFIX . "product_to_category WHERE product_id = '" . (int)$product_id . "'"); $this->db->query("INSERT INTO " . DB_PREFIX . "product_to_store SET product_id = '" . (int)$product_id . "', store_id = '0'"); if (isset($data['product_category'])) { $this->db->query("INSERT INTO " . DB_PREFIX . "product_to_category SET product_id = '" . (int)$product_id . "', category_id = '" . (int)$data['product_category']. "' ,main_category = 1 "); } } else { $this->session->data['old']=$this->session->data['old']+1; $this->db->query("UPDATE " . DB_PREFIX . "product SET upc = '" . $this->db->escape($data['upc']) . "', sku = '" . $this->db->escape($data['sku']) . "', price = '" . $data['price']. "', quantity = '" . (int)$data['quantity'] . "', weight = '" . (float)$data['weight'] . "', model = '" . $this->db->escape($data['model']) . "', manufacturer_id = '" . (int)$data['manufacturer_id'] . "', status = '1', date_added = NOW() WHERE product_id='".(int)$product_id."' "); $this->db->query("DELETE FROM " . DB_PREFIX . "product_option WHERE product_id = '" . (int)$product_id . "'"); $this->db->query("DELETE FROM " . DB_PREFIX . "product_option_value WHERE product_id = '" . (int)$product_id . "'"); } if (isset($data['image'])) { $this->db->query("UPDATE " . DB_PREFIX . "product SET image = '" . $this->db->escape(html_entity_decode($data['image'], ENT_QUOTES, 'UTF-8')) . "' WHERE product_id = '" . (int)$product_id . "'"); } $sklad=0; if(!empty($data['options'])) { $this->db->query("INSERT INTO " . DB_PREFIX . "product_option SET product_id = '" . (int)$product_id . "', option_id = '16', required = '1'"); $product_option_id = $this->db->getLastId(); foreach ($data['options'] as $option) { if(!empty($option['color']) && !empty($option['size']) ) { $stringopt=$option['color']."/".$option['size']; } else { $stringopt="Стандарт"; } $option_value_id=$this->getOptionvalueid($stringopt); $sklad+=(int)$option['sklad']; $this->db->query("INSERT INTO " . DB_PREFIX . "product_option_value SET product_option_id = '" . (int)$product_option_id . "', product_id = '" . (int)$product_id . "', option_id = '16', option_value_id = '" . (int)$option_value_id . "', quantity = '" . (int)$option['sklad']. "', aid = '" . (int)$option['aID']. "', subtract = '1', price = '0', price_prefix = '+', points = '0', points_prefix = '+', weight = '0', weight_prefix = '+'"); } } $this->db->query("UPDATE " . DB_PREFIX . "product SET quantity = '" . (int)$sklad . "' , stock_status_id = '5' WHERE product_id='".(int)$product_id."' "); return $product_id; }

Ну и другая функция работала с файлом обновления остатков и цен product_stock.xml

(на всякий случай, привожу для примера)



public function updatePrice($product) { $data=array(); $data['sku']=(!empty($product['sku']))?$product['id']:'none'; $data['upc']=(!empty($product['upc']))?$product['upc']:''; $data['model']=(!empty($product['id']))?$product['id']:'none'; $data['price']=(!empty($product['price']))?(float)$product['price']:0; $data['price']=(float)$data['price']*0.93; $names=$product["id"].'.jpg'; $imgs='data/catalog/'.$names; $link=‘http://external_site.ru/images/big/'.$names; if(!file_exists(DIR_IMAGE.$imgs)) { $imdata=file_get_contents($link); if(!empty($imdata)) { file_put_contents(DIR_IMAGE.$imgs,$imdata); } } $data['options']=array(); if(!empty($product['assort'][0]['aID'])) { $data['options']=$product['assort']; } else { $data['options'][]=$product['assort']; } file_put_contents('/var/www/u1234567/data/www/site.ru/3.txt',serialize($data)); $product_id=$this->getProductbyModel($data['model']); if(!empty($product_id)) { $this->session->data['old']=$this->session->data['old']+1; $this->db->query("DELETE FROM " . DB_PREFIX . "product_option WHERE product_id = '" . (int)$product_id . "'"); $this->db->query("DELETE FROM " . DB_PREFIX . "product_option_value WHERE product_id = '" . (int)$product_id . "'"); $sklad=0; if(!empty($data['options'])) { $this->db->query("INSERT INTO " . DB_PREFIX . "product_option SET product_id = '" . (int)$product_id . "', option_id = '16', required = '1'"); $product_option_id = $this->db->getLastId(); foreach ($data['options'] as $option) { if(!empty($option['color']) && !empty($option['size']) ) { $stringopt=$option['color']."/".$option['size']; } else { $stringopt="Стандарт"; } $option_value_id=$this->getOptionvalueid($stringopt); $sklad+=(int)$option['sklad']; $this->db->query("INSERT INTO " . DB_PREFIX . "product_option_value SET product_option_id = '" . (int)$product_option_id . "', product_id = '" . (int)$product_id . "', option_id = '16', option_value_id = '" . (int)$option_value_id . "', quantity = '" . (int)$option['sklad']. "', aid = '" . (int)$option['aID']. "', subtract = '1', price = '0', price_prefix = '+', points = '0', points_prefix = '+', weight = '0', weight_prefix = '+'"); } } $this->db->query("UPDATE " . DB_PREFIX . "product SET quantity = '" . (int)$sklad . "' , price = '" . $data['price']. "', stock_status_id = '5' WHERE product_id='".(int)$product_id."' "); } }

 

Собственно, повторюсь: 

Так как поставщик изменил структуру xml файлов, необходимо научить php скрипт понимать атрибуты из xml и работать с ними.

 

Предложения пишите в комментарии, или в личку на форуме. Стараюсь оперативно мониторить тему. Другие каналы связи уже после согласования сроков и стоимости :wink:

 

Удачного дня!

Змінено користувачем Skunk
[spoiler]
Надіслати
Поділитися на інших сайтах


  • 2 weeks later...

Всё, можно закрывать тему. 

Если у кого-нибудь возникнут вопросы по работе с xml/yml/csv фидами и работой с прайсами поставщиков, советую обратиться к пользователю @ambalocha69

 

Змінено користувачем grishka0007
Надіслати
Поділитися на інших сайтах


Створіть аккаунт або увійдіть для коментування

Ви повинні бути користувачем, щоб залишити коментар

Створити обліковий запис

Зареєструйтеся для отримання облікового запису. Це просто!

Зареєструвати аккаунт

Вхід

Уже зареєстровані? Увійдіть тут.

Вхід зараз
  • Зараз на сторінці   0 користувачів

    • Ні користувачів, які переглядиють цю сторінку

×
×
  • Створити...

Important Information

На нашому сайті використовуються файли cookie і відбувається обробка деяких персональних даних користувачів, щоб поліпшити користувальницький інтерфейс. Щоб дізнатися для чого і які персональні дані ми обробляємо перейдіть за посиланням . Якщо Ви натиснете «Я даю згоду», це означає, що Ви розумієте і приймаєте всі умови, зазначені в цьому Повідомленні про конфіденційність.