= 4.3 i *nie* wymaga dodatkowych modułów takich jak DOM * Przykładowa baza danych sklepu była testowana z MySQL 4.1.x * * Przyjęto założenie, że baza sklepu zawiera dwie tabele, category i product. * * W pierwszej z nich znajdują się pola takie jak id kategorii, name (nazwa) * oraz parent_id (id kategorii nadrzędnej). W drugiej zaś przechowywane są * typowe informacje o produkcie. * * Skrypt jest przykładowy i wymaga dostosowania do konkretnych warunków, * konkretnego rozwiązania sklepowego i konkretnej struktury bazy danych. * * Specyfikacja formatu XML dostępna jest pod adresem: * https://www.nokaut.pl/dl/nokaut-integracja2.pdf * * W razie problemów prosimy o kontakt pod adresem integracja@nokaut.pl * * @copyright Nokaut Sp. z o.o. * @licence BSD */ // Nazwa pliku XML define('NOKAUT_XML_FILE', 'nokaut.xml'); // Wyłączenie kontroli czasu wykonywania skryptu set_time_limit(0); // Połączenie z bazą danych $connection = mysql_connect('localhost', 'root', '') or die(mysql_error()); mysql_select_db('sklep', $connection) or die(mysql_error()); $sql = "SET NAMES 'latin2'"; // wskazane przy MySQL >= 4.1, w tym przypadku zakładamy, że baza danych zawiera teksty w ISO-8859-2, natomiast może to być też np. UTF-8 mysql_query($sql) or die(mysql_error()); // Pobieranie i budowa drzewa kategorii // (przy każdej ofercie powinna być wyświetlana kategoria wraz z kategoriami nadrzędnymi) $sql = "SELECT * FROM category"; $results = mysql_query($sql) or die(mysql_error() . $sql); $categoryArray = array (); while ($category = mysql_fetch_assoc($results)) { $categoryArray[$category['id']] = $category; } foreach ($categoryArray as $category) { $categoryParent = $categoryArray[$category['id']]['parent_id']; $categoryPatch = $categoryArray[$category['id']]['name']; $counter = 0; while ($categoryParent) { $counter++; if ($counter > 100) break; if ($categoryParent != $categoryArray[$categoryParent]['parent_id']) { $categoryPatch = $categoryArray[$categoryParent]['name'] . " / " . $categoryPatch; $categoryParent = $categoryArray[$categoryParent]['parent_id']; } else { $categoryParent = 0; } } $categoryArray[$category['id']]['patch'] = $categoryPatch; } // Otwarcie pliku do zapisu if (false == is_writable(NOKAUT_XML_FILE)) { die('Nie mam praw do zapisu pliku ' . NOKAUT_XML_FILE); } $fxml = fopen(NOKAUT_XML_FILE, "w"); // Zapisanie nagłówka $openingTag = '<' . '?'; $closingTag = '?' . '>'; $xmlForHeader =<< XML; fwrite($fxml, $xmlForHeader); // Pobranie ofert z bazy danych oraz zapis ich do pliku $sql = " SELECT product.id, product.name, product.description, product.price, category.id as id_category, product.producer, product.image, product.instock, product.code, product.variant FROM product INNER JOIN product_category on product_category.product_id=product.id INNER JOIN category on product_category.category_id=category.id "; $results = mysql_query($sql) or die(mysql_error() . $sql); while ($offer = mysql_fetch_assoc($results)) { $idCategory = $offer['id_category']; $offer['category'] = $categoryArray[$idCategory]['patch']; $offer['promo'] = 'Oferta specjalna! Tylko do końca tego roku dostawa gratis!'; $offer['shipping'] = '9.50'; // koszt wysyłki $offer['url'] = 'http://www.twojsklep.pl/produkt.php?id=' . $offer['id']; if ($offer['instock'] > 0) { $offer['instock'] = 0; } else { $offer['instock'] = 4; } foreach ($offer as $k => $v) { // dodajemy CDATA dla większości pól, poza kilkoma wymienionymi // pozwala to na użycie dowolnych znaków w XML-u if (false == in_array($k, array ( 'id', 'price', 'instock', 'code', 'shipping' ))) { $offer[$k] = ''; } } $xmlForOffer =<< {$offer['id']} {$offer['name']} {$offer['description']} {$offer['url']} {$offer['image']} {$offer['price']} {$offer['category']} {$offer['producer']} {$offer['instock']} {$offer['shipping']} {$offer['code']} {$offer['variant']} {$offer['promo']} XML; fwrite($fxml, $xmlForOffer); } // Zapisanie stopki $xmlForFooter =<< XML; fwrite($fxml, $xmlForFooter); fclose($fxml); ?>