Перейти до вмісту
Пошук в
  • Детальніше...
Шукати результати, які ...
Шукати результати в ...

Модификация OpenCart под свои нужды


Recommended Posts

Предлагаю вашему вниманию перечень собственных наработки, которые пришлось внедрить при создании (пока что еще не интернет-магазина) каталога товаров с использованием OpenCart.

- Выгрузка данных из 1С 8.1 УТ - импорт в OpenCart

Пришлось добавить дополнительные таблицы для синхронизации номенклатуры и др. справочников по GUID в 1С. Все предлагаемые методы импорта/экспорта работают таким образом, что каждый раз нужно очищать таблицы и заново их загружать. Я пошел другим путем, создал таблицы с соответствием id в 1С и в OpenCart, теперь при выгрузке данных, я передаю изменения сделанные в 1С с момента последней выгрузки, соответственно в таблицах OpenCart нет надобности удалять все данные и переносить все по новой.

- Модуль "Сниженные цены"

Идея в следующем, в 1С создаются документы "Установка цен номенклатуры", которые изменяют цены на товары как в меньшую, так и в большую сторону, эти данные пишутся в регистр сведений "Цены номенклатуры", который в свою очередь используется для выгрузки цен в OpenCart. Т.е. цена в таблице products просто замещается новой текущей. Механизма, который бы хранил предыдущую цену в OpenCart нет. В новом модуле как раз и использован механизм хранения старых цен, причем не всех, а только тех которые были снижены в 1С, отображают цены которые были снижены за определенный период (например, месяц).

- Модуль "Торговые точки"

В OpenCart есть возможность создания нескольких магазинов используя одну базу данных, но для отображения на разных сайтах, идея хорошая, но скажите кто-нибудь пользуется этим? В моем случае, требуется одна база данных, но магазины должны находится на одном сайте. Если проводить параллели с 1С, то это просто разные склады, с данными о наличии одного и того же товара на имеющихся складах. Данный модуль хранит данные о наличии товара в каждой розничной точке, с отображением дополнительной информации (адрес, телефон, цена и т.д.). Информация доступна при открытии страницы о товаре, для этого добавлена еще одна закладка. Есть бокс (виджет), который отображает список всех торговых точек с данными (фото, адрес, телефон, время работы, google-карта).

- Ссылка на завод-производитель (модификация)

В OpenCart при выводе информации о товаре почему-то забыли о производителей, т.е. нигде нет данных при выводе перечня товаров, например при поиске или выбор по категориям.

- Ссылка на категории из товара (модификация)

Тоже самое касается и категорий, например я нахожу какой-нибудь товар в поиске, к каким категориям он относится, приходится только гадать. А ведь в OpenCart для этого все есть, создана даже функция getCategories($product_id). Ведь это нормально отобразить перечень категорий, к которым относится данный товар.

- Поиск в найденном (модификация)

Работает как в яндексе. Ищем что-либо, потом ставим галочку "Поиск в найденном" и меняем текст для поиска.

Как это все работает можно посмотреть на готовом сайте http://biosfera.kz.

В планах добавление других модулей (например, "Распродажа") и доработка опций товаров. Если есть интерес, просьба высказываться, какой из перечисленных модулей вызывает наибольший интерес, я постараюсь рассказать об этом подробней и подготовить его для использования. P.S. За основу взят движок версии 1.4.9.5. К сожалению, после выпуска версии 1.5.0 сайт уже был практически готов, и адаптировать все изменения под новую версию, пока что не представилось возможным.

  • +1 1
Надіслати
Поділитися на інших сайтах


  • 2 weeks later...

кРРРРРРРРРРасавчик! ++++

Шикарно, коллега.

по поводу

Если есть интерес, просьба высказываться, какой из перечисленных модулей вызывает наибольший интерес

интересно, как были налажены "Торговые точки", а именно - способ актуализации. Это один админ делает или каждый из своей точки может уточнять наличие товара(ов)?

А так.. Ну нет слов - очень понравилось решение. Единственное что логотип - гм.. Видно, что кодер создавал =)

Пишите в личку, если что - подправим немного. Стыдно на таком полезном ресурсе такой эээ... ну, вобщем, погрызанный логотип.

С уважением.

Надіслати
Поділитися на інших сайтах

интересно, как были налажены "Торговые точки", а именно - способ актуализации. Это один админ делает или каждый из своей точки может уточнять наличие товара(ов)?

Все данные хранятся в 1С 8.1 УТ, есть там такой регистр "ТоварыВРознице", каждые день данные выгружаются в opencart, по сути в админке opencart ничего делать не приходится, только если включить/выключить какой-либо из модулей.

А так.. Ну нет слов - очень понравилось решение. Единственное что логотип - гм.. Видно, что кодер создавал =)

С логотипом история такая, заказали в какой-то дизайнерской конторе результат как обычно дают в CorelDraw, для веб-а ну никаких решений, пришлось самому в фотошопе как-то это дело приладить, ну не дизайнер я, программер :-)

