<?require($_SERVER["DOCUMENT_ROOT"]. "/bitrix/modules/main/include/prolog_before.php");?>
<?
CModule::IncludeModule('iblock');
class ClImportCategory extends ClImportConfig
{
public $arCategory = array();
public $arParentId = array();
public function __construct() {}
public function __destruct()
{
unset($arCategory);
unset($arParentId);
}
/**
* Получаем список всех категорий из xml.
*/
public function AddCatsFromXml($addTo = 'db')
{
$reader = new XMLReader();
//echo $_SERVER["DOCUMENT_ROOT"]."/upload/import_xml/".$this->xmlFile;
$reader->open($_SERVER["DOCUMENT_ROOT"]."/upload/import_xml/".$this->xmlFile);
$counter = 0;
while ($reader->read())
{
if ($reader->nodeType == XMLReader::ELEMENT && $reader->localName == 'categories')
{
while ($reader->read())
{
if ($reader->nodeType == XMLReader::ELEMENT)
{
$sectionId = $reader->getAttribute('id');
$parentId = $reader->getAttribute('parentId');
}
elseif ($reader->nodeType == XMLReader::TEXT)
{
switch($addTo)
{
case 'ew':
case 'db':
if ($counter < $this->maxAddCat)
{
$id = $this->AddCats(
$reader->value,
$sectionId,
$parentId
);
$this->AddCat2Session(
$id,
$reader->value,
$sectionId,
$parentId
//$this->translitIt($reader->value)
);
if ($addTo == 'ew')
{
$this->arCategory[] = array(
'ID' => $id,
'UF_ID' => $sectionId,
'NAME' => $reader->value,
'UF_PARENT_ID' => $parentId
);
}
}
else
{
break 3;
}
$counter++;
break;
case 'array':
$this->arCategory[] = array(
'UF_ID' => $sectionId,
'NAME' => $reader->value,
'UF_PARENT_ID' => $parentId
);
break;
case 'session':
if ($counter < $this->maxAddCat)
{
$this->AddCat2Session(
$counter,
$reader->value,
$sectionId,
$parentId
//$this->translitIt($reader->value)
);
}
else
{
break 3;
}
$counter++;
break;
}
}
if ($reader->nodeType == XMLReader::END_ELEMENT && $reader->localName == 'categories')
{
break;
}
}
}
if ($reader->nodeType == XMLReader::END_ELEMENT && $reader->localName == 'categories')
{
break;
}
}
$reader->close();
unset($reader);
//echo "<pre>"; var_dump(count($_SESSION['CATS'])); echo "</pre>";
//die();
}
/**
* Добовляем разделы в ИБ
* @param $name
* @param $ufId
* @param $ufParentId
* @param bool $code
* @return bool|int
*/
public function AddCats($name, $ufId, $ufParentId, $code = false)
{
$bs = new CIBlockSection;
$arFields = array(
'IBLOCK_ID' => $this->iblockId,
'IBLOCK_SECTION_ID' => false,
'NAME' => $name,
//'CODE' => !$code ? $code : $this->translitIt($name),
'UF_ID' => $ufId,
'UF_PARENT_ID' => $ufParentId,
);
$id = $bs->Add($arFields);
if (!$id)
{
$this->pre($bs->LAST_ERROR);
die();
}
else
{
$this->pre('Добавлена категория: '.$name.'<br>');
return $id;
}
}
public function GroupCatByParentId($addTo = 'array')
{
$this->AddCatsFromXml($addTo);
$this->GetArCatParentId();
}
/**
* Создаем связи между категориями
* @param $arElement
* @return bool|int
*/
public function UpdateRelation($arElement)
{
$sectionId = $this->GetParentID($arElement['UF_PARENT_ID']);
$bs = new CIBlockSection;
$arFields = array('IBLOCK_SECTION_ID' => $sectionId);
//echo "<pre>"; var_dump($arElement['ID']); echo "</pre>";
$result = $bs->Update($arElement['ID'], $arFields);
if ($result)
{
return $result;
}
else
{
$this->pre($bs->LAST_ERROR);
die('null');
}
}
/**
* Получаем ID категории сайта из родителя XML
* @param $parentId
* @return mixed
*/
function GetParentId($parentId)
{
foreach ($_SESSION['CATS'] as $key => $arItem)
{
if ($parentId == $arItem['UF_ID'])
{
return $arItem['ID'];
}
}
}
/**
* Сохраняем все в сессию для пошаговости
* @param $id
* @param $name
* @param $code
* @param $ufId
* @param $ufParentId
*/
function AddCat2Session($id, $name, $ufId, $ufParentId, $code = false)
{
$_SESSION['CATS'][$id]['ID'] = $id;
$_SESSION['CATS'][$id]['NAME'] = $name;
$_SESSION['CATS'][$id]['UF_ID'] = $ufId;
$_SESSION['CATS'][$id]['UF_PARENT_ID'] = $ufParentId;
$_SESSION['CATS'][$id]['CODE'] = $code;
$_SESSION['CATS_UF_IDS'][] = $ufId;
$_SESSION['CATS_COUNT']++;
}
/**
* Перегруппировка массива категорий по атрибуту parentId
*/
public function GetArCatParentId()
{
$count = sizeof($this->arCategory);
if ($count > 0)
{
$this->arParentId[0] = $this->arCategory[0];
}
for ($i = 1; $i < $count; $i++)
{
$this->arParentId[$this->arCategory[$i]['UF_PARENT_ID']][] = array(
$this->arCategory[$i]['ID'],
$this->arCategory[$i]['UF_PARENT_ID'],
$this->arCategory[$i]['NAME']
);
}
//echo "<pre>"; var_dump($this->arParentId); echo "</pre>";
}
/**
* Вывод дерева разделов
* @param $parentId
* @param $level
*/
public function ShowCategory($parentId, $level)
{
if (isset($this->arParentId[$parentId]))
{
foreach ($this->arParentId[$parentId] as $arItem)
{
echo "<div style=\"margin-left:" . ($level * 10) . "px;\">" .$parentId."//". $arItem[1] . "</div>";
$level++;
$this->ShowCategory($arItem[0], $level);
$level--;
}
}
}
};
class ClImportOffer extends ClImportCategory
{
};
class ClImportConfig
{
public $iblockId = 11;
public $xmlFile = 'lamoda.xml';
public $maxAddCat = 150;
public $offset = 50;
public $debugMode = false;
public function pre($data)
{
if ($this->debugMode === true)
{
echo $data;
}
}
function translitIt($str)
{
$str = ClTranslit::transliterate($str);
$str = ClTranslit::asURLSegment($str);
return $str;
}
};
final class ClTranslit{
/**
* Укр/Рус символы
*
* @var array
* @access private
* @static
*/
static private $cyr = array(
'Щ', 'Ш', 'Ч', 'Ц','Ю', 'Я', 'Ж', 'А','Б','В','Г','Д','Е','Ё','З','И','Й','К','Л','М','Н','О','П','Р','С','Т','У','Ф','Х', 'Ь','Ы','Ъ','Э','Є','Ї','І',
'щ', 'ш', 'ч', 'ц','ю', 'я', 'ж', 'а','б','в','г','д','е','ё','з','и','й','к','л','м','н','о','п','р','с','т','у','ф','х', 'ь','ы','ъ','э','є','ї', 'і');
/**
* Латинские соответствия
*
* @var array
* @access private
* @static
*/
static private $lat = array(
'Shh','Sh','Ch','C','Ju','Ja','Zh','A','B','V','G','D','Je','Jo','Z','I','J','K','L','M','N','O','P','R','S','T','U','F','Kh','Y','Y','','E','Je','Ji','I',
'shh','sh','ch','c','ju','ja','zh','a','b','v','g','d','je','jo','z','i','j','k','l','m','n','o','p','r','s','t','u','f','kh','y','y','','e','je','ji', 'i');
/**
* Приватный конструктор класса
* не дает создавать объект этого класса
*
* @access private
*/
private function __construct() {}
/**
* Статический метод транслитерации
*
* @param string
* @return string
* @access public
* @static
*/
static public function transliterate($string, $wordSeparator = '', $clean = false)
{
//$str = iconv($encIn, "utf-8", $str);
for($i=0; $i<count(self::$cyr); $i++)
{
$string = str_replace(self::$cyr[$i], self::$lat[$i], $string);
}
$string = preg_replace("/([qwrtpsdfghklzxcvbnmQWRTPSDFGHKLZXCVBNM]+)[jJ]e/", "\${1}e", $string);
$string = preg_replace("/([qwrtpsdfghklzxcvbnmQWRTPSDFGHKLZXCVBNM]+)[jJ]/", "\${1}y", $string);
$string = preg_replace("/([eyuioaEYUIOA]+)[Kk]h/", "\${1}h", $string);
$string = preg_replace("/^kh/", "h", $string);
$string = preg_replace("/^Kh/", "H", $string);
$string = trim($string);
if ($wordSeparator)
{
$string = str_replace(' ', $wordSeparator, $string);
$string = preg_replace('/['.$wordSeparator.']{2,}/','', $string);
}
if ($clean)
{
$string = strtolower($string);
$string = preg_replace('/[^-_a-z0-9]+/','', $string);
}
//return iconv("utf-8", $encOut, $str);
return $string;
}
/**
* Приведение к УРЛ
*
* @return string
* @access public
* @static
*/
static public function asURLSegment($string)
{
return strtolower(self::transliterate($string, '_', true));
}
}
?>