Автоматический импорт csv

#
Автоматический импорт csv
Добрый день.
Подскажите можно ли настроить в cron автоматический импорт из csv файлов?
#
Re: Автоматический импорт csv
Не видим препятствий, но нужно писать файл для cron , который используя контроллер импорта CSV (Shop_Item_Import_Csv_Controller) будет выполнять импорт.  Пример такого файла приведен ниже, но обращаем внимание, что это именно пример, на рабочем сайте он не отлаживался.


<?php

/**
* Пример вызова:
* /usr/bin/php /var/www/site.ru/httpdocs/cron/import.php
* Пример вызова с передачей php.ini
* /usr/bin/php --php-ini /etc/php.ini /var/www/site.ru/httpdocs/cron/import.php
* Реальный путь на сервере к корневой директории сайта уточните в службе поддержки хостинга.
*
* @package HostCMS 6\cron
* @version 6.x
* @author Hostmake LLC
* @copyright © 2005-2017 ООО "Хостмэйк" (Hostmake LLC), http://www.hostcms.ru
*/

@set_time_limit(9000);
ini_set("memory_limit", "512M");

define('CURRENT_SITE', 2);  // Указать id сайта


require_once('bootstrap.php');

$oSite = Core_Entity::factory('Site', CURRENT_SITE);
Core::initConstants($oSite);


$iShop_id = 5;
$shop_groups_parent_id = 0;
$sCsvFilename = 'test.csv'; // Путь к CSV файлу на сервере
$encoding = 'UTF-8'; // Windows-1251 или UTF-8
$time = 99999999;
$step = 99999999;
$separator = ';';
$limiter = '"';
$imagesPath ='';
$importAction = 0;   //Действие для существующих товаров
$searchIndexation = 1;
$deleteImage = 0;

$aConformity =array(
    'shop_groups_value',
    'shop_groups_cml_id',
    'shop_groups_parent_cml_id',
    'shop_groups_seo_title',
    'shop_groups_seo_description',
    'shop_groups_seo_keywords',
    'shop_groups_description',
    'shop_groups_path',
    'shop_groups_order',
    'shop_items_cml_id',
    'shop_items_catalog_item_id',
    'shop_items_catalog_marking',
    'shop_item_parent_marking',
    'shop_items_catalog_name',
    'shop_items_catalog_description',
    'shop_items_catalog_text',
    'shop_items_catalog_weight',
    'shop_items_catalog_length',
    'shop_items_catalog_width',
    'shop_items_catalog_height',
    'shop_items_catalog_type',
    'shop_items_catalog_label',
    'shop_items_catalog_price',
    'shop_items_catalog_is_active',
    'shop_items_catalog_order',
    'shop_items_catalog_path',
    'shop_tax_id',
    'shop_currency_id',
    'shop_sallers_name',
    'shop_producers_list_value',
    'shop_mesures_value',
    'shop_items_catalog_seo_title',
    'shop_items_catalog_seo_description',
    'shop_items_catalog_seo_keywords',
    'shop_items_catalog_indexation',
    'shop_items_catalog_yandex_market_allow',
    'shop_items_catalog_yandex_market_bid',
    'shop_items_catalog_yandex_market_cid',
    'shop_items_catalog_date_time',
    'shop_items_catalog_putoff_date',
    'shop_items_catalog_putend_date',
    'shop_items_catalog_image',
    'shop_items_catalog_small_image',
    'additional_group',
    'site_users_id',
    'shop_special_prices_from',
    'shop_special_prices_to',
    'shop_special_prices_price',
    'shop_special_prices_percent',
);

/*prop-79',
    'propsmall-79',
    'prop-80',
    'prop-84',
    'prop-81',
    'prop-82',
    'prop-83',
    'prop-85',
    'prop_group-78',
    'propsmall-78',
    'warehouse-3',
    'price-4',*/

$Shop_Item_Import_Csv_Controller = new Shop_Item_Import_Csv_Controller($iShop_id, $shop_groups_parent_id);

$Shop_Item_Import_Csv_Controller
            ->file($sCsvFilename)
            ->encoding($encoding)
            ->csv_fields($aConformity)
            ->time($time)
            ->step($step)
            ->separator($separator)
            ->limiter($limiter)
            ->imagesPath($imagesPath )
            ->importAction($importAction)
            ->searchIndexation($searchIndexation)
            ->deleteImage($deleteImage);

