Files
cdnPRO/dekodum.cz/index.php
2024-10-25 16:01:25 +02:00

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>';
}