Question

The past couple of hours I am trying to generate an xml file like this

<?xml version="1.0" encoding="UTF-8"?>
<mywebstore>
   <created_at>2010-04-08 12:32</created_at>
   <products>
      <product>
          <id>322233</id>
          <name><![CDATA[MadBiker 600 Black Polarized]]></name>
          <link><![CDATA[http://www.mywebstore.gr/product/322233]]></link>
          <image><![CDATA[http://www.mywebstore.gr/product/322233.jpg]]></image>
          <category id="23"><![CDATA[Sports > Extreme Sports]]></category>
          <price_with_vat>322.33</price_with_vat>
          <manufacturer><![CDATA[SuperGlasses]]></manufacturer>
          <description><![CDATA[This is the description.....]]></description>
          <weight>350</weight>
          <mpn>ZHD332</mpn>
          <instock>N</instock>
          <availability>Pre-order</availability>
      </product>
      <product>
       ...
      </product>
   </products>
</mywebstore>

from opencart.

I have written this piece of code

<?php
class ControllerFeedSkroutzXml extends Controller {
    public function index() {
        $this->language->load('feed/skroutz_xml');

        if ($this->config->get('skroutz_xml_status')) {
            $output  = '<?xml version="1.0" encoding="UTF-8"?>';
            $output .= '<mywebstore>';
            $output .= '<created_at>' . date('Y-m-d H:i') . '</created_at>';
            $output .= '<products>';

            $this->load->model('catalog/product');

            $products = $this->model_catalog_product->getProducts();

            foreach ($products as $product) {

                $attribute_groups = $this->model_catalog_product->getProductAttributes($product['product_id']);
                //print_r($attribute_groups);
                if (!empty($attribute_groups)) {
                    foreach ($attribute_groups as $attribute_group) {
                        if (!empty($attribute_group)) {
                            foreach ($attribute_group['attribute'] as $attribute) {
                                $attribute = array_filter($attribute);
                                if (!empty($attribute)) {
                                    // [attribute_id] => 13, Color
                                    if ($attribute['attribute_id'] == 13 && $attribute['text'] != '') {
                                        $attribute_color = $attribute['text'];
                                    }
                                    // [attribute_id] => 16, Lens Technology
                                    if ($attribute['attribute_id'] == 16 && $attribute['text'] != '') {
                                        $attribute_lens_technology = $attribute['text'];
                                    }
                                }
                            }                           
                        }
                    }
                }

                if ($product['special']) {
                    $final_price = number_format((float)$product['special'], 2, '.', '');
                } else {
                    $final_price = number_format((float)$product['price'], 2, '.', '');
                }
                if ($product['quantity'] > 0) {
                    $instock = $this->language->get('instock_Y');
                } else {
                    $instock = $this->language->get('instock_N');
                }

                $output .= '<product>';
                $output .= '<id>' . $product['product_id'] . '</id>';
                $output .= '<name><![CDATA[' . $this->language->get('category_name') . ' ' . $product['name'] . ' ' . $attribute_color . ' ' . $attribute_lens_technology . ']]></name>';
                $output .= '<link><![CDATA[' . $this->url->link('product/product', 'product_id=' . $product['product_id']) . ']]></link>';
                $output .= '<image><![CDATA['. HTTP_IMAGE . $product['image'] . ']]></image>';
                $output .= '<category id="' . $product['manufacturer_id'] . '"><![CDATA[ ' . $this->language->get('category_name') . ' > ' . $product['manufacturer'] . ' ]]></category>';
                $output .= '<price_with_vat>' . $final_price . '</price_with_vat>';
                $output .= '<manufacturer><![CDATA[' . $product['manufacturer'] . ']]></manufacturer>';
                $output .= '<description><![CDATA[' . $product['meta_description'] . ']]></description>';
                $output .= '<instock>' . $instock . '</instock>';
                $output .= '<availability>' . $product['stock_status'] . '</availability>';
                $output .= '</product>';
            }

            $output .= '</products>';
            $output .= '</mywebstore>';

            $this->response->addHeader('Content-Type: application/xml');
            $this->response->setOutput($output);
        }
    }
}
?>

But the block of code that generates the attributes it doesn't work as expected.
A lot of my products don't have attributes (at least not yet), so what I want to accomplish is to show attributes right next to the name of the product

Example
Name: MadBiker 600
Attribute - Color: Black
Attribute - Lens Technology : Polarized

All together <name>MadBiker 600 Black Polarized</name>

Only if a product has attributes! The above php code generates the <name>MadBiker 600 Black Polarized</name> to all empty of attributes products until it finds the next product with an attribute!

Could someone please point out where is the problem?

Thank you!

Was it helpful?

Solution

You aren't resetting the $attribute_lens_technology and $attribute_color with each iteration of the foreach. You need to reset these after the foreach loop definition

New foreach loop:

        foreach ($products as $product) {
            $attribute_lens_technology = false;
            $attribute_color = false;

            $attribute_groups = $this->model_catalog_product->getProductAttributes($product['product_id']);
            //print_r($attribute_groups);
            if (!empty($attribute_groups)) {
                foreach ($attribute_groups as $attribute_group) {
                    if (!empty($attribute_group)) {
                        foreach ($attribute_group['attribute'] as $attribute) {
                            $attribute = array_filter($attribute);
                            if (!empty($attribute)) {
                                // [attribute_id] => 13, Color
                                if ($attribute['attribute_id'] == 13 && $attribute['text'] != '') {
                                    $attribute_color = $attribute['text'];
                                }
                                // [attribute_id] => 16, Lens Technology
                                if ($attribute['attribute_id'] == 16 && $attribute['text'] != '') {
                                    $attribute_lens_technology = $attribute['text'];
                                }
                            }
                        }                           
                    }
                }
            }

            if ($attribute_lens_technology === false || $attribute_color === false) {
                // Code here such as continue; if you want to skip products without both attributes
            }

            if ($product['special']) {
                $final_price = number_format((float)$product['special'], 2, '.', '');
            } else {
                $final_price = number_format((float)$product['price'], 2, '.', '');
            }
            if ($product['quantity'] > 0) {
                $instock = $this->language->get('instock_Y');
            } else {
                $instock = $this->language->get('instock_N');
            }

            $output .= '<product>';
            $output .= '<id>' . $product['product_id'] . '</id>';
            $output .= '<name><![CDATA[' . $this->language->get('category_name') . ' ' . $product['name'] . ' ' . $attribute_color . ' ' . $attribute_lens_technology . ']]></name>';
            $output .= '<link><![CDATA[' . $this->url->link('product/product', 'product_id=' . $product['product_id']) . ']]></link>';
            $output .= '<image><![CDATA['. HTTP_IMAGE . $product['image'] . ']]></image>';
            $output .= '<category id="' . $product['manufacturer_id'] . '"><![CDATA[ ' . $this->language->get('category_name') . ' > ' . $product['manufacturer'] . ' ]]></category>';
            $output .= '<price_with_vat>' . $final_price . '</price_with_vat>';
            $output .= '<manufacturer><![CDATA[' . $product['manufacturer'] . ']]></manufacturer>';
            $output .= '<description><![CDATA[' . $product['meta_description'] . ']]></description>';
            $output .= '<instock>' . $instock . '</instock>';
            $output .= '<availability>' . $product['stock_status'] . '</availability>';
            $output .= '</product>';
        }

OTHER TIPS

It's easier to write an xml file using simplexml than it is to manually try and output your own.

Nevertheless, here's a simple shorthand if statement to fix to your problem though (if attribute color is empty, it will append an empty string instead:

$output .= !empty($attribute_color) ? '<name><![CDATA[' . $this->language->get('category_name') . ' ' . $product['name'] . ' ' . $attribute_color . ' ' . $attribute_lens_technology . ']]></name>' : '';
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top