Перейти к содержанию
grishka0007

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

Рекомендуемые сообщения

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

 

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

 Необходимо изменить обработку 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]

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

 

Изменено пользователем grishka0007

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

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

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти

  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу

×

Важная информация

На нашем сайте используются файлы cookie и происходит обработка некоторых персональных данных пользователей, чтобы улучшить пользовательский интерфейс. Чтобы узнать для чего и какие персональные данные мы обрабатываем перейдите по ссылке. Если Вы нажмете «Я даю согласие», это означает, что Вы понимаете и принимаете все условия, указанные в этом Уведомлении о Конфиденциальности.