Joywork/import/ZipalNewbuildingsLoaderNew.php

117 lines
3.0 KiB
PHP
Raw Normal View History

2026-05-22 20:21:54 +02:00
<?php
class ZipalNewbuildingsLoaderNew
{
const SECTION_ITEM = 'item';
private $currentPath = [];
private function getNextSection(\XmlReader $reader)
{
if ($reader->nodeType == \XmlReader::END_ELEMENT) {
$this->closeElement($reader->localName);
}
while ($reader->read()) {
switch ($reader->nodeType) {
case \XMLReader::ELEMENT:
$this->currentPath[] = $reader->localName;
if ($reader->localName === $this::SECTION_ITEM) {
return 1;
}
break;
case \XMLReader::END_ELEMENT:
$this->closeElement($reader->localName);
break;
}
}
return 0;
}
private function closeElement($elementName)
{
while ($this->currentPath && array_pop($this->currentPath) !== $elementName) ;
}
private function getItemFieldsArray(\XmlReader $reader)
{
$attrs = [];
while($reader->read() && !$this->isItemEnd($reader)) {
switch ($reader->nodeType) {
case XMLReader::END_ELEMENT:
continue;
break;
case XMLReader::ELEMENT:
$attrs[$reader->name] = $reader->isEmptyElement ? '' : $this->getItemFieldsArray($reader);
break;
case XMLReader::TEXT:
case XMLReader::CDATA:
return $reader->value;
}
}
return $attrs;
}
private function isItemEnd(\XmlReader $reader) {
return $reader->nodeType == \XmlReader::END_ELEMENT && $reader->localName === 'item';
}
private function getElements(\XmlReader $reader, ModelBuilder $builder)
{
$newElementsCount = 0;
$count = 0;
$model = $builder->getModel($data = $this->getItemFieldsArray($reader));
assert('$model instanceof ImportRecord');
$isNew = $model->getIsNewRecord();
if ($model instanceof ZipalNewbuildingItemNew) {
if ($model->save()) {
if ($isNew) {
++$newElementsCount;
}
++$count;
} else {
echo 'Cannt save model!';
}
}
return [$newElementsCount, $count];
}
public function load()
{
$reader = new \XmlReader();
$reader->open('https://zipal.ru/import/buildings.xml');
$startTime = time();
try {
$builder = new ZipalNewbuildingItemBuilderNew();
while ($sectionId = $this->getNextSection($reader)) {
if ($sectionId != 1) {
continue;
}
$this->getElements($reader, $builder);
}
$wastedTime = time() - $startTime;
echo $wastedTime;
} catch (\Exception $e) {
var_dump($e);
} finally {
$reader->close();
}
}
}