Надіслати
Поділитися на інших сайтах


Интересует 1й модуль "Выгрузка данных из 1С 8.1 УТ - импорт в OpenCart".

На базе какого модуля это реализовано , т.е. штатная выгрузка в Bitrix из 1с или какой-то свой модуль?

Интересно было бы взглянуть на это решение.

Решение платное или бесплатное , будет ли демка ?

  • +1 1
Надіслати
Поділитися на інших сайтах


Интересует 1й модуль "Выгрузка данных из 1С 8.1 УТ - импорт в OpenCart".

На базе какого модуля это реализовано , т.е. штатная выгрузка в Bitrix из 1с или какой-то свой модуль?

Интересно было бы взглянуть на это решение.

Решение платное или бесплатное , будет ли демка ?

Выгрузка самописная, формат данных самый примитивный - список полей через разделитель. Отказался от использования XML, т.к. объем данных очень большой.

Могу описать саму идею, опубликую часть кода для понимания.

Законченность модуль еще не имеет, постоянно что-то исправляю, дополняю. В планах в 1С сделать привязку к плану обмена, чтоб не все скопом выгружалось, а только то что было изменено в процессе работы в 1С (сейчас выгружается все). В opencart опять же в планах довести до автоматической загрузки данных. Пока что приходится указывать, где хранится файл с данными, фотки выгружаются из 1С в определенную папку, описания тоже в отдельную папку.

Демку могу подготовить, если кого заинтересует можно уже и поговорить отдельно.

Надіслати
Поділитися на інших сайтах


Могу описать саму идею, опубликую часть кода для понимания.

Да интересно в плане понимания технологии.

Законченность модуль еще не имеет, постоянно что-то исправляю, дополняю. В планах в 1С сделать привязку к плану обмена, чтоб не все скопом выгружалось, а только то что было изменено в процессе работы в 1С (сейчас выгружается все). В opencart опять же в планах довести до автоматической загрузки данных. Пока что приходится указывать, где хранится файл с данными, фотки выгружаются из 1С в определенную папку, описания тоже в отдельную папку.

Демку могу подготовить, если кого заинтересует можно уже и поговорить отдельно.

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

Демку интересно можно было посмотреть.

  • +1 1
Надіслати
Поділитися на інших сайтах


Да интересно в плане понимания технологии.

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

Демку интересно можно было посмотреть.

Для демки нужно какое-то время, обязательно подготовлю.

Расскажу технологию.

Начнем с того, что договоримся, что все данные создаются в 1C, OpenCart служит только движком для отображения этих данных, администрирование товаров в OpenCart категорически не желательно.

Данные в 1С и OpenCart надо как-то синхронизировать по какому-то единому ключу. В OpenCart уникальный ключ это product_id, но т.к. данные изначально берутся из 1С, то ключ для синхронизации должен браться из него. Как вариант это может быть код справочника, плюс этого варианта - компактность, как правило длина кода 8-10 символов, минус - при удалении элемента справочника из 1С, эту же операцию мы не сможем проделать в OpenCart, результатом будет накопление в базе ненужных данных, которые должны быть удалены. Поэтому единственно правильным решением - это использовать GUID. Плюсов в использовании глобального уникального id в том, что во-первых можно изменять любые данные в справочниках, включая код и это никак не повлияет на искажение или неразбериху в базе OpenCart, во-вторых при удалении элемента справочника в 1С (обязательное использование плана обмена), мы точно так же сможем удалить этот элемент и в OpenCart, минус - в избыточности, длина GUID - 36 символов.

Перейдем к формату данных для обмена.

