[IMAGE] Шоу "За лупой" (просмотр и установка привязки товар-изображение)




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

66 Comments

  1. Abadonna

    Серега, за название +1000 :)))))))))))))))))))))))))))

    Reply
  2. mdzen

    За название +.

    Reply
  3. vip

    Не, название можно сделать еще однозначней.

    Просмотр и установка привязки товар-изображение (за лупой).

    А если убрать скобки и пробел в них, то разработка безоговорчный номинант конкурса на лучшее название.

    Reply
  4. vasilykushnir

    Прочитал название — хохотнул…

    Reply
  5. Shaman100M

    А где кнопка с лупой? 🙂 +1

    Можно бы расширить список форматов, не только .jpg

    Reply
  6. andrewalexk

    🙂

    для бесплатного — неплохо

    для «за 1000р» — дерьмо

    Reply
  7. CheBurator

    (5) бесплатно, т.е. ДАРОМ — то что есть.

    (6) скажем так — я не видел аналогичного ни за за 2000 руб., ни за 500, ни за 1000…

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

    Reply
  8. JohnyDeath

    да ладно тебе Че. как нет аналогов??? Если ты имеешь ввиду способ идентификации картинки по элементу, то да, конечно.

    Такой подход не прокатит для УРБД и иже сним. Там картинки должны хранится в самой базе. Есть несколько компонент, которые реализуют это (абсолютно бесплатно)

    Reply
  9. CheBurator

    (8) Почему это для УРБД картинки должны храниться в базе? не вижу необходимости в этом…

    Единственное, при сливе картинок из филиалов надо обеспечить уникальность имен файлов для каждого филиала — добавляем в имя файла префикс ИБ

    ..и вообще — там где есть УРБД, как правило, есть свой программер — эта обработка (если он ее заюзает) — будет только как «мясо», а не как готовый бифштекс…

    Reply
  10. JohnyDeath

    (9) ну и как ты себе представляешь обмен? проходимся по товарам, цепляем картинки, отправляем изменения и каритнки, распихиваем картинки???

    Reply
  11. CheBurator

    (10) читаем выше

    «Несколько лично моих постулатов:

    — изображения товаров не являются необходимым условием торговли/учета товаров;»

    ..поэтому нефиг их гонять туда-сюда… там где надо — ну и пусть лежат в филиалах… нафига они в центре?

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

    Reply
  12. Shaman100M

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

    — шлем из центра обновленные и новые с командой «замещать все»

    — шлем обратно с периферии с командой «замещать старые».

    Ну, а чтобы каждый раз не перебирать все файлы каталога, а по номенклатуре их м.б. много — можно в маску имени добавить формат даты, и перебирать с маской «???????»+ТекущаяДата(), соответственно, для перебора «имиджей» одной номенклатуры используем уже маску на дату.

    Reply
  13. CheBurator

    (12) Ну и я про то же — докрутить как нужно самому…

    Reply
  14. Abadonna

    (6) не обижай Серегу, он хороший……. девелопер 😉

    Reply
  15. CheBurator

    блин, и главное — 40 чел качнули и хоть бы один отозвался… плохо или хорошо…

    Reply
  16. Abadonna

    blow job for image назови, еще плюс поставлю

    Reply
  17. vip

    (15) Да как бы помягче — обыкновенно.

    А вот хранить картинки в базе это интереснее. Задача несложная, но эффектная.

    Reply
  18. Abadonna

    А Чебур спец из обычного сделать тоже обычное, но не очень. Андрей, мы с тобой механики (!), а с Чебуром мы горнолыжники (!).

    Reply
  19. CheBurator

    (16) Так именно я ж и сделал — именно чтоб обыкновенно, без выкрутасов, по принципу «поставил — юзай»… сегодня положу еще и РМ сборщика, для которого эта прога собственно является подготовителоьной, как я это упоминал…

    картинки в базе хранить — да, интересно, решаемо… но смысл… — база рухнет — рухнут и картинки.. а так — вот они… отдельно лежат… бэкапы же до сих пор не все делают…

    Reply
  20. Abadonna

    А за постоянный топик с Чебура отказ от Far-а ;)))

    Reply
  21. Abadonna

    Я тебя тОплю, все время вверху, кричи «грехи осознал, буду юзать Тотал и плагин к нему Абадонновский» 😉

    Reply
  22. mdzen

    (16)(20) Пробовали уже хранить в базе.

    1. База пухнет до невообразимых размеров, тем более если к номенклатуре 2 и более картинок привинчены.

    2. Чебур прав — база рухнула считай пропало ( конечно есть бэкапы, но сливать в архив такую туеву хучу гигов запаришься).

    Reply
  23. JohnyDeath

    >база рухнула считай пропало

    мляяя, о чём вы говорите??? Если база рухнула, а у вас нет бэкапов, то тут уже не до картинок номенклатуры. Или не так?

    конечно есть бэкапы, но сливать в архив такую туеву хучу гигов запаришься

    Отвечу вашими же методами: а вдруг каталог с картинками упадёт? а у вас нет их бэкапов? что тогда? )))

    Reply
  24. mdzen

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

    Reply
  25. mdzen

    Тогда просто вместо картинки типа «NO Photo. Sorry!». Хе-хе

    Reply
  26. vip

    (22) Это смотря КАКИЕ картинки и смотря КАК хранить.

    Сдуру можно и [вырезано цензурой] сломать.

    Reply
  27. Abadonna

    Ну бросте вы. Что касается элементанраных действий, Чебур всегда молодец. У него проколов не бывает. Он самый лучший девелопер и самый лучший beta-tester из всех, мне знакомых. Far его погубит, а так он находится под протекцией Abadonna, если трогать — начинать с меня! Беру Чеба под своё крыло, кто (хотел ведь напписать!) недооволегн — писать мне

    Reply
  28. CheBurator

    Илите флеймить в форум!

    просьба высказываться по сути обработки!

    Reply
  29. vasilykushnir

    (22)1. База пухнет до невообразимых размеров, тем более если к номенклатуре 2 и более картинок привинчены.

    А бывает и 5…

    А кто мешает их хранить в отдельной скульной базе? Собственно это сейчас планирую с переходом на скуль (на стадии осмысления): будет основная база и парочка вспомогательных. На ДБФах, конечно такое не выкрутишь…

    И еще: к каждому товару не 5 (к примеру) картинок (у меня сертификаты в виде графики), а только 3, если больше — однозначно из расчета 2 картинки на лист.

    Reply
  30. vasilykushnir

    А что касается собственно темы: у Чебура всегда оббалденные интерфейсы — ничего лишнего и аляповатистого, но максимум удобств для юзеров. Кстати, а где обещанный скрин сканирования сертификатов?…

    Reply
  31. CheBurator

    (29) у меня сертификаты качетсва, гигенические сертификаты и отказные письма храняться аналогичным образом — в карточке только номер, который однозначно определяет изображение, изображения — в папочке отдельно от базы…

    Reply
  32. ge_ni

    Для швейника организовал аналогичное еще лет 5 назад. Хранит 10000 картинок, все хорошо. В момент привязки картинки изодражение пропорциональное, без искажений… Но как только начинается следующий цикл просмотра при оьбращении к карточке номенклатуры: «Стройные дамы превращаются в толстушек и наоборот..» Вомущается гад! На примере у Che искажение тоже присутствует. Может в 1С кто умеет подгонять динамически окно по картинку… Просто сильно этой проблеммой не занимался, а тут вдруг — родственные души… Подскажите плз…

    Reply
  33. JohnyDeath

    (32) >Может в 1С кто умеет подгонять динамически окно по картинку…

    это может делать FormEx. Класс «РасширениеФормы», свойства на чтение и запись:

    Высота / Height

    Ширина / Width

    Reply
  34. CheBurator

    (33) + или делаешь окно «типа портрет», на нем — картинка, а дальше — штатно

    РежимРисования(<?>);

    Синтаксис:

    РежимРисования(<Режим>)

    Назначение:

    Установить режим рисования картинки.

    Возвращает:

    Текущее числовое значение режима рисования картинки (на момент до исполнения метода).

    Параметры:

    <Режим> -:

    1 — растягивать;

    2 — рисовать по центру с оригинальным размером;

    3 — рисовать, сохраняя оригинальное соотношение размеров.

    Подробнее см. в документации, глава »Работа с Картинками»

    Reply
  35. ineoosaki

    Пример смотрите в конфе 1C ДЕНЬГИ

    Reply
  36. Alexandra

    Обработка — даром, за название — 1000

    Reply
  37. nnvlad

    Cnfylfhnyfz конфа 1с:Деньги давненько имеет в своем арсенале вызов изображения, так что велосипед батенька, велосипед!

    Reply
  38. CheBurator

    (37) Что, позволяет привязывать по аналогичному алгоритму? Предоставляет такой же интерфейс?

    Reply
  39. dim1976

    Неплохо придумано! Молодец!

    Можно выводить весть товар и которого нет на складе ,скажем по галочке «Все товары» ?

    Reply
  40. Sure

    Да, название того стОит! Нарочито-нецензурное пополам с неприличным.

    Reply
  41. Abadonna

    (37) Ну что вы все так до этого велосипеда докопались? Если бы его не изобретали — так бы и ездили на том монстре с огромными колесами. А сейчас, однако, и горные, и т.д….

    Reply
  42. елерина

    Интересный вариант, а как с ним ознакомиться. Давно ищу, что нибудь для 1С, что бы менеджеры могли выписывая счета видеть, что продают

    Reply
  43. CheBurator

    Ознакомиться и использовать можно просто: скачать с этой страницы и пользоваться. Если интересует «встраивание» картинок в процесс продажи — это отдельная маленькая задачка

    Reply
  44. sirius77

    Как сделать так чтобы во врема подажи в ТиС 9.2 по документам Чек ККМ; Реализация; Реализация(розница); В справочниках номенклатура и т.д. когда водишь курсором по позициям то же появлялась картинка???

    Как в 8-ке.

    Reply
  45. CheBurator

    (44) примерно как и здесь…

    Reply
  46. korpas

    Интересная статья. По поводу привязывания к процессу продажи: есть ли смысл в форму подбора номенклатуры добавить картинку, чтобы менеджер при выписке счета видел картинку ,например?

    Reply
  47. CheBurator

    (46) Имхо картинки в процессе именно подбора номенклатуры — необходимости нет… чем картинка поможет манагеру…? если он не знает номенклатуры — то и картинки не помогут… В специфических случаях надо рассматривать отдельно

    Reply
  48. Валерий_

    (47) Прекрасная идея, но использовать не возможно.

    Идею с изображением товара можно применить, например, при продаже в помощь и менеджеру (для быстрого предложения товара) и покупателю (для выбора)

    Это и есть помощь менеджеру, таким образом, можно ознакомить весь персонал, с новым товаром, и очень даже изображение поможет, если товар не известен.

    Номенклатуру в обработке искать можно Ctrl+F3 > поиск > Справочник номенклатуры > F7… быстрее, если расположена по алфавиту.

    Да и изображение получается корявое.

    Жаль

    Идея отличная +

    Но без «маленьких задач» …

    Reply
  49. CheBurator

    Да, у меня, например, ассортимент идет большой и ротация товара постоянная.

    насчет

    > Да и изображение получается корявое. Жаль

    — не понял.. что плохо/не устраивает?

    .

    данная обработочка для установки привязки.

    сама работа с изображениями в карточке товара описана здесь: http://infostart.ru/blogs/330/

    .

    при желании применить данный подход к раположению картинки на форме списка — нужны незначительные модификации

    Reply
  50. CheBurator

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

    Reply
  51. Валерий_

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

    Вытянуты так же и фото квадратной формы.

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

    Reply
  52. CheBurator

    (51) ну… обычно пропорции картинки не так критичны, поэтому картинка умолчательно масштабируется на все доступное поле… можно смасштабировать с соблюдением пропорций…

    Reply
  53. CheBurator

    Советую посмотреть вот это: http://infostart.ru/projects/2188/

    Reply
  54. Валерий_

    (53)Посмотрел, отмасштабировал, давлю на кнопку «выбрать» > выдаёт окно: «Нет данных о том, в какое место выбрать указанную картинку…

    В выборе отказано!»

    Т.е. пардон, как сохранить?

    Reply
  55. CheBurator

    (54) данный диалог просмотра/масштабирования может:

    — вызываться интерактивно пользовтелем самостоятельно: тогда картинку выбранную некуда «передавать» (вам хочется сохранить, а кому-то захочеться распечатать — на всех не угодишь…);

    — вызываться программно из какой-нибудь «родительской» обработки, тогда при выборе «выбранная» картинка возвращается/передается в родлительскую обработку и та уже делает что нужно программисту/юзеру — сохраняет в другую папку, отправляет по почте, печтатет и т.д.

    ..

    возможно для ваших нужд (пока мне непонятно каких) следует воспользоваться вот этим: http://infostart.ru/projects/2439/

    Reply
  56. Валерий_

    (55) «воспользоваться вот этим: http://infostart.ru/projects/2439/»

    Воспользовался, так же, нет возможности сохранить — при нажатии кнопки «Выбрать текущее изображение и закрыть форму» — ничего видимого не происходит, во всяком случае, форма не закрывается. Этот вопрос скорей Малееву Александру.

    А нужды наши — солидарны с (44)

    Reply
  57. CheBurator

    (56) читаем (49) последнее предложение

    Reply
  58. Валерий_

    (57) Отражённые здесь: http://infostart.ru/blogs/330/ или несколько иначе?

    Reply
  59. CheBurator

    практически 1 в 1…

    убегаю домой буду на связи +1.5 часа

    Reply
  60. Валерий_

    (52) Странно, как пропорции предлагаемого, тем более «обычно», могут быть не критичны, тогда и предложения не эффективны, на сколько некритичны.

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

    Reply
  61. CheBurator

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

    — не имеет смысла, потому что другие картинки будут криво… надо просто в коде при назначении картинки на предназначенное ей место задать соответсвующий режим пропроциональности…

    ..

    сорри, но более подробное преподавание основ и приемов/методов программирования не входит в мои ближайшие планы… 😉 Если вам надо «докрутить» — обратитесь в раздел «заказы»..

    Reply
  62. Serdjio

    клевая прога очень помогла, спасибо автору!!!!!(=

    Reply
  63. winise

    Спасибо то что нужно !

    Reply
  64. SerNikAnt

    Отлично, применил на практике

    Reply
  65. Nurbert

    спасибо

    Reply
  66. CheBurator

    (66) Пожалуйста

    Reply

Leave a Comment

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