WYSIWYG редактор 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='\

35 Comments

  1. detec

    Потрясающе, особенно если учесть, что это управляемое приложение.

    Reply
  2. Wicked

    Молодец!

    ❗ Обработка на этом сайте отсутствует, но есть здесьОбработка HTML редактор для 8.1

    Reply
  3. DanilaDru

    Спасибо, порадовали. А то я tini mce прикручивал. Все хорошо, да только в веб-клиенте не все отрабатывало. А тут, по-идее, все должно быть красиво.

    Reply
  4. CagoBHuK

    В веб-клиенте не работает. Фаерфокс не поддерживает ничего. ИЕ падает на «Метод объекта не обнаружен (queryCommandSupported)».

    Reply
  5. gn@mik

    мне эта обработка очень была нужна. Огромное спасибо.

    Reply
  6. magrib

    Обработка супер, только картинок нет

    Reply
  7. alex.msk

    Спас, дружище.

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

    Reply
  8. TitanLuchs

    Ммммммм, как раз собирался писать свое под 8.2, а оно уже написано )))

    PS: а чем TinyMCE не подходит?

    Reply
  9. din-din

    Автору +

    Начал рисовать свое потом случайно наткнулся на эту публикацию.

    Спасибо, Вы сэкономили мое время на разработку подобного решения.

    Reply
  10. iiceberg

    (4) CagoBHuK,

    Для исправления ошибки в веб клиенте делаем следующее:

    Модуль формы:

    Добавляем процедуру (что бы заполнился ХТМЛ текст)

    &НаСервере
    Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    Если НЕ ЗначениеЗаполнено(Объект.ТекстHTML) Тогда
    Попытка
    Объект.ТекстHTML = Этаформа.Параметры.текстHTML;
    Исключение
    //Сообщить(НСтр(«ru = ‘»+ОписаниеОшибки()+»‘»), СтатусСообщения.Внимание);
    КонецПопытки;
    КонецЕсли;
    КонецПроцедуры

    Показать

    в Процедуре «ВыполнитьКоманду(Кнопка)»

    определеяем переменную:

    Документ = Элементы.ПолеHTMLДокумента.Документ;

    сохраняемся . проверяем.

    Автору Спасибо!!!

    Reply
  11. jiggli

    2 часа копила монетки, т.к. срочно понадобилась такая обработка, скачала, а она для управляемого приложения, жаль…

    Reply
  12. mdy

    (4) CagoBHuK,

    Вам удалось добится работоспособности данной обработки в Вебе?

    Я поправил код как Вы написали, но увы не работает,

    Чем можете помочь?

    Reply
  13. ZLENKO

    CSS файл к этой обработке можно прикрутить ?

    Reply
  14. iiceberg

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

    Reply
  15. RomikMf

    Нужно сделать нечно подобное под веб-клиент. Интересно было бы посмотреть на данное решение.

    Reply
  16. latrium

    Спасибо огромное за труд. Обработка пригодилась.

    Reply
  17. help1Ckr

    Спасибо огромное!

    Reply
  18. Spacer

    Хорошая вещь, полезная! Скачал, плюсанул.

    Вот просто интересно — почему не используется стандартный диалог выбора цвета?

    По-моему, он выглядит эстетичнее. Вот только ползунков у него нет.

    Но зато в нем есть возможность выбора цвета стиля.

    Reply
  19. AVMCo

    Очень нужная обработка, намного легче текст править для Интернет-Магазина

    Reply
  20. opus70

    подскажите как добавить табличку в редактор

    на одну или 2 колонки

    Reply
  21. Masich

    Спасибо.

    Reply
  22. megatrend

    Отличная обработка. давно искал.

    спасибо автору.

    Reply
  23. Yashazz

    Не, мне больше по душе исходный функционал от Душелова. Там режимов и кноппачек на панели побольше, да и в УФ отлично бегает. Не все тестил, правда, но для меня правка исходного html, например, очень симпатична, а здесь её нету. Автор, почему урезаны возможности Tiny?

    Reply
  24. batyrkin

    (23) Yashazz, если вы не заметили, Tiny MCE в моей поделке вообще не используется — все сделано без нее.

    Reply
  25. Yashazz

    (24) Не качал, поэтому и не заметил )) Откуда я знаю, может, вы просто дизайн поменяли, а js-вызовы эмулируете ) Ну тады пардон, тогда вопросов не имею, а вещица у вас вышла недурственная полюбому.

    Reply
  26. maximus_80

    batyrkin, есть вопрос

    При редактировании описания товара у нас они достаточно большие и возникла необходимость в полосе прокрутки во вертикали.

    В режиме просмотра ее удалось добавить с помощью Документ.body.scroll = «yes»;

    Но, она также нужна в режиме редактирования HTML.

    Можно ли это сделать с помощью настроек?

    Или, если понадобится доработка — какова стоимость?

    Reply
  27. DrAku1a

    Нету вставки картинок из буфера обмена. Так и не понятно — чем форматированный документ не устроил?

    Reply
  28. ture

    Сыровато. Но в целом спасибки.

    Добавь себе еще кнопки отмены и повторения действия, раскрась строки таблицы выбора цвета, убери к еб*ням форму вставки ссылки (пусть отрабатывает форма отцов основателей), так же поступи с вставкой картинки. Множество доступных команд спроси у гейтса.

    Я выдрал твои наработки к себе, но пришлось долго возиться (т.е. разбираться в механизме). outerHTML — позволяет у прогруженного документа спросить весь текст HTML, а не только body.

    Атрибут body с именем ContentEditable нужно сбрасывать, чтоб потом все тараканы не лезли менять страничку.

    Идея подсвечивания очень понравилась!!! странно, что ее нет в консолях запросов. Но я вырубил этот режим и просто текстовое поле вываливаю вместо поля html, чтобы можно было редактировать всю страницу, а не только часть.

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

    В общем вот так. Расти большой не будь лапшой! Удачи чувак!

    Reply
  29. IamAlexy

    Картинки вообще вставить нельзя?

    и работы с таблицами нет ?

    Reply
  30. grayshadow

    Элемент.Документ.body.scroll = «no»;

    Чуваг, зачем??:) я думала, это 1с косячит, 2 часа гуглила причину, почему в полеhtmlдокумента не выводится скролл-бар…

    и еще под новой платформой проблемы с модальными окнами

    в остальном обработка супер!

    Reply
  31. batyrkin

    (30) grayshadow, когда мне это надо было, была необходимость именно короткие HTML описания делать чтоб они на сайт вываливались из 1С, потому и Элемент.Документ.body.scroll = «no»;

    Reply
  32. MorozAltay

    Картинку можно «допилить» вставив команду

    &НаКлиенте
    Процедура КомандаВставитьКартинку(Команда)
    Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
    Диалог.Заголовок = «Выберите файл»;
    Диалог.Фильтр = «Все файлы|*.*»;
    
    Если Диалог.Выбрать() Тогда
    Документ.execCommand(«insertImage», Ложь, Диалог.ПолноеИмяФайла);
    КонецЕсли;
    
    ПоказатьРежимыКнопок();
    КонецПроцедуры
    

    Показать

    А вот с таблицами — беда, кто нибудь может подскажет как таблицы вставлять?

    Reply
  33. grrus

    Приветствую

    Так есть команды по вставке Таблиц?

    Может есть справочник по всем командам которые можно прописать ?

    Reply
  34. DasIsFantastich

    А возможно править сам html с помощью этого редактора?

    Reply
  35. Batman

    (33) Взял список команд отсюда

    https://developer.mozilla.org/ru/docs/Web/API/Document/execCommand

    Проверил по этому списку. Получилось следующее

    backColor — Да

    bold — Да

    contentReadOnly — Нет

    copy — Да

    createLink — Да

    cut — Да

    decreaseFontSize — Нет

    delete — Да

    enableInlineTableEditing — Нет

    enableObjectResizing — Нет

    fontName — Да

    fontSize — Да

    foreColor — Да

    formatBlock — Да

    forwardDelete — Нет

    heading — Нет

    hiliteColor — Да

    increaseFontSize — Нет

    indent — Да

    insertBrOnReturn — Нет

    insertHorizontalRule — Да

    insertHTML — Нет

    insertImage — Да

    insertOrderedList — Да

    insertUnorderedList — Да

    insertParagraph — Да

    insertText — Нет

    italic — Да

    justifyCenter — Да

    justifyFull — Да

    justifyLeft — Да

    justifyRight — Да

    outdent — Да

    paste — Да

    redo — Да

    removeFormat — Да

    selectAll — Да

    strikeThrough — Да

    subscript — Да

    superscript — Да

    underline — Да

    undo — Да

    unlink — Да

    unlinkuseCSS — Нет

    styleWithCSS — Нет

    Reply

Leave a Comment

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