Что-то с чем-то

Сайтик ни о чём…

osCommerce 2003 года выпуска

Июль22

И пришёл к Айболиту барбос — меня курица клюнула в нос…

Но osCommerce — это гораааздо жёстче! В общем, попался мне сайтик, сделанный на osCommerce 2003-го года выпуска. В коде кое-где проскакивают версии 1.0, 1.19, и что-то похожее. В общем, старьё. И мало того, в этом старье кто-то много лет назад поковырялся ржавой отвёрткой. В итоге вердикт был таков: бобик дышит, но лапа только одна, хвост пришит к уху, а кормить через жопу… Проще говоря, админка для обновления информации не пригодна, статьи вообще руками написаны на смеси html и php, и ссылками вставлены в КАЖДУЮ страницу сайта. Ну, что бы было понятнее, какой это объём, это если бы солнышко вставало для каждого жителя планеты отдельно… Миллиарды солнышек… Так вот. Было принято решение — контент типа «товар» пихать напрямую в mysql базу. Это единственный момент, когда древность и отсталость движка сыграли наруку. Методом научного тыка было выяснено, что список товаров находится в таблице products, META-тэги и наименование в products_description, а описание присутствия в группах в products_to_categories. Были подготовлены тестовые запросы, которые привели в шок — товар перемешан ХЗ как, то, что должно сворачиваться в одно наименование с выбором размеров прописано раздельно, и вообще, хаос… Исследование показало: в одном из полей первого товара одного наименования прописано количество размеров этого товара. Все последующие строки дописываются к нему. Т.е. нет никакого общего ключа (хотя у них одинаковые фото). Они просто тупо идут по порядку в базе. причём порядок определяет не ID, а очерёдность, в которой строки добавлены в базу. И ну никак мне не удавалось их по порядку импортировать. Даже по одной строке загонял — никак. И тут пришла мысль. После недавнего сбоя восстанавливали бэкап, и как мне кажется, формат таблиц MySQL был InnoDB, а сейчас стоит MyIsam. Конечно, глупо, но запрос в ТП дал странный ответ: корень проблемы стоит искать в документации MySQL. Мля, сложно было не послать их. Очень сложно. Офигенно информативный ответ. Мне тупо посоветовали пойти учиться. Так обычно делают те, у кого завышенная самооценка, и желание унизить весь мир. Но, Мы — человек не гордый и не обидчивай. С самооценкой у Нас всё хорошо, так что не будем обращать внимание на плебеев. Открытия требуют экспериментов… Итак, Яндекс дал кучу скриптов для перевода таблиц из MyIsam в InnoDB. Глупости какие-то… Должно быть проще… Делаем бэкап базы, открываем любимым текстовым редактором (у меня, на данный момент, это Notepad ++, хотя, иногда, для перекодировок использую древний, заброшенный разработчиком Aditor Pro), и видим много строчек ENGINE=MyISAM. Автозаменой меняем их на ENGINE=InnoDB, сохраняем, грузим обратно в MySQL и о чудо! Теперь тип таблиц стал InnoDB! Прогоняю тест — ещё раз чудо! Все строчки импортируются ровно в том порядке, как я их и отправляю! Теперь новая задача: автоматизировать процесс. Так как у людей база держится на 1С 7.7, то и автоматизировать лучше на этом же. Всегда можно будет интегрировать в основную базу, и иметь минимум гемора. Ну и для полного счастья, 1С будет не просто какой-то код генерить, а напрямую работать с MySQL базой сайта.

Первое, что надо сделать, это установить ODBC драйвер. В независимости от разрядности системы, надо брать x32 версию. Взять можно на dev.mysql.com. Кстати, для 1С 8 он тоже нужен. Ну вот, коннектор поставили, теперь нам нужен доступ к MySQL базе. И если она лежит на соседнем компе, то всё здорово, а если на хостинге — то надо к ней пролезть. Majordomo и RUCenter (с ними сталкивался) предлагают использовать SSH-туннель. Я же, в свою очередь, предлагаю для туннеля использовать MyEnTunnel (если хочется с интерфейсом и кнопочками), или Plink (командная строка) от создателей Putty. Скрипт соединения для plink:
Majordomo
plink.exe IP_Сервера_сайта -ssh -2 -P 1022 -l "Логин_для_SSH" -i "keyfile.ppk" -L 3306:Адрес_сервера_MySQL:3306 -v
RUCenter
plink.exe ssh.ВАШ_ЛОГИН.nichost.ru -ssh -2 -P 22 -l "Логин_для_SSH" -pw "Пароль_SSH" -L 3306:Адрес_сервера_MySQL:3306 -v Как получить ppk есть в мануале Мажордомо. Для RuCenter использовал пароль, но можно и ppk получить. Всё есть в хэлпе у хостера. Может, потом напишу у себя, а может и нет.

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

