Для того, чтобы реализовать экспорт, чтобы в последующем можно было этот же файл изменять и импортировать обратно, уже с изменениями.
Для начала скопировал файлы экспорта и обозвал их по-другому.
У меня они находятся
/bitrix/modules/catalog/load/csv_ExportExcel_run.php
сформировал массив имен.
Вставил его в строчку 483
Код |
---|
$arSelect = array(
"ID",
"TITLE",
"ADDRESS"
);
$dbStoreProps = CCatalogStore::GetList(array('TITLE' => 'ASC', 'ID' => 'ASC'),array(),false,false,$arSelect);
while ($arProp = $dbStoreProps->GetNext())
{
if ($arProp["TITLE"]=='' && $arProp["ADDRESS"]!='')
$storeName = $arProp["ADDRESS"];
elseif ($arProp["ADDRESS"]=='' && $arProp["TITLE"]!='')
$storeName = $arProp["TITLE"];
else
$storeName = $arProp["TITLE"]." (".$arProp["ADDRESS"].")";
$arResult["STORES"][] = array(
'ID' => $arProp["ID"],
'TITLE' => $storeName,
);
}
$arAvailStoreFields_names = array();
foreach($arResult["STORES"] as $store){
$arAvailStoreFields_names['ST_STORE_ID'.$store['ID']]['field'] = 'STORE_ID'.$store['ID'];
$arAvailStoreFields_names['ST_STORE_ID'.$store['ID']]['id'] = $store['ID'];
$arAvailStoreFields_names['ST_STORE_ID'.$store['ID']]['count'] = $store['ID'];
$arAvailStoreFields_names['ST_COUNT_ID'.$store['ID']]['field'] = 'COUNT_ID'.$store['ID'];
}
foreach($arAvailStoreFields_names as $key => $store)
{
$arNeedFields[] = $key;
}
if ($first_line_names)
{
foreach($arNeedFields as $element)
{
$element = iconv("UTF-8","Windows-1251",$element);
}
$csvFile->SaveFile($_SERVER["DOCUMENT_ROOT"].$SETUP_FILE_NAME, $arNeedFields);
} |
теперь в
$arResult["STORES"] хранятся данные о всех складах, осталось их привести к удобному виду.
$arAvailStoreFields_names в этом массиве хранятся коды складов и количество
Также, были сложности при открытии этого файла с excel 2007, поэтому сразу произвожу перекодировку каждого поля шапки таблицы.
так как ход экспорта итерационный, то есть для каждого элемента выполняется действие, поэтому для каждого элемента заполняю массив количества позиций на конкретном складе
приведенный ниже код вставил в строчку 790 с учетом смещения предыдущим кодом.
Код |
---|
foreach($arAvailStoreFields_names as $key => $names)
{
if (strncmp($key, 'ST_STORE', 8) == 0)
{
$rsStore = CCatalogStoreProduct::GetList(array(), array('PRODUCT_ID' =>$arIBlockElement["ID"], 'STORE_ID' => $names['id']), false, false, array());
while ($arStore = $rsStore->Fetch())
{
$arAvailStoreFields_names['ST_COUNT_ID'.$names['id']]['count'] = $arStore['AMOUNT'];
}
}
} |
a теперь нужно дополнить массив, который пойдет на запись в файл
и собственно перед записью в файл перекодировать сами значения свойств
Код |
---|
for($i = 0; $i < count($arNeedFields)+1; $i++)
{
foreach($arAvailStoreFields_names as $key => $names)
{
if($arNeedFields[$i] == $key)
{
$arResFields[0][$i] = $names['count']; // count($arResFields)-1
break;
}
}
}
foreach($arResFields as $arTuple)
{
foreach($arTuple as $key=>$element)
{
$arTuple[$key] = iconv("UTF-8","Windows-1251",$element);
}
$csvFile->SaveFile($_SERVER["DOCUMENT_ROOT"].$SETUP_FILE_NAME, $arTuple);
$num_rows_writed++;
} |
приведенный выше код вставил в строчку 844
Заранее извиняюсь за стиль программирования (и костыли всякие), я еще начинающий программист, если это является оправданием.