Отказываемся от использования XML, за его прожорливость. Все очень просто, пишем в текстовый файл построчно, одна запись - одна строка, поля отделяем разделителем, как правило это запятая (,), строки заключаем в кавычки ("), числа нет. В PHP есть функция fgetcsv(), которую мы и будем использовать для загрузки.

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

В один файл будем писать данные по нескольким таблицам, для этого будем включать строку с ключевой фразой, например, для товаров - Products, для производителей - Manufacturers.

Важна последовательность размещения таблиц, т.е. данные в которые включены ссылки на другие таблицы, должны идти позже. У меня эта последовательность такая НоменклатурныеГрупп (в opencart категории),ЗаводыИзготовители, ВидыХарактеристик, Номенклатура, ХарактеристикиНоменклатуры, ну и так далее.

Вот пример записи из 1С данных по товарам:

//...
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Количество() > 0 Тогда
	Файл.ЗаписатьСтроку("Products");
	Пока Выборка.Следующий() Цикл
		GUID = Выборка.Ссылка.УникальныйИдентификатор();
		//...
		Файл.ЗаписатьСтроку("""" + GUID + """,""" + Наименование + """,""" + Код + """,""" + ИмяКартинки + """,""" + GUID_ЗаводИзготовитель + """,""" + GUID_НоменклатурнаяГруппа + """,""" + GUID_ВидХарактеристикиНоменклатуры + """,""" + ДатаДоступности + """," + Статус + "," + Цена + "," + Остаток + "," + СтатусЗапаса);
	КонецЦикла;
КонецЕсли;

Загрузка в OpenCart.

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

Например, для таблицы товаров:

CREATE TABLE IF NOT EXISTS `oc_1c_product` (
  `guid` varchar(36) COLLATE ascii_general_ci NOT NULL,
  `product_id` int(11) NOT NULL,
  PRIMARY KEY (`guid`),
  KEY `product_id` (`product_id`)
) ENGINE=MyISAM  DEFAULT CHARSET=ascii COLLATE=ascii_general_ci;

Вот пример функции для получения данных по товару по имеющемуся у нас GUID:

function getProductByGuid($guid) {
    $data = false;
    $result = $this->db->query("SELECT p.*, pd.* FROM " . DB_PREFIX . "1c_product cp
					LEFT JOIN " . DB_PREFIX . "product p ON (cp.product_id = p.product_id)
					LEFT JOIN " . DB_PREFIX . "product_description pd ON (p.product_id = pd.product_id)
				WHERE cp.guid = '" . $this->db->escape($guid) . "' AND pd.language_id = '" . (int)$this->language_id . "'");
		if ($result->num_rows > 0) {
			$data = $result->row;
		}

    return $data; 
}
Надіслати
Поділитися на інших сайтах


Спасибо за информацию.

При загрузке в OpenCart каким-то образом учитывается время выполнения скрипта у хостера т.е. загрузка партиями при большом объеме номенклатуры?

  • +1 1
Надіслати
Поділитися на інших сайтах


Спасибо за информацию.

При загрузке в OpenCart каким-то образом учитывается время выполнения скрипта у хостера т.е. загрузка партиями при большом объеме номенклатуры?

В принципе файл можно делить на части, но т.к. у меня надобности такой не возникало, одно из решений, которое я использую:

ini_set('max_execution_time', 7200);
ini_set("memory_limit","256M");

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

$file_log = DIR_LOGS . 'data1c.log';

$num_log = 0;
if (file_exists($file_log)) {
	list($packet_log, $num_log) = explode(' ', file_get_contents($file_log));
	if ($packet_log != $packet) {
		$num_log = 0;
	}
}
// ...
$num = 0;
while (($data = fgetcsv($file_data, 4096, ",")) !== false) {
	$num++;
	if ($num_log > $num) continue;
// ...
	file_put_contents($file_log, $packet . ' ' . $num);
}
if (file_exists($file_log)) {
	unlink($file_log);
}
Надіслати
Поділитися на інших сайтах


  • 2 weeks later...

Добрый день.

Очень интересует - "- Выгрузка данных из 1С 8.1 УТ - импорт в OpenCart", будет ли эта наработка продаваться с Вашей стороны? Или возможно выложится тут?

Спасибо

*<!-- Мысли -->*

Вот бы еще импорт картинок был... а то так надоело руками их добавлять

Надіслати
Поділитися на інших сайтах


Очень интересует - "- Выгрузка данных из 1С 8.1 УТ - импорт в OpenCart", будет ли эта наработка продаваться с Вашей стороны? Или возможно выложится тут?

Планирую сделать демку, если кого-то заинтересует, могу на платной основе доработать для клиента, т.к. как правило, у всех свои конфигурации 1С, отличающиеся от типовой.

Вот бы еще импорт картинок был... а то так надоело руками их добавлять

Это реализовано, включая дополнительные картинки, в 1С - это все остальные картинки, которые лежат в "ХранилищеДополнительнойИнформации" привязанные к номенклатуре, но не являются основным изображением.

Вот пример, http://biosfera.kz/index.php?route=product/product&product_id=1292

Так это выглядит в 1С.

post-11467-0-09000900-1315806968_thumb.jpg

Надіслати
Поділитися на інших сайтах


  • 1 year later...
  • 4 weeks later...

Створіть аккаунт або увійдіть для коментування

Ви повинні бути користувачем, щоб залишити коментар

Створити обліковий запис

Зареєструйтеся для отримання облікового запису. Це просто!

Зареєструвати аккаунт

Вхід

Уже зареєстровані? Увійдіть тут.

Вхід зараз
  • Зараз на сторінці   0 користувачів

    • Ні користувачів, які переглядиють цю сторінку
×
×
  • Створити...

Important Information

На нашому сайті використовуються файли cookie і відбувається обробка деяких персональних даних користувачів, щоб поліпшити користувальницький інтерфейс. Щоб дізнатися для чого і які персональні дані ми обробляємо перейдіть за посиланням . Якщо Ви натиснете «Я даю згоду», це означає, що Ви розумієте і приймаєте всі умови, зазначені в цьому Повідомленні про конфіденційність.