Есть вот такой рабочий вариант автообмена:
<?php
@ini_set('display_errors', 1);
error_reporting(E_ALL);
@set_time_limit(90000);
/* Подключаем основные классы */
require_once(dirname(__FILE__) . '/' . 'bootstrap.php');
//echo ini_get("max_execution_time");
// Проверка авторизации
//Core_Auth::authorization('Shop'); // Если скрипт будет запускаться только из браузера - желательно расскоментировать эту строку. Для крона строка должна быть закомментирована!
Core_Auth::authorization('Shop');
//echo(CURRENT_SITE);
if (!defined('CURRENT_SITE')){
$oShop = Core_Entity::factory('Shop', Core_Array::getRequest('shop_id', 3));
define('CURRENT_SITE', $oShop->site_id);
$oSite = Core_Entity::factory('Site', CURRENT_SITE);
Core::initConstants($oSite);
}
if (!defined('SITE_LOCAL')){
$oSite = Core_Entity::factory('Site', CURRENT_SITE);
define('SITE_LOCAL', $oSite->locale);
}
if(!isset($argv[1])){
define("AUTO_IMPORT", true);// идет запуск через браузер
$import_price_max_count = 100;
}
else{
define("AUTO_IMPORT_CRON", true);// идет запуск через крон
$import_price_max_count = 100;// устанавливаем количество товара импортируемого за один (единственный) проход
}
// Инициализация переменных
$_REQUEST['shop_id'] = 3;
$_REQUEST['locale'] = "Windows-1251";
$_REQUEST['hostcms']['action'] = 'start_import';
define('CHMOD', octdec($oSite->chmod)); // octdec - преобразование 8-ричного в 10-тичное
define('CHMOD_FILE', octdec($oSite->files_chmod)); // octdec - преобразование 8-ричного в 10-тичное
// ВНИМАНИЕ! Оставьте в этом массиве только нужные Вам поля!
$aGetParam = array(
// идентификатор родительской директории для выгрузки данных
'shop_groups_parent_id' => 758,
//'group_id' => 758,
// дополнительный путь для изображений
'import_price_load_files_path' => '',
// максимальное время загрузки данных за один проход
'import_price_max_time' => 20,
// что делать со старыми картинками? 0 - не удалять, 1 - удалять
'import_price_action_delete_image' => 0,
// максимальное количество товаров, импортируемых за один проход
'import_price_max_count' => $import_price_max_count,
// первая строка - название полей?
'firstlineheader' => 1,
// входной файл
'csv_filename' => CMS_FOLDER . 'price_new3.csv',
// разделитель данных
'import_price_separator' => ';',
// ограничитель данных
'import_price_stop' => '"',
// действия над существующими товарами, 1 - обновить
'import_price_action_items' => Core_Array::getGet('importAction', 1),
// использовать событийную индексацию
'search_event_indexation' => 0,
// Основные свойства товаров, групп, а так же сервисные данные (ярлыки, дополнительные группы и прочее)
// Название группы товаров
// 'field0' => 'shop_groups_value',
// CML идентификатор группы
// 'field1' => 'shop_groups_cml_id',
// CML идентификатор родительской группы
// 'field2' => 'shop_shop_groups_parent_cml_id',
// SEO Title для группы
// 'field3' => 'shop_groups_seo_title',
// SEO Description для группы
// 'field4' => 'shop_groups_seo_description',
// SEO Keywords для группы
// 'field5' => 'shop_groups_seo_keywords',
// Описание группы
// 'field6' => 'shop_groups_description',
// Путь для группы
// 'field7' => 'shop_groups_path',
// Название товара
// 'field4' => 'item_name',
// 'Название' => 'item_name',
// Описание товара
// 'field9' => 'shop_items_catalog_description',
// Артикул товара
// 'field5' => 'item_marking',
// Артикул родительского товара
// 'field11' => 'shop_item_parent_mark',
//'field7' => 'item_description',
//'field8' => 'item_text',
// Текст товара
// 'field12' => 'shop_items_catalog_text',
// Вес товара
// 'field13' => 'shop_items_catalog_weight',
//'field13' => 'item_length',
// Тип товара
// 'field14' => 'shop_shop_items_catalog_type',
//'field14' => 'item_width',
// Остаток товара на складе (Количество по старому)
// 'field15' => 'shop_items_catalog_rest',
//'field15' => 'item_height',
// Цена товара
// 'field16' => 'item_price',
// Активность товара
// 'field17' => 'shop_items_catalog_is_active',
// Порядок сортировки товара
// 'field18' => 'shop_items_catalog_order',
// Путь для товара
// 'field19' => 'shop_items_catalog_path',
// Идентификатор налога товара
// 'field20' => 'shop_tax_id',
// Идентификатор валюты товара
// 'field21' => 'shop_currency_id',
// Название продавца товара
// 'field22' => 'shop_sallers_name',
// Название производителя товара
// 'Производитель' => 'shop_producers_list_value',
// Идентификатор единицы измерения товара
// 'field24' => 'shop_mesures_id',
// SEO Title товара
// 'field25' => 'shop_items_catalog_seo_title',
// SEO Description товара
// 'field26' => 'shop_items_catalog_seo_description',
// SEO Keywords товара
// 'field27' => 'shop_items_catalog_seo_keywords',
// Флаг "Индексировать" для товара
// 'field28' => 'shop_items_catalog_indexation',
// Флаг "Выгружать в Яндекс.Маркет" для товара
// 'field29' => 'shop_shop_items_catalog_yandex_market_allow',
// Флаг "Выгружать в Рамблер.Покупки" для товара
// 'field30' => 'shop_shop_items_catalog_rambler_pokupki_allow',
// Яндекс.Маркет BID
// 'field31' => 'shop_shop_items_catalog_yandex_market_bid',
// Яндекс.Маркет CID
// 'field32' => 'shop_shop_items_catalog_yandex_market_cid',
// Дата создания товара
// 'field33' => 'shop_shop_items_catalog_date_time',
// Дата начала публикации товара
// 'field34' => 'shop_shop_items_catalog_putoff_date',
// Дата окончания публикации товара
// 'field35' => 'shop_shop_items_catalog_putend_date',
// Изображение группы
// 'field36' => 'shop_groups_image',
// CML идентификатор товара
// 'CODE' => 'shop_items_cml_id',
// артикул родительского товара (модификация)
// 'field38' => 'shop_item_parent_mark',
/* // Доп. Изображение товара 1
'field39' => 'prop-218',
// Доп. Малое Изображение товара 1
'field40' => 'propsmall-218',
// Доп. Изображение товара 2
'field41' => 'prop-219',
// Доп. Малое Изображение товара 2
'field42' => 'propsmall-219',
// Доп. Изображение товара 3
'field43' => 'prop-220',
// Доп. Малое Изображение товара 3
'field44' => 'propsmall-220', */
// Остаток товара на складе - Основной (Количество товара по новому)
// 'Остаток поставщика' => 'warehouse-9'
'field0' => 'item_cml_id',
'field1' => '',
'field2' => 'item_name',
'field3' => 'producer_name',
'field4' => '',
'field5' => '',
'field6' => '',
'field7' => 'item_image',
'field8' => '',
'field9' => '',
'field10' => 'item_country_of_origin',
'field11' => '',
'field12' => 'item_height',
'field13' => 'item_length',
'field14' => 'item_width',
'field15' => '',
'field16' => '',
'field17' => '',
'field18' => '',
'field19' => '',
'field20' => '',
'field21' => '',
'field22' => '',
'field23' => '',
'field24' => '',
'field25' => '',
'field26' => '',
'field27' => '',
'field28' => '',
'field29' => '',
'field30' => '',
'field31' => '',
'field32' => '',
'field33' => '',
'field34' => '',
'field35' => '',
'field36' => '',
'field37' => '',
'field38' => '',
'field39' => '',
'field40' => '',
'field41' => '',
'field42' => '',
'field43' => 'item_price',
'field44' => '',
'field45' => '',
'field46' => 'warehouse-3',
'field47' => '',
'field48' => '',
'field49' => '',
'field50' => '',
'field51' => '',
'field52' => '',
'field53' => '',
'field54' => 'item_text',
'field55' => '',
'field56' => 'item_description',
'field57' => '',
'field58' => '',
'field59' => '',
'field60' => '',
'field61' => '',
'field62' => 'item_marking',
'field63' => '',
'field64' => '',
'field65' => 'prop-79',
'field66' => '',
'field67' => '',
'field68' => '',
'field69' => '',
'field70' => '',
'field71' => '',
'field72' => '',
'field73' => '',
'field74' => '',
'field75' => '',
'field76' => '',
'field77' => '',
'field78' => '',
);
$Shop_Item_Import_Csv_Controller = new Shop_Item_Import_Csv_Controller(Core_Array::getRequest('shop_id', 3), Core_Array::get($aGetParam, 'shop_groups_parent_id', 758));
$aConformity = array();
foreach ($aGetParam as $iKey => $sValue){
if(mb_strpos($iKey, "field") === 0){
$aConformity[] = $sValue;
}
}
$iNextSeekPosition = Core_Array::getGet('seek', 0);
$Shop_Item_Import_Csv_Controller
->file(Core_Array::get($aGetParam, 'csv_filename'))
->encoding(Core_Array::get($aGetParam, 'locale', 'Windows-1251'))
->csv_fields($aConformity)
->time(Core_Array::get($aGetParam, 'import_price_max_time'))
->step(Core_Array::get($aGetParam, 'import_price_max_count'))
->separator(Core_Array::get($aGetParam, 'import_price_separator'))
->limiter(Core_Array::get($aGetParam, 'import_price_stop'))
->imagesPath(Core_Array::get($aGetParam, 'import_price_load_files_path'))
->importAction(Core_Array::get($aGetParam, 'import_price_action_items'))
->searchIndexation(Core_Array::get($aGetParam, 'search_event_indexation'))
;
if(!$iNextSeekPosition && Core_Array::get($aGetParam, 'firstlineheader', 0)){
$fInputFile = fopen(Core_Array::get($aGetParam, 'csv_filename'), 'rb');
@fgetcsv($fInputFile, 0, Core_Array::get($aGetParam, 'import_price_separator'), Core_Array::get($aGetParam, 'import_price_stop'));
$iNextSeekPosition = ftell($fInputFile);
fclose($fInputFile);
}
$Shop_Item_Import_Csv_Controller->seek = $iNextSeekPosition;
ob_start();
if(($iNextSeekPosition = $Shop_Item_Import_Csv_Controller->import()) !== FALSE){
if($Shop_Item_Import_Csv_Controller->importAction == 0){
$Shop_Item_Import_Csv_Controller->importAction = 1;
}
$iRedirectTime = 10;
$InsertedItemsCount = Core_Array::getRequest('InsertedItemsCount', 0) + $Shop_Item_Import_Csv_Controller->getInsertedItemsCount();
$UpdatedItemsCount = Core_Array::getRequest('UpdatedItemsCount', 0) + $Shop_Item_Import_Csv_Controller->getUpdatedItemsCount();
$InsertedGroupsCount = Core_Array::getRequest('InsertedGroupsCount', 0) + $Shop_Item_Import_Csv_Controller->getInsertedGroupsCount();
$UpdatedGroupsCount = Core_Array::getRequest('UpdatedGroupsCount', 0) + $Shop_Item_Import_Csv_Controller->getUpdatedGroupsCount();
@header('Refresh: '.$iRedirectTime.'; URL=/auto_import_csv3.php?'."shop_id=".Core_Array::getRequest('shop_id', 3)."&shop_group_id=".Core_Array::get($aGetParam, 'shop_groups_parent_id', 758)."&importAction=".$Shop_Item_Import_Csv_Controller->importAction."&seek=".$iNextSeekPosition."&InsertedItemsCount={$InsertedItemsCount}&UpdatedItemsCount={$UpdatedItemsCount}&InsertedGroupsCount={$InsertedGroupsCount}&UpdatedGroupsCount={$UpdatedGroupsCount}");
showStat($Shop_Item_Import_Csv_Controller);
}
else{
Core_Message::show(Core::_('Shop_Item.msg_download_price_complete'));
showStat($Shop_Item_Import_Csv_Controller);
}
exit(ob_get_clean());
function showStat($Shop_Item_Import_Csv_Controller)
{
echo Core::_('Shop_Item.count_insert_item') . ' — <b>' . (Core_Array::getRequest('InsertedItemsCount', 0) + $Shop_Item_Import_Csv_Controller->getInsertedItemsCount()) . '</b><br/>';
echo Core::_('Shop_Item.count_update_item') . ' — <b>' . (Core_Array::getRequest('UpdatedItemsCount', 0) + $Shop_Item_Import_Csv_Controller->getUpdatedItemsCount()) . '</b><br/>';
echo Core::_('Shop_Item.create_catalog') . ' — <b>' . (Core_Array::getRequest('InsertedGroupsCount', 0) + $Shop_Item_Import_Csv_Controller->getInsertedGroupsCount()) . '</b><br/>';
echo Core::_('Shop_Item.update_catalog') . ' — <b>' . (Core_Array::getRequest('UpdatedGroupsCount', 0) + $Shop_Item_Import_Csv_Controller->getUpdatedGroupsCount()) . '</b><br/>';
}
?>
Только, вот, не работает лимит времени и лимит файлов правильно, т.е. отправка импорта порциями (как при импорте из админки). Например, 20 секунд работает скрипт и все, останавливается. А как сделать, чтобы через некоторое время оставшаяся информация загружалась?