prestashop-module/retailcrm/lib/RetailcrmIcml.php

203 lines
6.7 KiB
PHP
Raw Normal View History

2016-01-13 18:43:41 +03:00
<?php
/**
* MIT License
*
* Copyright (c) 2021 DIGITAL RETAIL TECHNOLOGIES SL
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*
* DISCLAIMER
*
* Do not edit or add to this file if you wish to upgrade PrestaShop to newer
* versions in the future. If you wish to customize PrestaShop for your
* needs please refer to http://www.prestashop.com for more information.
*
* @author DIGITAL RETAIL TECHNOLOGIES SL <mail@simlachat.com>
* @copyright 2021 DIGITAL RETAIL TECHNOLOGIES SL
* @license https://opensource.org/licenses/MIT The MIT License
*
* Don't forget to prefix your containers with your own identifier
* to avoid any conflicts with others containers.
*/
2016-01-13 18:43:41 +03:00
class RetailcrmIcml
{
protected $shop;
protected $file;
protected $properties;
protected $params;
protected $dd;
protected $eCategories;
protected $eOffers;
public function __construct($shop, $file)
{
$this->shop = $shop;
$this->file = $file;
2021-11-03 16:19:39 +07:00
$this->properties = [
2016-01-13 18:43:41 +03:00
'name',
'productName',
'price',
'purchasePrice',
'vendor',
'picture',
'url',
'xmlId',
2019-01-16 13:11:34 +03:00
'productActivity',
2021-06-04 10:33:55 +03:00
'dimensions',
'vatRate',
2021-11-23 20:54:55 +07:00
'weight',
2021-11-03 16:19:39 +07:00
];
2016-01-13 18:43:41 +03:00
2021-11-03 16:19:39 +07:00
$this->params = [
2016-01-13 18:43:41 +03:00
'article' => 'Артикул',
'color' => 'Цвет',
2021-11-03 16:19:39 +07:00
'tax' => 'Наценка',
];
2016-01-13 18:43:41 +03:00
}
public function generate($categories, $offers)
{
$string = '<?xml version="1.0" encoding="UTF-8"?>
<yml_catalog date="' . date('Y-m-d H:i:s') . '">
<shop>
<name>' . $this->shop . '</name>
<categories/>
<offers/>
</shop>
</yml_catalog>
';
$xml = new SimpleXMLElement(
2018-12-25 13:31:07 +03:00
$string, LIBXML_NOENT | LIBXML_NOCDATA | LIBXML_COMPACT | LIBXML_PARSEHUGE
2016-01-13 18:43:41 +03:00
);
$this->dd = new DOMDocument();
$this->dd->preserveWhiteSpace = false;
$this->dd->formatOutput = true;
$this->dd->loadXML($xml->asXML());
$this->eCategories = $this->dd
2018-12-25 13:31:07 +03:00
->getElementsByTagName('categories')->item(0);
2016-01-13 18:43:41 +03:00
$this->eOffers = $this->dd
2018-12-25 13:31:07 +03:00
->getElementsByTagName('offers')->item(0);
2016-01-13 18:43:41 +03:00
$this->addCategories($categories);
$this->addOffers($offers);
$this->dd->saveXML();
$this->dd->save($this->file);
}
private function addCategories($categories)
{
foreach ($categories as $category) {
$e = $this->eCategories->appendChild(
2018-12-25 13:31:07 +03:00
$this->dd->createElement(
'category'
)
2016-01-13 18:43:41 +03:00
);
$e->setAttribute('id', $category['id']);
2018-12-25 13:31:07 +03:00
$e->appendChild($this->dd->createElement('name', $category['name']));
if ($category['picture']) {
$e->appendChild($this->dd->createElement('picture', $category['picture']));
}
2016-01-13 18:43:41 +03:00
2021-11-03 16:19:39 +07:00
if (0 < $category['parentId']) {
$e->setAttribute('parentId', $category['parentId']);
2016-01-13 18:43:41 +03:00
}
}
}
private function addOffers($offers)
{
foreach ($offers as $offer) {
$e = $this->eOffers->appendChild(
2018-12-25 13:31:07 +03:00
$this->dd->createElement('offer')
2016-01-13 18:43:41 +03:00
);
$e->setAttribute('id', $offer['id']);
$e->setAttribute('productId', $offer['productId']);
if (!empty($offer['quantity'])) {
$e->setAttribute('quantity', (int) $offer['quantity']);
} else {
$e->setAttribute('quantity', 0);
}
foreach ($offer['categoryId'] as $categoryId) {
$e->appendChild(
2018-12-25 13:31:07 +03:00
$this->dd->createElement('categoryId', $categoryId)
2016-01-13 18:43:41 +03:00
);
}
$offerKeys = array_keys($offer);
foreach ($offerKeys as $key) {
2021-11-03 16:19:39 +07:00
if (null == $offer[$key]) {
continue;
}
2016-01-13 18:43:41 +03:00
if (in_array($key, $this->properties)) {
2021-11-03 16:19:39 +07:00
if (is_array($offer[$key])) {
foreach ($offer[$key] as $property) {
$e->appendChild(
$this->dd->createElement($key)
)->appendChild(
$this->dd->createTextNode(trim($property))
);
}
} else {
$e->appendChild(
2016-01-13 18:43:41 +03:00
$this->dd->createElement($key)
)->appendChild(
2016-01-13 18:43:41 +03:00
$this->dd->createTextNode(trim($offer[$key]))
);
}
2016-01-13 18:43:41 +03:00
}
if (in_array($key, array_keys($this->params))) {
$param = $this->dd->createElement('param');
$param->setAttribute('code', $key);
$param->setAttribute('name', $this->params[$key]);
$param->appendChild(
2018-12-25 13:31:07 +03:00
$this->dd->createTextNode($offer[$key])
2016-01-13 18:43:41 +03:00
);
$e->appendChild($param);
}
}
2021-10-18 17:52:16 +03:00
if (isset($offer['combination'])) {
foreach ($offer['combination'] as $id => $comb) {
$param = $this->dd->createElement('param');
$param->setAttribute('code', $id);
$param->setAttribute('name', $comb['group_name']);
$param->appendChild(
$this->dd->createTextNode($comb['attribute_name'])
);
$e->appendChild($param);
}
}
2016-01-13 18:43:41 +03:00
}
}
}