Архиваторный плагин к Total Commander *.EFD




Принцип обмена данными из 1С с сайтом (на MySQL) и выдачи (публикации) этих данных по запросу.
PHP-Скрипт автоматической загрузки данных из файла данных в формате CSV в базу данных сайта работающего на WordPress.

В продолжение моей темы: 1С:Альфа-Авто Автосалон Автосервис: обмен с сайтом.
С помощью данного скрипта можно загружать в автоматическом режиме, по расписанию, данные сервисных книжек (ремонтов авто) из 1С:Альфа-Авто Автосалон Автосервис.
Также можно загружать данные в ручном режиме: для этого делается скрытая страница, где размещается специальная кнопка.
Комментарии размещенные внутри скрипта разъяснят логику и порядок действия.
Комментарии с "/////    echo" использовались для отладки.
Дополнительно создана таблица для журналирования результатов загрузки данных.
Скрипт включает в себя защиту от SQL инъекций (думаю безопасность соблюдена в полной мере).
В кратце:
1. Пишется скрипт, который запускает этот.
2. Создается регламентное задание в WordPress, по которому запускается скрипт из п.1. 
3. Этот скрипт осуществляет проверку на существование файла обмена в папке.
4. Если данные не новые, загрузка не производится.
5. Если данные новые, очищается таблица сервисных книжек.
6. Загружаются новые данные.

Собственно сам скрипт:

<?php // Полная загрузка сервисных книжек, создан 2024-01-05 12:44:55

global $wpdb2;
global $failure;
global $file_hist;

/////  echo '<H2><b>Старт загрузки</b></H2><br>';

$failure=FALSE;
//подключаемся к базе
$wpdb2 = include_once 'connection.php'; ; // подключаемся к MySQL
// если не удалось подключиться, и нужно оборвать PHP с сообщением об этой ошибке
if (!empty($wpdb2->error))
{
/////   echo '<H2><b>Ошибка подключения к БД, завершение.</b></H2><br>';
$failure=TRUE;
wp_die( $wpdb2->error );
}

$m_size_file=0;
$m_mtime_file=0;
$m_comment='';
/////проверка существования файлов выгрузки из 1С
////файл выгрузки сервисных книжек
$file_hist = ABSPATH.'/_1c_alfa_exchange/AA_hist.csv';
if (!file_exists($file_hist))
{
/////   echo '<H2><b>Файл обмена с сервисными книжками не существует.</b></H2><br>';
$m_comment='Файл обмена с сервисными книжками не существует';
$failure=TRUE;
}

/////инициируем таблицу лога
/////если не существует файла то возврат и ничего не делаем
if ($failure){
///включает защиту от SQL инъекций и данные можно передавать как есть, например: $_GET['foo']
/////   echo '<H2><b>Попытка вставить запись в лог таблицу</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>$m_mtime_file,'last_size_upload'=>$m_size_file,'comment'=>$m_comment));
wp_die();
/////    echo '<H2><b>Возврат в начало.</b></H2><br>';
return $failure;
}
/////проверка лога загрузки, что бы не загружать тоже самое
$masiv_data_file=stat($file_hist);   ////передаем в массив свойство файла
$m_size_file=$masiv_data_file[7];    ////получаем размер файла
$m_mtime_file=$masiv_data_file[9];   ////получаем дату модификации файла
////создаем запрос на получение последней удачной загрузки
////выбираем по штампу времени создания (редактирования) файла загрузки AA_hist.csv, $m_mtime_file

/////   echo '<H2><b>Размер файла: '.$m_size_file.'</b></H2><br>';
/////   echo '<H2><b>Штамп времени файла: '.$m_mtime_file.'</b></H2><br>';
/////   echo '<H2><b>Формирование запроса на выборку из лога</b></H2><br>';
////препарируем запрос
$text_zaprosa=$wpdb2->prepare("SELECT * FROM `vin_logs` WHERE `last_mtime_upload` = %s", $m_mtime_file);
$results=$wpdb2->get_results($text_zaprosa);

if ($results)
{   foreach ( $results as $r)
{
////если штамп времени и размер файла совпадают, возврат
if (($r->last_mtime_upload==$m_mtime_file) && ($r->last_size_upload==$m_size_file))
{////echo '<H2><b>Возврат в начало, т.к. найдена запись в логе.</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>$m_mtime_file,'last_size_upload'=>$m_size_file,'comment'=>'Загрузка отменена, новых данных нет, т.к. найдена запись в логе.'));
wp_die();
return $failure;
}
}
}
////если данные новые, пишем в лог запись о начале загрузки
/////echo '<H2><b>Попытка вставить запись о начале загрузки в лог таблицу</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>0, 'last_size_upload'=>$m_size_file, 'comment'=>'Начало загрузки'));

////очищаем таблицу
$clear_tbl_zap=$wpdb2->prepare("TRUNCATE TABLE %s", 'vin_history');
$clear_tbl_zap_repl=str_replace("'","`",$clear_tbl_zap);
$results=$wpdb2->query($clear_tbl_zap_repl);
/////   echo '<H2><b>Очистка таблицы сервисных книжек</b></H2><br>';
if (empty($results))
{
/////   echo '<H2><b>Ошибка очистки таблицы книжек, завершение.</b></H2><br>';
//// если очистка не удалась, возврат
$failure=TRUE;
wp_die();
return $failure;
}

