Jump to content

Автоматическая загрузка прайслиста


Recommended Posts

В симпле прекрасно реализована загрузка прайса в CSV через админку.

 

Подскажите пожалуйста, как автоматизировать ежедневный процесс обновления прайса, если автообновляемый CSV-файл доступен по некому урл-адресу типа http://domain.ru/price.cvs

 

Т.е. нужен скрипт который заберет файл и зальёт его в симплу через страницу "импорт товаров" автоматически.

 

а сам это скрипт вызывался бы по cron

Link to post
Share on other sites
  • 1 month later...

покопался сам.

 

прайс загружается через файлик /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

 

Link to post
Share on other sites

Пробовали ли в случае, когда файл импорта имеет большой размер? Скорее всего, импорт будет обрываться, не доходя до конца...

Link to post
Share on other sites
  • 3 weeks later...
  • 2 weeks later...

Уважаемый к вашему вниманию уже доступна новая версия 2.3.6.

Рекомендую обновиться :)

В 2.3.3 внесено очень много изменений. Обновиться до 2,3,6 трудоемкий процесс. Меня и так всё устраивает ;)  

Link to post
Share on other sites

Импорт в принципе обрабатывает НЕ все товары, поскольку в скрипте  стоит ограничение.

 

По тому, как сейчас в теме сказано,  имеем:

 

1.while (!$chain_end and $i<1000) {

2. private $products_count        = 10;

 

То есть обрабатывается максимум 10 тыс товаров...

То есть хотя оно и не вылетает, но и не работает до конца.

 

А вывод результата

print("OK: Price update! (size: $chain_size)");

вовсе  НЕ показывает число реально обработанных строк:

 

Полностью оценивать надо в конкретных условиях - на конкретном сервере, с конкретным файлом импорта. Много зависит и от характеристик сервера, и от объема файла (особенно от числа свойств)...

Link to post
Share on other sites
  • 8 months later...

Работает отлично! Протестировал на 2.3.3 

 

Извините с wget плоховато у меня, подскажите как вызвать этот скрипт? Что значит в урле должна быть регистрация? В панели на хостинге нужно какой-то другой урл указывать, с паролем/логином? Как это сделать?

Link to post
Share on other sites

Я имею в виду с большим количеством товаров. Если товаров более 5000, не вылетает?

Извините с wget плоховато у меня, подскажите как вызвать этот скрипт?

Что значит в урле должна быть регистрация? В панели на хостинге нужно

какой-то другой урл указывать, с паролем/логином? Как это сделать?

Link to post
Share on other sites

Подскажите — как после импорта переименовать price.csv на price_DD_MM_YY.csv, в общем чтобы он переименовывался на название с датой импорта.

Link to post
Share on other sites

В стандартной Simpla такое никак не возможно, так как там после импорта НЕТ файла price.csv, и такого файла  вообще не бывает.

Если у Вас что-то сделано по своему, то в зависимости от Ваших переделок...

 

Если хотите, чтобы при импорте файл записывался на сервер под другим именем, то это имя задается в 

simpla/ImportAdmin.php

simpla/ajax/import.php

 

Заодно заметим, что имеется  некоторая нерациональность от автора Simpla - одно значение надо задавать (изменять) в 2-х

местах.

Link to post
Share on other sites

В стандартной Simpla такое никак не возможно, так как там после импорта НЕТ файла price.csv, и такого файла  вообще не бывает.

Если у Вас что-то сделано по своему, то в зависимости от Ваших переделок...

 

Если хотите, чтобы при импорте файл записывался на сервер под другим именем, то это имя задается в 

simpla/ImportAdmin.php

simpla/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 by Maksclub
Link to post
Share on other sites

Кроме переименования, надо еще меры принимать, чтобы УЗНАТЬ нужный файл при следующем вызове.

А Вы хотите просто какой-то код куда-то скопировать.

Если готовы оплачивать, обращайтесь...

Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...