Перейти к содержанию
Официальный форум поддержки Simpla

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


Рекомендуемые сообщения

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

 

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

 

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

 

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

Ссылка на сообщение
Поделиться на другие сайты
  • 1 месяц спустя...

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

 

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

 

Ссылка на сообщение
Поделиться на другие сайты

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

Ссылка на сообщение
Поделиться на другие сайты
  • 3 недели спустя...
  • 2 недели спустя...

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

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

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

Ссылка на сообщение
Поделиться на другие сайты

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

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

Ссылка на сообщение
Поделиться на другие сайты

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

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

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

Ссылка на сообщение
Поделиться на другие сайты

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

 

Если быть точным: 19820 товаров. 

Ссылка на сообщение
Поделиться на другие сайты

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

 

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

 

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

2. private $products_count        = 10;

 

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

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

 

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

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

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

 

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

Ссылка на сообщение
Поделиться на другие сайты
  • 8 месяцев спустя...

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

 

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

Ссылка на сообщение
Поделиться на другие сайты

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

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

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

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

Ссылка на сообщение
Поделиться на другие сайты

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

Ссылка на сообщение
Поделиться на другие сайты

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

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

 

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

simpla/ImportAdmin.php

simpla/ajax/import.php

 

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

местах.

Ссылка на сообщение
Поделиться на другие сайты

В стандартной 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"); 
    }
  // забираем прайс 
     тут мне нужно прайс переименовать
Изменено пользователем Maksclub
Ссылка на сообщение
Поделиться на другие сайты

да я ее (rename)  как только не вертел, не получается, даже на локале

Изменено пользователем Maksclub
Ссылка на сообщение
Поделиться на другие сайты

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

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

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

Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
×
×
  • Создать...