Таблица значений в Таблицу HTML — функция с возможностью настройки цвета шапки, заголовков, выравнивания и размера колонок




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

21 Comments

  1. smirnov.es

    А если просто готовый макет сохранить в HTML?

    Reply
  2. ArchLord42

    ухх. какой спагетти-код

    Можно сделать так:

    
    //Шаблон, лежит например в макете
    
    <!DO CTYPE html>
    <ht ml>
    <head>
    <title>my table</title>
    </head>
    <body>
    <table st yle=»width: {{ Параметры.ШиринаТаблицы }}px; height: {{ Параметры.ВысотаТаблицы }}px;»>
    <thead>
    <tr bgcolor=»{{ Параметры.ЦветШапки }}»>
    {% Для Каждого Колонка ИЗ Параметры.ТЗ.Колонки Цикл %}
    <td>{{ Колонка.Имя }}</td>
    {% КонецЦикла; %}
    </tr>
    </thead>
    <tbody>
    {% Для Каждого СтрокаТЗ ИЗ Параметры.ТЗ Цикл %}
    <tr>
    {% Для Каждого Колонка ИЗ Параметры.ТЗ.Колонки Цикл %}
    <td>{{ СтрокаТЗ[Колонка.Имя] }}</td>
    {% КонецЦикла; %}
    </tr>
    {% КонецЦикла; %}
    </tbody>
    </table>
    </body>
    </html>
    
    //Фунция выводить любую таблицу значений в HTML
    Функция ВывестиЛюбуюТаблицуВHTML(ТЗ, ШиринаТаблицы = Неопределено, ДлинаТаблицы = Неопределено, ЦветШапки = Неопределено)
    Шаблон = ПолучитьШаблонВывода(); //Получаем шаблон, см.выше
    
    ДлинаТаблицы  = ?(ДлинаТаблицы = Неопределено, «1000», ДлинаТаблицы);
    ШиринаТаблицы = ?(ШиринаТаблицы = Неопределено, «500», ШиринаТаблицы);
    ЦветШапки    = ?(ЦветШапки = Неопределено, «#FFF», ЦветШапки);
    
    Возврат Шаблонизатор.СкомпилироватьШаблон(Шаблон, Новый Структура(«ТЗ, ШиринаТаблицы, ВысотаТаблицы, ЦветШапки», ТЗ, ШиринаТаблицы, ДлинаТаблицы, ЦветШапки));
    
    КонецФункции
    
    

    Показать

    Если заинтересовало, то прошу https://infostart.ru/public/549791/ 🙂

    Кстати можно пойти более 1Сным путем и вывести ТЗ через СКД, где все можно настроить визуально и ТД потом в HTML конвертнуть.

    Имхо такой код очень сложно поддерживать.

    Reply
  3. rpgshnik

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

    Reply
  4. rpgshnik

    (2) интересно ваше предложение по коду в шаблоне (проверю как работает не сталкивался), но сама реализация в целом схожа, если использовать структуру то будет такая же лапша)) если вы об этом, а без структуры передавать все параметры в процедуры это будет треш может достичь такого ВывестиЛюбуюТаблицуВHTML(ТЗ,,,,,,»Договор контрагента»,,,,,,»center»,,,,ИСТИНА); Это же вообще будет не понятно что происходит)) К примеру центрируйте только 35-ую колонку, а 14 колонке заголовок «Договор контрагента».

    Мне нужно было пока цвет шапки менять, при необходимости менять заголовки колонок, а так же центрировать колонки, ну и конечно вывод п/п.

    Прямое использование — без интерфейсное — регламентными заданиями. В сфою функцию я просто передаю таблицу прямо из запроса, знаю какие колонки мне нужно написать с пробелом,какие колонки центрировать, а так же при необходимости пп. Получаю ХТМЛ таблицу, вгоняю её в шаблон письма и письмо улетает))

    Reply
  5. ArchLord42
    ВывестиЛюбуюТаблицуВHTML(ТЗ,,,,,,»Договор контрагента»,,,,,,»center»,,,,ИСТИНА)

    Функция была лишь простейшим примером, как можно убрать спагетти код вывода html заменив немного подход к его выводу.

    На простых примерах преимущества шаблонизации вы можете и не разглядеть, но когда поработаете с html с >1k строк кода и кучей переменных, поймете всю боль веб программистов из 2006 года.

    Reply
  6. MSK_Step

    Завуалированная реклама

    (2)Без обид, но ваша статья слабовата, как демо какое то. Я не осилил с первого взгляда. Тут хоть развернут код, чтобы не тратить время на скачивание.

    Reply
  7. rpgshnik

    (5) так мне не нужно работать с 1к мне нужен удобный и простой способ перегнать таблицу значений в строку 1с с кодом HTML таблицы.

    Вы мне покажите как ваш шаблон и функция будет выглядит полностью сопоставив моей если это легче и удобнее.

    Reply
  8. fuxic

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

    Настройки шаблона / данные / шаблон должны быть разделены визуально и в коде — основы MVC.

    Зачем смешивать мух и котлет — native стили вместо css в одном месте? Все оформления тоже лучше в общий style, например, та же шапка через элементы thead td:nth-child(n), тогда исходник с результатом будет легко читаться и меньше весить

    И зачем супернастройки вместо того, чтобы дать выбрать из существующих css, которые делали профдизайнеры Bootstrap3/4, Flat, Material (1, 2), Metro, Office, W3CSS — не касаясь фремворков вокруг настоящих движков (ember, angular, vue, jquery, dojo, extjs, kendoUI)! Конкретные цвета лучше заменить абстракциями («важно», «критично», «основное», «второстеменно») и дать запоминать

    1-й класс HTML. Элементарные элементы стиля — рамку светлее (1сные рамки отнимают много внимания в любой версии), в td padding (дикость без отступов от бордеров жить), в шапке th вместо td, ширину 100% для адаптвной и для колонок лучше max-width. Веберы за шрифт Verdana вместо нового супер Roboto стрелять готовы, а тут TimeNewRomans :))) Добавьте еще настройку процента размера через transform: scale(90%) для удобства. Для красоты можете tr:hover. Но все это полная ерунда, когда все уже давно написано.

    Reply
  9. ArchLord42

    (8)

    Пример использования #2 — Отправляем таблицу HTML в электронном письме

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

    Reply
  10. fuxic

    Шаблонизаторы XSLD

    (9)

    Любой готовый css встраивается в письмо. Их размерам после углифай в *.min.css вы удивитесь))

    Более того, можно экспортировать настройки только таблицы и бади.

    Более того css вершина и изюминка, а самое интересное, если заняться js и заставить эту таблицу работать (тултипы, линки, свертки, меню)

    И когда html, css, javascript, препроцессоры, постпроцессоры, сборщики, npm-пакеты останутся позади вы откроете для себя node.js ))))

    Reply
  11. ArchLord42

    (10)

    node.js

    лол, я пишу на нем уже 2 год.

    У вас видимо опыта мало, вот и пишите тут ахинею

    Для верстки писем есть определенные правила, основные из них.

    1) только таблицы, никаких дивов.

    2) ТОЛЬКО инлайн css и если css, то определенные его свойства, в частности :hover который вы раньше упоминали к ним не относится.

    3) никакого js

    и это всего навсего «вершина айсберга», пунктов на самом деле поболее.

    а тот спиок которым вы тут хорохоритесь попросту на 70% не работспособен в почтовых программах, css не инлайн удаляется, js удаляется, дивы и прочие html элементы удаляются в большинстве случаев.

    Reply
  12. fuxic

    (11) Согласен с письмами. Но к ним мы перешли без причины. Только об инлайн css и речь, так что не надо поправлять и ахинеить))

    С js таблица встраивается во вложение и не ломайте мне мозг супертаблицами в самом письме

    Reply
  13. fuxic

    (11) Сэкономьте мне время, на nodejs надо выбрать 1-2 фремворка. Варианты

    actionherojs https://www.actionherojs.com/ **

    adonisjs http://adonisjs.com

    catberry http://catberry.org

    dietjs http://dietjs.com/

    expressjs https://expressjs.com/ **

    hapijs https://hapijs.com

    koajs http://koajs.com/

    loopback https://loopback.io/ **

    mean http://mean.io/

    nodaljs http://www.nodaljs.com/

    sailsjs https://sailsjs.com/ **

    senecajs http://senecajs.org/

    strapi https://strapi.io/

    totaljs https://www.totaljs.com/ **

    Reply
  14. ArchLord42

    (12)

    Но к ним мы перешли без причины.

    боже мой, вы вообще читаете что вам пишут?

    Сэкономьте мне время

    10 стартмани, ок?

    Reply
  15. fuxic

    (14) Мне пишет человек, который вместо XSLT или handlebars пишет свои шаблонизаторы и разводит на 10sm, делая вид что что-то знает ))) Поменьше эмоций, давайте поставим точку в бесполезном общении.

    Reply
  16. ArchLord42

    (15)

    Мне пишет человек, который вместо XSLT или handlebars пишет свои шаблонизаторы

    Как вы представлете будет работать handlebears, без браузера где нет JS?) ну, а XLST в музей садомии пора сдавать.

    Реализуете что-то получше на native 1С, обязательно скачаю.

    разводит на 10sm

    Вы просили услугу, я назвал цену..развод?) Сходите к доктору молодой человек.

    Reply
  17. s_vidyakin

    Я как то раз накидал шаблон максимально близкий к 1Сным таблицам, теперь иногда использую в формах чтоб добавить возможности форматирования которых нет в 1С (редко)

    Reply
  18. zzzzz

    Здравствуйте! Спасибо за код, не было времени разбираться. А так готовый взяла и все работает! Есть пара вопроосов правда.

    Можно ли ширину настраивать не значениями, а может есть что то типа «по ширине документа», а ширину колонок, например в процентном соотношении? И если у меня в таблице есть пустые ячейки, то они выводятся без рамки. Можно ли где то в коде насильственно прислюнить этот «border»? Спасибо.

    Reply
  19. rpgshnik

    (18)

    Можно ли ширину настраивать не значениями, а может есть что то типа «по ширине документа», а ширину колонок, например в процентном соотношении? И если у меня в таблице есть пустые ячейки, то они выводятся без рамки. Можно ли где то в коде насильственно прислюнить этот «border»? Спасибо.

    Если честно не силен HTML, думаю там всё возможно если разобраться 🙂 Я делал довольно примитивный вывод табличной части.

    Reply
  20. spectre1978

    (2) Категорически поддерживаю! Сам использую подобный механизм для формирования XML-документов. Гораздо удобнее, чем городить портянку через DOM или через ЗаписьXML.

    Reply
  21. dima_home

    (8)

    «Идейный посыл»

    Растреливал бы людей, которые лепят в сайты всякие «node.js» куда не попадя.

    Сегодня, даже если у тебя простая страничка HTML (показывает пару картинок и табличку), погружают столько библиотех и джаваскриптов, что даже пустая страница открывается в браузере несколько секунд и весит под 100 МБ.

    Reply

Leave a Comment

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