Функция КомандаДляСайта(СтрокаЗапроса) Экспорт
Попытка
Соединение = СоздатьОбъект("ADODB.Connection");
Состояние("Подключение к сайту...");
Соединение.ConnectionString = (СтрокаПодключенияКСайту);
Соединение.Open();
НаборЗаписей=Соединение.Execute(СтрокаЗапроса);
ТЗ=СоздатьОбъект("ТаблицаЗначений");
Сч=0;
КолВоКолонок=НаборЗаписей.Fields().count;
Состояние("Получение данных с сайта...");
к=0; //Создаём набор колонок
Пока к<КолВоКолонок Цикл
ТЗ.НоваяКолонка(НаборЗаписей.Fields(к).name,,,,НаборЗаписей.Fields(к).name,,,);
к=к+1;
КонецЦикла;
//Закончили с колонками
Пока НаборЗаписей.Eof()=0 Цикл
ТЗ.НоваяСтрока();
Сч=Сч+1;
к=0;
Пока к<КолВоКолонок Цикл
ТЗ.УстановитьЗначение(Сч,НаборЗаписей.Fields(к).name,НаборЗаписей.Fields(к).Value);
к=к+1;
КонецЦикла;
НаборЗаписей.MoveNext();
КонецЦикла;
Соединение.Close();
Возврат ТЗ;
Исключение
Для ы = 1 По Соединение.Errors.Count Цикл
Сообщить(Соединение.Errors.Item(ы-1).Description);
КонецЦикла;
Соединение.Errors.Clear();
КонецПопытки;

КонецФункции // ПолучитьДанныеССайта()
В переменной СтрокаПодключенияКСайту надо передать строку такого содержания:DRIVER={MySQL ODBC 5.3 Unicode Driver};SERVER=127.0.0.1;Port=3306;DataBase=ИМЯ_БАЗЫ_MySQL;UID=ЛОГИН_MySQL;PWD=ПАРОЛЬ_MySQL;
И что нам даст этот кусок кривого кода? А то, что мы можем передавать в эту функцию обыкновенные MySQL запросы, и будем получать в ответ ТЗ! Соответственно, если это будет запрос вида SELECT * FROM `products` WHERE 1, то в ответ мы получим ТЗ со списком товаров на сайте! Теперь нам остаётся лишь формировать запросы в коде 1С, и обрабатывать ответные ТЗ! Где-то в сети видел неплохое описание всех команд (запросов) MySQL с примерами. Найду — приляпаю ссылку. И напоследок, осталось загрузить фотки. Как подцеплять в 1с ищем в Яндексе. С помощью nconvert.exe и строки видаКомандаСистемы(КаталогИБ()+"nconvert -out jpeg -overwrite -rexifthumb -resize w 170 -ratio "+КаталогИБ()+"thumb\"+СокрЛП(products_image)+"_thumb.jpg"); привожу картинки к нужным форматам (в этом примере, делаю превьюшки высотой 170 точек с пропорциональным изменением ширины), чищу от всяких ненужностей, утяжеляющих картинку, и через компоненту DialMail.dll закидываю на FTP. Как делать синхронизацию и удаление — расписывать не буду, ибо всё по аналогии и логике.

Честно говоря, проделав всю эту дребедень, появилось 2 мысли:

  1. От смены сайта в ближайшее время можно отказаться, пока мои труды не окупятся.
  2. Можно продавать связку из настроенной 1с и osCommerce. Бредово, но реально.

Кстати, перед форматом обмена CommerceML вижу свои плюсы. Больший контроль над процессом, на сайте ненужны никакие плагины (которые, кстати, далеко не идеальны). Сайт может быть вообще любым, лишь бы база была в MySQL. На самом сайте ничего кодить не надо — всё делается на стороне 1с.

В Архиве лежат nconvert, plink и DialMail, если кому лень искать.

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

автор опубликовано в рубрике 1С, сайты, и т.п. | Комментарии к записи osCommerce 2003 года выпуска отключены    

Комментарии закрыты.

Этот сайт не обо мне, не о моих родственниках или домашних животных. Это просто сборник того, что я по каким-то причинам решил записать.

Я пока даже не знаю, как это всё должно выглядеть, так что пусть это выглядит как помойка, а когда пойму как оно должно выглядеть — переделаю.

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