170 lines
5.4 KiB
PHP
170 lines
5.4 KiB
PHP
<?php
|
|
error_reporting(E_ALL ^ E_NOTICE ^ E_STRICT ^ E_WARNING ^ E_DEPRECATED);
|
|
include '../_plugins/medoo.php';
|
|
$reader = new XMLReader();
|
|
$writer = new XMLWriter();
|
|
|
|
$mdb = new medoo([
|
|
'database_type' => 'mysql',
|
|
'database_name' => 'host117523_temp',
|
|
'server' => 'localhost',
|
|
'username' => 'host117523_temp',
|
|
'password' => 'XAGwZ3XRa9fgtM63um7v',
|
|
'charset' => 'utf8'
|
|
]);
|
|
|
|
// Otwórz plik XML do odczytu
|
|
if (!$reader->open('googleProducts.xml')) {
|
|
die("Failed to open the XML file");
|
|
}
|
|
|
|
// Liczba wszystkich elementów `item`
|
|
$totalItems = 0;
|
|
while ($reader->read()) {
|
|
if ($reader->nodeType == XMLReader::ELEMENT && $reader->localName == 'item') {
|
|
$totalItems++;
|
|
}
|
|
}
|
|
$reader->close();
|
|
|
|
// Otwórz ponownie plik XML do przetwarzania
|
|
$reader->open('googleProducts.xml');
|
|
|
|
// Otwórz plik tymczasowy XML do zapisu
|
|
$tempFile = 'googleProducts_temp.xml';
|
|
$writer->openURI($tempFile);
|
|
$writer->startDocument('1.0', 'UTF-8');
|
|
$writer->setIndent(true);
|
|
|
|
// Dodanie przestrzeni nazw
|
|
$writer->startElement('rss');
|
|
$writer->writeAttribute('version', '2.0');
|
|
$writer->writeAttribute('xmlns:g', 'http://base.google.com/ns/1.0');
|
|
$writer->startElement('channel');
|
|
|
|
// Inicjalizacja zmiennych
|
|
$products = [];
|
|
$skipFirstItems = 1000;
|
|
$processedItems = 0;
|
|
$hasMoreItems = false;
|
|
|
|
// Przeczytaj XML strumieniowo
|
|
while ($reader->read()) {
|
|
if ($reader->nodeType == XMLReader::ELEMENT && $reader->localName == 'item') {
|
|
if ($processedItems < $skipFirstItems) {
|
|
// Przetwórz elementy `item` do momentu przekroczenia limitu `skipFirstItems`
|
|
$product = [];
|
|
$depth = $reader->depth;
|
|
$processedItems++;
|
|
|
|
while ($reader->read() && !($reader->nodeType == XMLReader::END_ELEMENT && $reader->depth == $depth)) {
|
|
if ($reader->nodeType == XMLReader::ELEMENT) {
|
|
$currentElement = $reader->name;
|
|
$namespaceURI = $reader->namespaceURI;
|
|
} elseif ($reader->nodeType == XMLReader::TEXT || $reader->nodeType == XMLReader::CDATA) {
|
|
if (!isset($product[$currentElement])) {
|
|
$product[$currentElement] = '';
|
|
}
|
|
$product[$currentElement] .= $reader->value;
|
|
}
|
|
}
|
|
|
|
// Dodaj produkt do listy produktów
|
|
$products[] = $product;
|
|
} else {
|
|
$hasMoreItems = true;
|
|
// Przepisywanie pozostałych elementów `item`
|
|
$writer->startElement('item');
|
|
$depth = $reader->depth;
|
|
|
|
while ($reader->read() && !($reader->nodeType == XMLReader::END_ELEMENT && $reader->depth == $depth)) {
|
|
if ($reader->nodeType == XMLReader::ELEMENT) {
|
|
$writer->startElement($reader->name);
|
|
if ($reader->hasAttributes) {
|
|
while ($reader->moveToNextAttribute()) {
|
|
$writer->writeAttribute($reader->name, $reader->value);
|
|
}
|
|
$reader->moveToElement();
|
|
}
|
|
} elseif ($reader->nodeType == XMLReader::TEXT) {
|
|
$writer->text($reader->value);
|
|
} elseif ($reader->nodeType == XMLReader::CDATA) {
|
|
$writer->writeCData($reader->value);
|
|
} elseif ($reader->nodeType == XMLReader::END_ELEMENT) {
|
|
$writer->endElement();
|
|
}
|
|
}
|
|
$writer->endElement();
|
|
}
|
|
} elseif ($reader->nodeType == XMLReader::ELEMENT && $reader->localName != 'rss' && $reader->localName != 'channel') {
|
|
// Przepisywanie elementów XML poza przetworzonymi 'item' oraz pomijanie 'rss' i 'channel'
|
|
$writer->startElement($reader->name);
|
|
if ($reader->hasAttributes) {
|
|
while ($reader->moveToNextAttribute()) {
|
|
$writer->writeAttribute($reader->name, $reader->value);
|
|
}
|
|
$reader->moveToElement();
|
|
}
|
|
} elseif ($reader->nodeType == XMLReader::TEXT) {
|
|
$writer->text($reader->value);
|
|
} elseif ($reader->nodeType == XMLReader::CDATA) {
|
|
$writer->writeCData($reader->value);
|
|
} elseif ($reader->nodeType == XMLReader::END_ELEMENT && $reader->localName != 'rss' && $reader->localName != 'channel') {
|
|
$writer->endElement();
|
|
}
|
|
}
|
|
|
|
// Zakończ elementy
|
|
$writer->endElement(); // channel
|
|
$writer->endElement(); // rss
|
|
|
|
// Zakończ dokument
|
|
$writer->endDocument();
|
|
$writer->flush();
|
|
|
|
// Zamknij oba pliki
|
|
$reader->close();
|
|
|
|
// Podmiana oryginalnego pliku tymczasowym
|
|
if (!rename($tempFile, 'googleProducts.xml')) {
|
|
die("Failed to replace the original XML file");
|
|
}
|
|
|
|
// echo '<pre>' . print_r($products, true) . '</pre>';
|
|
|
|
// Wyświetl produkty i zapisz do bazy danych
|
|
$addedProducts = 0;
|
|
foreach ($products as $product) {
|
|
$productId = $product['g:id'];
|
|
// Sprawdź, czy produkt już istnieje w bazie danych
|
|
$existingProduct = $mdb->get('dekodum_xml', '*', ['product_id' => $productId]);
|
|
|
|
if (!$existingProduct) {
|
|
$addedProducts++;
|
|
// Jeśli produkt nie istnieje, dodaj go do bazy danych
|
|
$mdb->insert('dekodum_xml', [
|
|
'product_id' => $productId,
|
|
'title' => $product['title'],
|
|
'link' => $product['link'],
|
|
'image_link' => $product['g:image_link'],
|
|
'mpn' => $product['g:mpn'],
|
|
'brand' => $product['g:brand'],
|
|
'google_product_category' => $product['g:google_product_category'],
|
|
'item_group_id' => $product['g:item_group_id'],
|
|
]);
|
|
}
|
|
}
|
|
|
|
$remainingItems = $totalItems - $processedItems;
|
|
|
|
echo "Pierwsze $skipFirstItems elementów 'item' zostało odczytanych. Dodałem $addedProducts produktów. Pozostało $remainingItems elementów do przetworzenia.";
|
|
|
|
// Odśwież stronę, jeśli są jeszcze elementy 'item'
|
|
if ($hasMoreItems) {
|
|
echo '<script>
|
|
setTimeout(function(){
|
|
window.location.reload();
|
|
}, 1000);
|
|
</script>';
|
|
}
|