PHP скрипт для экспорта товаров в XML для магазина?

0

Итак, у меня есть ежедневное задание cron, в котором выполняется файл, который вызывает другой файл, который в комбинации экспортирует наш список продуктов в файл XML. Это два файла.

arrayxml.php

<?php
class ArrayXml {

    private $xml;

    public function __construct($root='store') {
        $this->xml = new SimpleXMLElement("<$root></$root>");
    }

    private function iterate($element, $xmlNode) {
        foreach($element as $name=>$value) {
            if(is_string($value) || is_numeric($value)) {
                $xmlNode->$name = $value;
            } 
            else {
                $xmlNode->$name = null;
                $this->iterate($value, $xmlNode->$name);
            }
        }
    }
    public function toXML($array) {
        $this->iterate($array, $this->xml);
        return $this->xml->asXML();
    }
}
?>

и export.php

<?php
    header('Content-Type: text/xml');
    include '../app/Mage.php';
    include 'arrayxml.php';

    Mage::app();

    $_products = Mage::getModel('catalog/product')->getCollection();

    $_result = array();

    foreach($_products as $_product) {
        $_product = $_product->load();

        $categoryIds = $_product->getCategoryIds();
        if (isset($categoryIds[0])){
            $category = Mage::getModel('catalog/category')->setStoreId(Mage::app()->getStore()->getId())->load($categoryIds[0]);
            $categoryName = $category->getName();
        }

        $_result['products']['product'][] = array(
            'productId' => $_product->getSku(),
            'title' => $_product->getName(),
            'description' => $_product->getDescription(),
            'price' => $_product->getFinalPrice(),
            'image' => 'http://dissios.com/media/catalog/product'.$_product->getImage(),
            'url' => 'http://dissios.com/'.$_product->getUrlPath(),
            'instock' => 'Y',
            'availability' => 'Διαθέσιμο',
            'category_id' => $categoryIds[0],
            'category_name' => $categoryName
        );
    }
    $_converter = new ArrayXML();
    echo $_converter->toXML($_result);
    $f = fopen("bestprice.xml", "w");
    fwrite($f, $_converter->toXML($_result));
    fclose($f);
?>

С тех пор я разделил сайт на отдельные магазины/представления, поэтому есть два домена, в которых я хочу, чтобы продукты имели URL-адреса, а не родительское хранилище (disios.com в коде выше).

Я бы хотел, чтобы этот код проверял код магазина и соответствующим образом корректировал URL-адрес, поэтому я бы использовал, например, http://eclock.gr/media/catalog/product '. $_product-> getImage() для одного и http://lourakiahirsch.gr/media/catalog/product '. $_product-> getImage() для другого.

Благодарю!

EDIT: Решено!

Вот код, который я изменил:

// Get the product store IDs
    $storeCode = $_product->getStoreIds();

    if ($storeCode[2] == '5') {

       $_result['products']['product'][] = array(
                'productId' => $_product->getSku(),
                'title' => $_product->getName(),
                'description' => $_product->getDescription(),
                'price' => $_product->getFinalPrice(),
                'image' => 'http://lourakiahirsch.gr/media/catalog/product'.$_product->getImage(),
                'url' => 'http://lourakiahirsch.gr/'.$_product->getUrlPath(),
                'instock' => 'Y',
                'availability' => 'Διαθέσιμο',
                'category_id' => $categoryIds[0],
                'category_name' => $categoryName
            );
    }
    else if ($storeCode[2] == '6') {

        $_result['products']['product'][] = array(
           'productId' => $_product->getSku(),
           'title' => $_product->getName(),
           'description' => $_product->getDescription(),
           'price' => $_product->getFinalPrice(),
           'image' => 'http://eclock.gr/media/catalog/product'.$_product->getImage(),
           'url' => 'http://eclock.gr/'.$_product->getUrlPath(),
           'instock' => 'Y',
           'availability' => 'Διαθέσιμο',
           'category_id' => $categoryIds[0],
           'category_name' => $categoryName
            );
    }
    else {
        $_result['products']['product'][] = array(
            'productId' => $_product->getSku(),
                'title' => $_product->getName(),
                'description' => $_product->getDescription(),
                'price' => $_product->getFinalPrice(),
                'image' => 'http://dissios.com/media/catalog/product'.$_product->getImage(),
                'url' => 'http://dissios.com/'.$_product->getUrlPath(),
                'instock' => 'Y',
                'availability' => 'Διαθέσιμο',
                'category_id' => $categoryIds[0],
                'category_name' => $categoryName
            );
    }
  • 0
    Во-первых, если у вас много продуктов, не используйте Mage::getModel('catalog/product')->getCollection() , потому что у вас будут проблемы с ограничением памяти и так далее. Используйте Iterator для извлечения из DD, например, 100 продуктов на запрос
  • 0
    @sergio спасибо, что мне использовать? у нас не так много продуктов, всего менее 1000 на двух сайтах. какие-либо идеи о том, как разделить URL-адреса для магазина?
Показать ещё 1 комментарий
Теги:
magento

1 ответ

0

В качестве одного из возможных способов сделать это вы можете сохранить идентификатор ваших магазинов (вы можете найти их в панели администратора Magento) в одном массиве, а затем пропустить их через следующее:

foreach($arrayOfStores as $storeId) {
       $store = Mage::app()->getStore($storeId);

И затем вы загружаете свою коллекцию:

$collection = Mage::getModel('catalog/product')
                ->getCollection()
                ->setStoreId( $storeId )
                ->addAttributeToSelect('*');
  • 0
    Я хотел бы, чтобы структура файлов была похожа на ту, которая у меня есть сейчас, насколько я могу, я не на 100% понимаю ваш код, но, похоже, мне придется изменить код, чтобы приспособиться? Я в основном хочу, чтобы в двух случаях, в зависимости от кода магазина, были отдельные URL-адреса для 'url' и 'image' внутри массива $ _result ['products'] ['product'] [].

Ещё вопросы

Сообщество Overcoder
Наверх
Меню