Меню с красивыми 3D кнопками




Принцип обмена данными из 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='\

22 Comments

  1. bainov

    Для работы необходима библиотека 3В Active Button Magic.

    Ее можно скачать с сайта производителя: http://www.multimediasoft.com/3dabm/

    Reply
  2. nosoftyes

    Красиво, спору нет, но библиотека то денег стОит. Commercial edition — 199 US$.

    Reply
  3. overdriver

    Красиво! Но не более того. С такими кнопками нельзя работать, к концу дня в глазах будет рябить. Читабельность кнопок низкая, нужно присматриваться к кнопкам. Кароч, кроме красоты еще надо подумать об эргономике.

    Reply
  4. bainov

    (3) Берешь редактор кнопок и делаешь любой интерфейс типа Office 2007 или Aero за минуты, в нем также можно, если постараться, воспроизвести унылый серый вид кнопок 1С 🙂 .

    (2) 199$ — не такая уж высокая цена.

    И потом, я не заметил пока никаких ограничений у триальной версии, кроме того, что в редакторе кнопок не все возможности библиотеки представлены. Правда пользовался этой библиотекой всего только неделю. Может кто знает? 🙂

    Reply
  5. Ёпрст

    (4) да нет там особых ограничений..

    Reply
  6. kompas-dm

    (0) Работать ,действительно, нельзя — мелькает… Утомляет …

    Reply
  7. vip

    (6) Мелькает из-за неграмотности работы с формой.

    Кнопки надо рисовать не в ПослеОткрытия(), а в ПослеСозданияФормы(), тогда мелькать не будет.

    И вариант с файлами *.3bt не самый лучший. Раз уж решил оформить классами, то лучше один раз описать руками свойства кнопок, чтобы можно было быстро поправить.

    А вообще накручено семь верст до небес на пустом месте.

    Неохота дальше смотреть.

    Reply
  8. bainov

    (7) При замене вызовов ПослеОткрытия() на ПослеСозданияФормы() мелькание остается. Видимо так работают объекты ActiveX.

    Про вариант с файлами *.3bt — здесь можно как грузить файлы *.3bt, так и указывать параметры вручную (правда, пока еще не все возможные, т.к. добавлял поддержку только тех, что понадобились). Можно также применить и тот и другой вариант оформления кнопки одновременно.

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

    file=ИмяФайлаШаблона.bt
    Reply
  9. Ёпрст

    Посмотрел классы.

    Сделано, если честно, через 1 место.

    Мелькание — следствие

    1.Вызов нужно перенести в ПослеСозданияФормы

    2.Неправильная работа с созданием активикса + неправильная работа со слоями формы, из-за создания активиксов на всех слоях формы + установка видимого слоя приводят к эффекту «мигания формы»

    Reply
  10. vip

    (9) И я ж про то.

    Чрезмерное усложнение классов на пустом месте привело к «1 месту».

    Reply
  11. Ёпрст

    (10) но + всё равно поставлю..

    3d маджик вещь хорошая 🙂

    Reply
  12. vip

    (11) Поставлю маленький минус за то, что 3d маджик действительно вещь хорошая (виртуальный, потому что для реального минуса/плюса я рылом не вышел).

    А автор чрезмерно увлекся классами и нечаянно похоронил суть чудесной вещи.

    Reply
  13. ded00786

    (12) Автор молодец, удивил)

    Не обращая внимания на «критику», кому надо тот допилит, а за идею ЖИРНЫЙ плюс

    Reply
  14. bainov

    Немного изменил классы и работу с АктивИкс. «Моргания» стало намного меньше.

    Обнаружил, что если мы используем элемент управления ActiveX в режиме статического текста со спецэффектами (Style=STYLE_LABEL), то получаем эффект моргания.

    Спасибо за критику и за советы.

    (13) вдохновляет, спасибо 🙂

    (9)

    неправильная работа со слоями формы, из-за создания активиксов на всех слоях формы + установка видимого слоя приводят к эффекту «мигания формы»

    Я специально загружаю при создании формы все активиксы — чтобы потом диалог не моргал при переключении между слоями.

    Чрезмерное усложнение классов на пустом месте привело к «1 месту».

    Классы были разработаны не ради вывода окна вопроса или предупреждения. Это просто частный случай их применения.

    Присмотритесь получше, может еще и пригодится кому.

    Reply
  15. DeniNik

    Здравствуйте! Скиньте библиотеки, а то с моими или при запуске 1С вылетает или пишет что не та версия!?

    Reply
  16. bainov

    (15)

    Добавил работающие DLL-ки

    Reply
  17. Lyolik

    Знающие, подскажите, пожалуйста. С помощью чего сделана надпись Ver_24.10.2010_52 на скриншоте Диалог Предупреждение()? Я понимаю, что это какой-то плагин к OpenConf, поскажите как называется. Спасибо.

    Reply
  18. bainov

    (17) Скрипт Версия.vbs

    Reply
  19. Lyolik

    (18) Большое спасибо.

    Reply
  20. RomKazim

    Класс. Очень вовремя все это появилось. Спасибо.

    Reply
  21. lilly

    Бесспорно красиво смотрится!

    Reply
  22. lelusha

    очень красиво смотрится! Автору спасибо, обязательно скачаю, как будет возможность)

    Reply

Leave a Comment

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