Итак, у меня есть ежедневное задание 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
);
}
В качестве одного из возможных способов сделать это вы можете сохранить идентификатор ваших магазинов (вы можете найти их в панели администратора Magento) в одном массиве, а затем пропустить их через следующее:
foreach($arrayOfStores as $storeId) {
$store = Mage::app()->getStore($storeId);
И затем вы загружаете свою коллекцию:
$collection = Mage::getModel('catalog/product')
->getCollection()
->setStoreId( $storeId )
->addAttributeToSelect('*');
Mage::getModel('catalog/product')->getCollection()
, потому что у вас будут проблемы с ограничением памяти и так далее. Используйте Iterator для извлечения из DD, например, 100 продуктов на запрос