* @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. */ 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; $this->properties = [ 'name', 'productName', 'price', 'purchasePrice', 'vendor', 'picture', 'url', 'xmlId', 'productActivity', 'dimensions', 'vatRate', 'weight', ]; $this->params = [ 'article' => 'Артикул', 'color' => 'Цвет', 'tax' => 'Наценка', ]; } public function generate($categories, $offers) { $string = ' ' . $this->shop . ' '; $xml = new SimpleXMLElement( $string, LIBXML_NOENT | LIBXML_NOCDATA | LIBXML_COMPACT | LIBXML_PARSEHUGE ); $this->dd = new DOMDocument(); $this->dd->preserveWhiteSpace = false; $this->dd->formatOutput = true; $this->dd->loadXML($xml->asXML()); $this->eCategories = $this->dd ->getElementsByTagName('categories')->item(0); $this->eOffers = $this->dd ->getElementsByTagName('offers')->item(0); $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( $this->dd->createElement( 'category' ) ); $e->setAttribute('id', $category['id']); $e->appendChild($this->dd->createElement('name', $category['name'])); if ($category['picture']) { $e->appendChild($this->dd->createElement('picture', $category['picture'])); } if (0 < $category['parentId']) { $e->setAttribute('parentId', $category['parentId']); } } } private function addOffers($offers) { foreach ($offers as $offer) { $e = $this->eOffers->appendChild( $this->dd->createElement('offer') ); $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( $this->dd->createElement('categoryId', $categoryId) ); } $offerKeys = array_keys($offer); foreach ($offerKeys as $key) { if (null == $offer[$key]) { continue; } if (in_array($key, $this->properties)) { 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( $this->dd->createElement($key) )->appendChild( $this->dd->createTextNode(trim($offer[$key])) ); } } 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( $this->dd->createTextNode($offer[$key]) ); $e->appendChild($param); } } 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); } } } } }