Ergo Posted July 23, 2014 Report Share Posted July 23, 2014 В симпле прекрасно реализована загрузка прайса в CSV через админку. Подскажите пожалуйста, как автоматизировать ежедневный процесс обновления прайса, если автообновляемый CSV-файл доступен по некому урл-адресу типа http://domain.ru/price.cvs Т.е. нужен скрипт который заберет файл и зальёт его в симплу через страницу "импорт товаров" автоматически. а сам это скрипт вызывался бы по cron Quote Link to post Share on other sites
Ergo Posted August 24, 2014 Author Report Share Posted August 24, 2014 покопался сам. прайс загружается через файлик /simpla/ajax/import.phpв принципе если в нем исправить значение количества товаров за один проход private $products_count = 10;то можно просто его и вызывать кроном но поскольку мне нужно было еще проверять дату и забирать прайс я набросал небольшой скриптик на php, который решает нужную мне задачу. если кому нужно - пожалуста пользуйтесь <?php /* Модуль автоматического обновления прайса. проверяет нового прайса по ftp и при обнаружении оного - закачивает его в магазин файл зовется import_auto.php и живет в директории /simpla/ajax/ вызывается через крон (каждый час) в урле должна быть авторизация 0 * * * * wget -O /dev/null http://admin:admin@site_doamin1.ru/simpla/ajax/import_auto.php */ // установка времени жизни скрипта set_time_limit(180); // скачка файла по ftp $ftp_server = "8.8.8.8"; //адрес $ftp_dir = "/"; $ftp_user_name = "login"; $ftp_user_pass = "pass"; $ftp_file_price = "price.csv"; $root_path = $_SERVER['DOCUMENT_ROOT']; $loc_dir = $root_path."/simpla/files/import"; $loc_file_price = "import.csv"; // установка соединения $conn_id = ftp_connect($ftp_server, 21); $login_result = ftp_login($conn_id, $ftp_user_name, $ftp_user_pass); ftp_pasv($conn_id, true); // проверям наличие файла прайса и берем его дату $ftp_file_time = ftp_mdtm($conn_id, "$ftp_dir/$ftp_file_price"); if( $ftp_file_time < 0 ) { print("ERROR: File $file_name Not Found in FTP"); exit; } // если прайс еще старый - не суетимся if( $ftp_file_time <= filemtime("$loc_dir/$ftp_file_price") ) { print("INFO: price old\n"); exit; } // забираем прайс if (!ftp_get($conn_id, "$loc_dir/$ftp_file_price", "$ftp_dir/$ftp_file_price", FTP_BINARY)) { print("ERROR: File $ftp_file_price NOT copy from from FTP"); } // Конвертируем файл из WIN1251 в UFT8 $source = "$loc_dir/$ftp_file_price"; $dest = "$loc_dir/$ftp_file_price".".utf8"; if(!$src = fopen($source, "r")) return false; if(!$dst = fopen($dest, "w")) return false; while (($line = fgets($src, 4096)) !== false) { $line = @iconv('windows-1251', 'UTF-8', $line); fwrite($dst, $line); } fclose($src); fclose($dst); if (!rename($dest, "$loc_dir/$loc_file_price")) { print("ERROR: File $loc_file_price NOT convert/rename"); } // загрузка прайса в базу $chain_end = false; $chain_from = 0; while (!$chain_end and $i<1000) { $_GET['from'] = $chain_from; ob_start(); require_once('import.php'); ob_end_clean(); print("$chain_from from $chain_size ($chain_end) - ok\n"); $chain = $import_ajax->import(); $chain_from = $chain->{'from'}; $chain_size = $chain->{'totalsize'}; $chain_end = $chain->{'end'}; $i++; ob_flush(); } print("OK: Price update! (size: $chain_size)"); ?> ok Quote Link to post Share on other sites
Kors Posted August 24, 2014 Report Share Posted August 24, 2014 Пробовали ли в случае, когда файл импорта имеет большой размер? Скорее всего, импорт будет обрываться, не доходя до конца... Quote Link to post Share on other sites
koteyka Posted September 12, 2014 Report Share Posted September 12, 2014 Кто-то пробовал? Как работает? Quote Link to post Share on other sites
jonny008 Posted September 22, 2014 Report Share Posted September 22, 2014 Кто-то пробовал? Как работает?Работает отлично! Протестировал на 2.3.3 Quote Link to post Share on other sites
Noxter Posted September 22, 2014 Report Share Posted September 22, 2014 Работает отлично! Протестировал на 2.3.3Уважаемый к вашему вниманию уже доступна новая версия 2.3.6. Рекомендую обновиться Quote Link to post Share on other sites
koteyka Posted September 22, 2014 Report Share Posted September 22, 2014 Работает отлично! Протестировал на 2.3.3Я имею в виду с большим количеством товаров. Если товаров более 5000, не вылетает? Quote Link to post Share on other sites
jonny008 Posted September 22, 2014 Report Share Posted September 22, 2014 Уважаемый к вашему вниманию уже доступна новая версия 2.3.6.Рекомендую обновиться В 2.3.3 внесено очень много изменений. Обновиться до 2,3,6 трудоемкий процесс. Меня и так всё устраивает Quote Link to post Share on other sites
jonny008 Posted September 22, 2014 Report Share Posted September 22, 2014 Я имею в виду с большим количеством товаров. Если товаров более 5000, не вылетает? Если быть точным: 19820 товаров. Quote Link to post Share on other sites
Kors Posted September 22, 2014 Report Share Posted September 22, 2014 Импорт в принципе обрабатывает НЕ все товары, поскольку в скрипте стоит ограничение. По тому, как сейчас в теме сказано, имеем: 1.while (!$chain_end and $i<1000) {2. private $products_count = 10; То есть обрабатывается максимум 10 тыс товаров...То есть хотя оно и не вылетает, но и не работает до конца. А вывод результатаprint("OK: Price update! (size: $chain_size)");вовсе НЕ показывает число реально обработанных строк: Полностью оценивать надо в конкретных условиях - на конкретном сервере, с конкретным файлом импорта. Много зависит и от характеристик сервера, и от объема файла (особенно от числа свойств)... Quote Link to post Share on other sites
Maksclub Posted June 10, 2015 Report Share Posted June 10, 2015 Работает отлично! Протестировал на 2.3.3 Извините с wget плоховато у меня, подскажите как вызвать этот скрипт? Что значит в урле должна быть регистрация? В панели на хостинге нужно какой-то другой урл указывать, с паролем/логином? Как это сделать? Quote Link to post Share on other sites
Maksclub Posted June 10, 2015 Report Share Posted June 10, 2015 Я имею в виду с большим количеством товаров. Если товаров более 5000, не вылетает?Извините с wget плоховато у меня, подскажите как вызвать этот скрипт?Что значит в урле должна быть регистрация? В панели на хостинге нужнокакой-то другой урл указывать, с паролем/логином? Как это сделать? Quote Link to post Share on other sites
Maksclub Posted June 12, 2015 Report Share Posted June 12, 2015 Подскажите — как после импорта переименовать price.csv на price_DD_MM_YY.csv, в общем чтобы он переименовывался на название с датой импорта. Quote Link to post Share on other sites
Kors Posted June 12, 2015 Report Share Posted June 12, 2015 В стандартной Simpla такое никак не возможно, так как там после импорта НЕТ файла price.csv, и такого файла вообще не бывает.Если у Вас что-то сделано по своему, то в зависимости от Ваших переделок... Если хотите, чтобы при импорте файл записывался на сервер под другим именем, то это имя задается в simpla/ImportAdmin.phpsimpla/ajax/import.php Заодно заметим, что имеется некоторая нерациональность от автора Simpla - одно значение надо задавать (изменять) в 2-хместах. Quote Link to post Share on other sites
Maksclub Posted June 12, 2015 Report Share Posted June 12, 2015 (edited) В стандартной Simpla такое никак не возможно, так как там после импорта НЕТ файла price.csv, и такого файла вообще не бывает.Если у Вас что-то сделано по своему, то в зависимости от Ваших переделок... Если хотите, чтобы при импорте файл записывался на сервер под другим именем, то это имя задается в simpla/ImportAdmin.phpsimpla/ajax/import.php Заодно заметим, что имеется некоторая нерациональность от автора Simpla - одно значение надо задавать (изменять) в 2-хместах. Kors, тут http://forum.simplacms.ru/topic/7911-автоматическая-загрузка-прайслиста/?p=61180 указано решение, я все сделал, все работает, просто мне нужно в конце работы скрипта переименовать этот файл, иначе в ручную удалять нужно, т.к. парсер не сможет закачать новый файл... все это доделки для автоматизации сделал // если прайс еще старый - не суетимся if( $ftp_file_time <= filemtime("$loc_dir/$ftp_file_price") ) { print("INFO: price old\n"); exit; } // забираем прайс if (!ftp_get($conn_id, "$loc_dir/$ftp_file_price", "$ftp_dir/$ftp_file_price", FTP_BINARY)) { print("ERROR: File $ftp_file_price NOT copy from from FTP"); } // забираем прайс тут мне нужно прайс переименовать Edited June 12, 2015 by Maksclub Quote Link to post Share on other sites
Andrey Terkin Posted June 12, 2015 Report Share Posted June 12, 2015 http://php.net/manual/ru/function.rename.php Quote Link to post Share on other sites
Maksclub Posted June 12, 2015 Report Share Posted June 12, 2015 (edited) http://php.net/manual/ru/function.rename.phpда я ее (rename) как только не вертел, не получается, даже на локале Edited June 12, 2015 by Maksclub Quote Link to post Share on other sites
Kors Posted June 12, 2015 Report Share Posted June 12, 2015 Кроме переименования, надо еще меры принимать, чтобы УЗНАТЬ нужный файл при следующем вызове.А Вы хотите просто какой-то код куда-то скопировать.Если готовы оплачивать, обращайтесь... Quote Link to post Share on other sites
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.