$Shop_Item_Import_Csv_Controller->import();

echo 'Товаров загружено' . ' &#151; <b>' . $Shop_Item_Import_Csv_Controller->getInsertedItemsCount() . '</b><br/>';
echo 'Товаров обновлено' . ' &#151; <b>' . $Shop_Item_Import_Csv_Controller->getUpdatedItemsCount() . '</b><br/>';
echo 'Групп загружено' . ' &#151; <b>' . $Shop_Item_Import_Csv_Controller->getInsertedGroupsCount() . '</b><br/>';
echo 'Групп обновлено' . ' &#151; <b>' . $Shop_Item_Import_Csv_Controller->getUpdatedGroupsCount() . '</b><br/>';
         
«Не выходи из комнаты, не совершай ошибку…»
#
Re: Автоматический импорт csv
ну есть от чего отталкиваться.. уже хорошо.. спасибо!
#
Re: Автоматический импорт csv
llirik,
Не подскажете как быть в случае если мы хотим обновить количество товаров на складах?
Склады могут быть два и более. Спасибо.
E-mail: info@syrbek.ru / телега: @syrbek /skype: activexm / syrbek.ru / Поддержка сайтов / г. Москва [HTML, CSS (Bootstrap), JS(JQuery, ExtJS), PHP, MySQL, MSSql, Posgres, Git, SVN, Redmine]
#
Re: Автоматический импорт csv
Обратите внимание на закомментированный кусок кода :

/*prop-79',
    'propsmall-79',
    'prop-80',
    'prop-84',
    'prop-81',
    'prop-82',
    'prop-83',
    'prop-85',
    'prop_group-78',
    'propsmall-78',
    'warehouse-3',
    'price-4',*/


склад указывается как 'warehouse-id_склада'
«Не выходи из комнаты, не совершай ошибку…»
#
Re: Автоматический импорт csv
Что то неправильно делаю... подскажите по полям
Артикул, Название группы, Название товара,Склад id=7, Производитель, Цена


Особенно непонятно  название производителя как обозначить
Пробовал названиями полей в базе.. но что то не так..
$aConformity =array(
    'marking',  
   'shop_groups_value',  
   'name',
   'warehouse-7',
   'shop_producers_list_value',
   'price',
);
#
Re: Автоматический импорт csv
Если текущая версия системы, то попробуйте так:
'item_marking', 'group_name', 'item_name',  'warehouse-7', 'producer_name', 'item_price'

Список сущностей вы можете посмотреть в файле \admin\shop\item\import\index.php
«Не выходи из комнаты, не совершай ошибку…»
#
Re: Автоматический импорт csv
Есть вот такой рабочий вариант автообмена:
<?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') . ' &#151; <b>' . (Core_Array::getRequest('InsertedItemsCount', 0) + $Shop_Item_Import_Csv_Controller->getInsertedItemsCount()) . '</b><br/>';
   echo Core::_('Shop_Item.count_update_item') . ' &#151; <b>' . (Core_Array::getRequest('UpdatedItemsCount', 0) + $Shop_Item_Import_Csv_Controller->getUpdatedItemsCount()) . '</b><br/>';
   echo Core::_('Shop_Item.create_catalog') . ' &#151; <b>' . (Core_Array::getRequest('InsertedGroupsCount', 0) + $Shop_Item_Import_Csv_Controller->getInsertedGroupsCount()) . '</b><br/>';
   echo Core::_('Shop_Item.update_catalog') . ' &#151; <b>' . (Core_Array::getRequest('UpdatedGroupsCount', 0) + $Shop_Item_Import_Csv_Controller->getUpdatedGroupsCount()) . '</b><br/>';
   
}

?>


Только, вот, не работает лимит времени и лимит файлов правильно, т.е. отправка импорта порциями (как при импорте из админки). Например, 20 секунд работает скрипт и все, останавливается. А как сделать, чтобы через некоторое время оставшаяся информация загружалась?
#
Re: Автоматический импорт csv
поддерживаю
Модератор
#
Re: Автоматический импорт csv
Автор SlavaRom добавил переход по шагам, редирект сделан через
@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}");

Авторизация