117 lines
3.0 KiB
PHP
117 lines
3.0 KiB
PHP
<?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();
|
|
}
|
|
}
|
|
|
|
} |