diff --git a/retailcrm/lib/RetailcrmCatalog.php b/retailcrm/lib/RetailcrmCatalog.php index 47e5a44..c970268 100644 --- a/retailcrm/lib/RetailcrmCatalog.php +++ b/retailcrm/lib/RetailcrmCatalog.php @@ -193,6 +193,8 @@ class RetailcrmCatalog $article = null; } + $productName = htmlspecialchars(strip_tags($product['name'])); + $weight = $this->getWeightInKg($product['weight']); $width = round($product['width'], 3); @@ -265,16 +267,22 @@ class RetailcrmCatalog $offerArticle = $article; } + $name = htmlspecialchars( + strip_tags( + Product::getProductName($product['id_product'], $offer['id_product_attribute']) + ) + ); + $item = [ 'id' => $product['id_product'] . '#' . $offer['id_product_attribute'], 'productId' => $product['id_product'], 'productActivity' => ($available_for_order) ? 'Y' : 'N', - 'name' => htmlspecialchars(strip_tags(Product::getProductName($product['id_product'], $offer['id_product_attribute']))), - 'productName' => htmlspecialchars(strip_tags($product['name'])), + 'name' => ('' === $name) ? $productName : $name, + 'productName' => $productName, 'categoryId' => $categoriesLeft, 'picture' => $pictures, 'url' => $url, - 'quantity' => 0 < $quantity ? $quantity : 0, + 'quantity' => (0 < $quantity) ? $quantity : 0, 'purchasePrice' => $offerPurchasePrice, 'price' => round($offerPrice, 2), 'vendor' => $vendor, @@ -326,8 +334,8 @@ class RetailcrmCatalog 'id' => $product['id_product'], 'productId' => $product['id_product'], 'productActivity' => ($available_for_order) ? 'Y' : 'N', - 'name' => htmlspecialchars(strip_tags($product['name'])), - 'productName' => htmlspecialchars(strip_tags($product['name'])), + 'name' => $productName, + 'productName' => $productName, 'categoryId' => $categoriesLeft, 'picture' => $pictures, 'url' => $url, diff --git a/retailcrm/lib/RetailcrmIcml.php b/retailcrm/lib/RetailcrmIcml.php index c5df04c..060330a 100644 --- a/retailcrm/lib/RetailcrmIcml.php +++ b/retailcrm/lib/RetailcrmIcml.php @@ -40,18 +40,25 @@ class RetailcrmIcml { protected $shop; protected $file; + protected $tmpFile; protected $properties; protected $params; protected $dd; protected $eCategories; protected $eOffers; + /** + * @var XMLWriter + */ + private $writer; public function __construct($shop, $file) { $this->shop = $shop; $this->file = $file; + $this->tmpFile = sprintf('%s.tmp', $this->file); $this->properties = [ + 'categoryId', 'name', 'productName', 'price', @@ -75,129 +82,189 @@ class RetailcrmIcml public function generate($categories, $offers) { - $string = ' - - - ' . $this->shop . ' - - - - - '; + if (file_exists($this->tmpFile)) { + unlink($this->tmpFile); + } - $xml = new SimpleXMLElement( - $string, - LIBXML_NOENT | LIBXML_NOCDATA | LIBXML_COMPACT | LIBXML_PARSEHUGE - ); + $this->loadWriter(); + $this->writeHead(); - $this->dd = new DOMDocument(); - $this->dd->preserveWhiteSpace = false; - $this->dd->formatOutput = true; - $this->dd->loadXML($xml->asXML()); + if (!empty($categories)) { + $this->writeCategories($categories); + unset($categories); + } - $this->eCategories = $this->dd - ->getElementsByTagName('categories')->item(0); - $this->eOffers = $this->dd - ->getElementsByTagName('offers')->item(0); + if (!empty($offers)) { + $this->writeOffers($offers); + unset($offers); + } + + $this->writeEnd(); + $this->formatXml(); + + rename($this->tmpFile, $this->file); + } + + private function loadWriter() + { + if (!$this->writer) { + $writer = new \XMLWriter(); + $writer->openUri($this->tmpFile); + + $this->writer = $writer; + } + } + + private function writeHead() + { + $this->writer->startDocument('1.0', 'UTF-8'); + $this->writer->startElement('yml_catalog'); // start + $this->writer->writeAttribute('date', date('Y-m-d H:i:s')); + $this->writer->startElement('shop'); // start + $this->writer->WriteElement('name', $this->shop); + } + + /** + * @param $categories + */ + private function writeCategories($categories) + { + $this->writer->startElement('categories'); // start $this->addCategories($categories); - $this->addOffers($offers); - $this->dd->saveXML(); - $this->dd->save($this->file); + $this->writer->endElement(); // end } 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 (!array_key_exists('name', $category) || !array_key_exists('id', $category)) { + continue; } - if (0 < $category['parentId']) { - $e->setAttribute('parentId', $category['parentId']); + $this->writer->startElement('category'); // start + + $this->writer->writeAttribute('id', $category['id']); + + if (array_key_exists('parentId', $category) && 0 < $category['parentId']) { + $this->writer->writeAttribute('parentId', $category['parentId']); } + + $this->writer->writeElement('name', $category['name']); + + if (array_key_exists('picture', $category) && $category['picture']) { + $this->writer->writeElement('picture', $category['picture']); + } + + $this->writer->endElement(); // end } } + /** + * @param $offers + */ + private function writeOffers($offers) + { + $this->writer->startElement('offers'); // start + $this->addOffers($offers); + $this->writer->endElement(); // end + } + private function addOffers($offers) { foreach ($offers as $offer) { - $e = $this->eOffers->appendChild( - $this->dd->createElement('offer') - ); + if (!array_key_exists('id', $offer)) { + continue; + } - $e->setAttribute('id', $offer['id']); - $e->setAttribute('productId', $offer['productId']); + $this->writer->startElement('offer'); // start - if (!empty($offer['quantity'])) { - $e->setAttribute('quantity', (int) $offer['quantity']); + $this->writer->writeAttribute('id', $offer['id']); + $this->writer->writeAttribute('productId', $offer['productId']); + $this->writer->writeAttribute('quantity', (int) $offer['quantity']); + + unset($offer['id'], $offer['productId'], $offer['quantity']); + + $this->setOffersProperties($offer); + $this->setOffersParams($offer); + $this->setOffersCombinations($offer); + + $this->writer->endElement(); // end + } + } + + private function setOffersProperties($offer) + { + foreach ($offer as $key => $value) { + if (!in_array($key, $this->properties)) { + continue; + } + + if (is_array($value)) { + foreach ($value as $element) { + $this->writer->writeElement($key, $element); + } } 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); - } + $this->writer->writeElement($key, $value); } } } + + private function setOffersParams($offer) + { + foreach ($offer as $key => $value) { + if (!array_key_exists($key, $this->params)) { + continue; + } + + $this->writer->startElement('param'); + $this->writer->writeAttribute('code', $key); + $this->writer->writeAttribute('name', $this->params[$key]); + $this->writer->text($value); + $this->writer->endElement(); + } + } + + private function setOffersCombinations($offer) + { + if (!array_key_exists('combination', $offer)) { + return; + } + + foreach ($offer['combination'] as $id => $combination) { + if ( + !array_key_exists('group_name', $combination) + || !array_key_exists('attribute_name', $combination) + || empty($combination['group_name']) + || empty($combination['attribute_name']) + ) { + continue; + } + + $this->writer->startElement('param'); + $this->writer->writeAttribute('code', $id); + $this->writer->writeAttribute('name', $combination['group_name']); + $this->writer->text($combination['attribute_name']); + $this->writer->endElement(); + } + } + + private function writeEnd() + { + $this->writer->endElement(); // end + $this->writer->endElement(); // end + $this->writer->endDocument(); + } + + private function formatXml() + { + $dom = dom_import_simplexml(simplexml_load_file($this->tmpFile))->ownerDocument; + $dom->formatOutput = true; + $formatted = $dom->saveXML(); + + unset($dom, $this->writer); + + file_put_contents($this->tmpFile, $formatted); + } }