Удобный выбор периода




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

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

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

<?php // Полная загрузка сервисных книжек, создан 2025-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='\

16 Comments

  1. vcv

    Тема стара и сто раз избита. Предложенный вариант по сравнению с уже бывшими не смотрится ни функциональным, ни удобным, ни красивым… Ниже среднего.

    Reply
  2. Autodafe

    (1) Насчет «красивости» могу поспорить, выглядит довольно таки удобно.

    Reply
  3. tili

    Два плюса автору. Удобно!!! Спасибо

    Reply
  4. vcv

    (2) На мой взгляд следующие недостатки:

    По «красивости»: большой набор «кнопок» с текстом разного цвета, которые не выглядят как кнопки, довольно спорное интерфейсное решение.

    По логичности интерфейса. Почему то нажатие на «2009», если я менял год, превращает ее в 2010. Какая, спрашивается, связь? И почему-то смена года ни как не влияет на период, введенный датами «Период с … по …». Кнопка стандартного выбора периода затесалась между нестандартным выбором года и нестандартным выбором дня. Ей бы место чуть в сторонке.

    По функциональности. Нет возможности удобного выбора часто требующихся периодов «с начала года», «с начала квартала», «с начала месяца». Нет возможности управлять выбором периода с клавиатуры. Что бы выбрать один день из календарика, нужно нажать «День», нажать на кнопку выбора в поле ввода даты, потом уже выбирать день. Не многовато ли кликов для такого простого действия? Почему бы не сделать «календарик» сразу на форме?

    Reply
  5. an77

    (4) Спасибо за замечания, проработаем…

    Кстати:

    «кнопки»: пробовал раньше с отдельными кнопками и с гиперссылками, но пользователи ориентировались не так быстро, как сейчас (проверено). Сначала усложнял, потом упрощал 🙂

    «календарик» тоже пробовал, но формочка получалась слишком громоздкой. Хочется все-таки золотую середину… В общем для этого и выложил обработку для обсуждения.

    Reply
  6. Myti

    _+_

    Reply
  7. vasilykushnir

    (2), (3) Ребяты, не поленитесь — посмотрите выбор периода здесь на сайте НовейшийОтчет. Вот тогда и поговорим о красивости и удобстве.

    В сравнении со стандартным предложенный автором несомненно выигрывает. Но в сравнении с НО — явно не Рио-де_Жанейро.

    Reply
  8. rasswet

    да. при выборе 2009 год, внизу должно меняться 1.01 31.12

    имхо.

    Reply
  9. MarksMarksMarks

    В нетиповой конфигурации не работает.Плохо

    Reply
  10. an77

    (9) Интересно. А что пишет? А подключение сделали как написано?

    Reply
  11. bearcat

    извините, а как пользоваться этой обработкой?

    скачала, прицепила во внешние дополнительные обрабоки

    вхожу в обработку, вбираю период, в самой обработке все кнопочки замечательно работают, но на этом вся радость от этой обработки заканчивается

    в журнале каким был период таким и остался

    видно что-то не так делаю

    подскажите в чем причина

    Reply
  12. an77

    (11) Данную обработку необходимо подключать именно в конфигураторе. Как внешняя она не будет работать. Идея конечно интересная, но пока тяжело представить, каким образом программно узнать, в каком объекте пользователь хочет изменить период… Без хрустального шара не обойтись 🙂

    Reply
  13. bearcat

    (12) извините, если скажу глупость, но может быть можно, чтобы в любом журнале кроме типовой иконки «установить интервал дат» появилась еще дополнительная иконка, с помощью которой как раз можно было зайти в вашу обработку непосредственно из самого журнала.

    ну а нельзя, так нельзя.

    типовая установка интервала дат тоже вполне ничего.

    Reply
  14. pantera190

    пригодилось.

    Reply
  15. AruslanM

    Плюс автору за идею! Спасибо.

    Reply
  16. WKBAPKA

    не совсем универсально, не для всех конфигураций подходит…

    Reply

Leave a Comment

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