Ergo Опубликовано 23 июля, 2014 Жалоба Поделиться Опубликовано 23 июля, 2014 В симпле прекрасно реализована загрузка прайса в CSV через админку. Подскажите пожалуйста, как автоматизировать ежедневный процесс обновления прайса, если автообновляемый CSV-файл доступен по некому урл-адресу типа http://domain.ru/price.cvs Т.е. нужен скрипт который заберет файл и зальёт его в симплу через страницу "импорт товаров" автоматически. а сам это скрипт вызывался бы по cron Цитата Ссылка на сообщение Поделиться на другие сайты
Ergo Опубликовано 24 августа, 2014 Автор Жалоба Поделиться Опубликовано 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 Цитата Ссылка на сообщение Поделиться на другие сайты
Kors Опубликовано 24 августа, 2014 Жалоба Поделиться Опубликовано 24 августа, 2014 Пробовали ли в случае, когда файл импорта имеет большой размер? Скорее всего, импорт будет обрываться, не доходя до конца... Цитата Ссылка на сообщение Поделиться на другие сайты
koteyka Опубликовано 12 сентября, 2014 Жалоба Поделиться Опубликовано 12 сентября, 2014 Кто-то пробовал? Как работает? Цитата Ссылка на сообщение Поделиться на другие сайты
jonny008 Опубликовано 22 сентября, 2014 Жалоба Поделиться Опубликовано 22 сентября, 2014 Кто-то пробовал? Как работает?Работает отлично! Протестировал на 2.3.3 Цитата Ссылка на сообщение Поделиться на другие сайты
Noxter Опубликовано 22 сентября, 2014 Жалоба Поделиться Опубликовано 22 сентября, 2014 Работает отлично! Протестировал на 2.3.3Уважаемый к вашему вниманию уже доступна новая версия 2.3.6. Рекомендую обновиться Цитата Ссылка на сообщение Поделиться на другие сайты
koteyka Опубликовано 22 сентября, 2014 Жалоба Поделиться Опубликовано 22 сентября, 2014 Работает отлично! Протестировал на 2.3.3Я имею в виду с большим количеством товаров. Если товаров более 5000, не вылетает? Цитата Ссылка на сообщение Поделиться на другие сайты
jonny008 Опубликовано 22 сентября, 2014 Жалоба Поделиться Опубликовано 22 сентября, 2014 Уважаемый к вашему вниманию уже доступна новая версия 2.3.6.Рекомендую обновиться В 2.3.3 внесено очень много изменений. Обновиться до 2,3,6 трудоемкий процесс. Меня и так всё устраивает Цитата Ссылка на сообщение Поделиться на другие сайты
jonny008 Опубликовано 22 сентября, 2014 Жалоба Поделиться Опубликовано 22 сентября, 2014 Я имею в виду с большим количеством товаров. Если товаров более 5000, не вылетает? Если быть точным: 19820 товаров. Цитата Ссылка на сообщение Поделиться на другие сайты
Kors Опубликовано 22 сентября, 2014 Жалоба Поделиться Опубликовано 22 сентября, 2014 Импорт в принципе обрабатывает НЕ все товары, поскольку в скрипте стоит ограничение. По тому, как сейчас в теме сказано, имеем: 1.while (!$chain_end and $i<1000) {2. private $products_count = 10; То есть обрабатывается максимум 10 тыс товаров...То есть хотя оно и не вылетает, но и не работает до конца. А вывод результатаprint("OK: Price update! (size: $chain_size)");вовсе НЕ показывает число реально обработанных строк: Полностью оценивать надо в конкретных условиях - на конкретном сервере, с конкретным файлом импорта. Много зависит и от характеристик сервера, и от объема файла (особенно от числа свойств)... Цитата Ссылка на сообщение Поделиться на другие сайты
Maksclub Опубликовано 10 июня, 2015 Жалоба Поделиться Опубликовано 10 июня, 2015 Работает отлично! Протестировал на 2.3.3 Извините с wget плоховато у меня, подскажите как вызвать этот скрипт? Что значит в урле должна быть регистрация? В панели на хостинге нужно какой-то другой урл указывать, с паролем/логином? Как это сделать? Цитата Ссылка на сообщение Поделиться на другие сайты
Maksclub Опубликовано 10 июня, 2015 Жалоба Поделиться Опубликовано 10 июня, 2015 Я имею в виду с большим количеством товаров. Если товаров более 5000, не вылетает?Извините с wget плоховато у меня, подскажите как вызвать этот скрипт?Что значит в урле должна быть регистрация? В панели на хостинге нужнокакой-то другой урл указывать, с паролем/логином? Как это сделать? Цитата Ссылка на сообщение Поделиться на другие сайты
Maksclub Опубликовано 12 июня, 2015 Жалоба Поделиться Опубликовано 12 июня, 2015 Подскажите — как после импорта переименовать price.csv на price_DD_MM_YY.csv, в общем чтобы он переименовывался на название с датой импорта. Цитата Ссылка на сообщение Поделиться на другие сайты
Kors Опубликовано 12 июня, 2015 Жалоба Поделиться Опубликовано 12 июня, 2015 В стандартной Simpla такое никак не возможно, так как там после импорта НЕТ файла price.csv, и такого файла вообще не бывает.Если у Вас что-то сделано по своему, то в зависимости от Ваших переделок... Если хотите, чтобы при импорте файл записывался на сервер под другим именем, то это имя задается в simpla/ImportAdmin.phpsimpla/ajax/import.php Заодно заметим, что имеется некоторая нерациональность от автора Simpla - одно значение надо задавать (изменять) в 2-хместах. Цитата Ссылка на сообщение Поделиться на другие сайты
Maksclub Опубликовано 12 июня, 2015 Жалоба Поделиться Опубликовано 12 июня, 2015 (изменено) В стандартной 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"); } // забираем прайс тут мне нужно прайс переименовать Изменено 12 июня, 2015 пользователем Maksclub Цитата Ссылка на сообщение Поделиться на другие сайты
Andrey Terkin Опубликовано 12 июня, 2015 Жалоба Поделиться Опубликовано 12 июня, 2015 http://php.net/manual/ru/function.rename.php Цитата Ссылка на сообщение Поделиться на другие сайты
Maksclub Опубликовано 12 июня, 2015 Жалоба Поделиться Опубликовано 12 июня, 2015 (изменено) http://php.net/manual/ru/function.rename.phpда я ее (rename) как только не вертел, не получается, даже на локале Изменено 12 июня, 2015 пользователем Maksclub Цитата Ссылка на сообщение Поделиться на другие сайты
Kors Опубликовано 12 июня, 2015 Жалоба Поделиться Опубликовано 12 июня, 2015 Кроме переименования, надо еще меры принимать, чтобы УЗНАТЬ нужный файл при следующем вызове.А Вы хотите просто какой-то код куда-то скопировать.Если готовы оплачивать, обращайтесь... Цитата Ссылка на сообщение Поделиться на другие сайты
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.