////загружаем данные
$table='vin_history';         // Имя таблицы для импорта
//$file_hist Имя CSV файла, откуда берется информация     // (путь от корня web-сервера)
$delim=';';          // Разделитель полей в CSV файле
$enclosed='"';      // Кавычки для содержимого полей
$escaped='\

36 Comments

  1. awa

    Структуру файлов в архиве efd плагин показал, однако распаковывает только файлы верхнего уровня, файлы из подкаталогов плагин не вытаскивает!

    Reply
  2. BorovikSV

    (1) ага. косяк. обновил 🙂

    Так бывает когда перед тем как выложить пытаешься что нибудь оптимизировать 🙂

    Reply
  3. awa

    (2) Спасибо, стало лучше! ))

    Однако , еще остались ошибки. При распаковке каталога не сохраняется структура каталогов, а все файлы из всех подкаталогов распаковываются в один каталог назначения. И еще, иногда возникает ошибка деления на ноль при распаковке каталога. При чем файл, на котором происходит такая ошибка, нормально распаковывается, если распаковывать его в одиночку. Если хочешь, могу выложить efd файл, на котором эта ошибка у меня возникает, весит он 22 Мб.

    Reply
  4. ValeriVP

    с CD-ROM файл не открывается

    Reply
  5. BorovikSV

    (3) проверь тот EFD на котором вылетала ошибка. Не должно теперь кричать. см. описание «Версия 0.9.5.2»

    Reply
  6. awa

    (5) Да, ошибка деления на ноль исчезла!

    Reply
  7. stail_en

    а если только файл cfu есть? возможно как нибудь

    Reply
  8. BorovikSV

    что с файлом CFU хочешь сделать?

    Reply
  9. Virsy

    для 8.0 не работает. Вроде как для установочных EFD — ошибка при открытии, а для апдейтов — показывает файлики нулевой длины.

    Reply
  10. myniko

    Мелкие замечания:

    1. Даты файлов в архиве отображаются без учета сдвига по GMT, то есть по гринвичу. Но при распаковке вроде всё ок.

    2. Если распаковывать файл и каталог, в нижней индикаторной строке показывает всегда 99%.

    Reply
  11. R_o_n_n_y

    Setup пишет что .efd поврежден, а этот плуг все выдернул, молодца!

    Reply
  12. v0id

    Вылетает при работе в total commander 7.50а 🙁

    Reply
  13. f333

    (12) а у меня работает

    Reply
  14. f333

    вот с 7.55 не хочет(

    Reply
  15. ixijixi

    на win7 в 7.04а работает, в 7.50а — нет. Можно как то поправить, ведь хорошая штука?

    Reply
  16. berja

    Вылетает однако на Win 7 64 bit., Total 7.50

    Автор будь добр поправь пожалуйста…

    Reply
  17. the1

    афтар забил. Жаль

    Reply
  18. tark9000

    Спасибо. Плагин очень помог. Нескромный вопрос к автору — откуда брали информацию о структуре efd и её распаковке?

    Reply
  19. a237

    Спасибо. Очень полезная дополнение.

    Reply
  20. Alexey26

    Отличный плагин! Рекомендую.

    Reply
  21. cbr900

    не работает в tc 8 x64

    Reply
  22. LoboVik

    Спасибо автору. Очень полезная штука. Рекомендую всем.

    Reply
  23. EugeneR1c

    Скачала, буду тестировать.

    Reply
  24. 911service

    в tc 8 не работает

    Reply
  25. EmpireSer

    А есть исходники к этому добру? Или пример (инструкция) как читать файл efd ?

    А то у меня существует задачка, где я хочу всё хранить в жатом виде, а по требованию пользователя (и только то, что он выбрал) (или автоматически) выгружать куда надо. И хочется это реализовать в виде универсальной внешней компоненты (кроссплатформено).

    Reply
  26. nurislam

    Спасибо большое.Очень пригодился.

    Reply
  27. sashocq

    Есть какая-нибудь утилита для этого (DLL-ка или консольное приложение), чтобы можно было это дело автоматизировать.

    Reply
  28. sashocq

    Или описание формата, хотя бы.

    Reply
  29. BorovikSV

    (29) sashocq,

    можно «притвориться» тотал коммандером, и использовать в любых целях

    Reply
  30. brunet

    Почему то у меня на Windows 7 не работает

    Reply
  31. skyther

    Пожалуйста, пересоберите для x64!

    Reply
  32. Йожкин Кот

    Плагин перестал работать с Total Commander 8.51a (Access violation at address …). Просьба исправить ошибку, очень полезный плагин!

    Reply
  33. Brawler

    (33) Йожкин Кот, подтверждаю, плагин сдох

    Reply
  34. bvmtb

    (33) Йожкин Кот, всё так и есть, не работает (Access violation at address …)

    Reply
  35. BorovikSV

    В новом тотале- сменили API. Кто так и сидит на тотале 7-ке — у тех все работает. И таких пруд пруди. Под новый тотал нужно разрабатывать почти с нуля.

    Reply
  36. Eret1k

    Так как потребность в кастомном распаковщике не отпала, кто-то написал всою реализацию на Python-е, лежит тут: https://github.com/Infactum/onec_dtools

    На Linux и Macintosh работает.

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *