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

Модуль Модуль обмена для opencart v2.3 по стандарту CommerceML [Поддержка]


Recommended Posts

В 08.07.2019 в 02:13, gladky сказал:

Есть такая проблема периодически не загружает остатки, в логе МойСклад записи.

2019.06.26 21:34:11 Остатки: Получен ответ на запрос. Отправлен каталог товаров. Отправлены остатки. Выгружено 11234 товара.

2019.06.26 20:31:38 Остатки: Получен ответ на запрос. Отправлен каталог товаров. Отправлены остатки. В интернет магазине произошла ошибка во время сеанса отправки остатков: failure ERROR: 3001.

2019.06.26 19:29:16 Остатки: Получен ответ на запрос. Отправлен каталог товаров. Отправлены остатки. Выгружено 11234 товара.

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

  • очистка папки cache/exchange1c во время загрузки. Может быть во время параллельных одновременных обменов с сайтом.
  • не закачался файл
  • не распаковался архив, так как недокачались все части. Либо во время закачки частей произошла очистка кэша

Проверьте настройки 1С у вас настроен там один обмен?

Если несколько обменов товарами, сделайте так чтобы одновременно не выполнялись более одного обмена.

Змінено користувачем Kirillove
Надіслати
Поділитися на інших сайтах

С мультиязычной загрузкой вопрос встал...

У всех по разному реализовано, необходимо в XML применить один стандарт..

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

и далее элементы должны быть снабжены атрибутами lang, например: <Наименование lang="ru">Для ноутбуков</Наименование>

Пока мне такая идея пришла в голову.

 

В общем такое решение проанализировал и понял что оно самое подходящее, и решил его включить в версию 2.0

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

Змінено користувачем Kirillove
Надіслати
Поділитися на інших сайтах

Вопрос возник. Как можно доработать модуль для работы со складами?

Что-то вроде загрузки в свойства. Хочу свойством выводить адрес магазин. Но как мне туда заливать данные по остаткам?

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

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


22 часа назад, zack сказал:

Вопрос возник. Как можно доработать модуль для работы со складами?

Что-то вроде загрузки в свойства. Хочу свойством выводить адрес магазин. Но как мне туда заливать данные по остаткам?

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

Самое главное чтобы 1С поддерживала такую загрузку, у Вас какая конфигурация 1С?

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

Здравствуйте. Имеются товары с опциями, где каждая опция имеет свой остаток. С помощью этого модуля возможно брать опции с 1с вместе со своими остатками? Если в 1с нет возможности указать остаток для опций, то при дописании такой функции, можно будет настроить данный модуль под него. Готов рассмотреть платную доработку

Змінено користувачем Zelimkhan
Надіслати
Поділитися на інших сайтах


В 04.08.2019 в 19:58, Kirillove сказал:

Самое главное чтобы 1С поддерживала такую загрузку, у Вас какая конфигурация 1С?

 УНФ. Если надо - могу модуль битрикса прикрутить

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


В 24.07.2019 в 03:30, Kirillove сказал:

Исправление в 1.6.4.7 (SEO генерация по кнопке) 

файл /admin/model/extension/exchange1c.php

Данная статья будет продублирована в разделе исправление ошибок версии 1.6.4.7 на офсайте

  Показать контент


	/**
	 * ver 5
	 * update 2019-07-24
	 * Генерит SEO переменные шаблона для товара
	 */
	public function seoGenerate() {

        $now = date('Y-m-d H:i:s');
		$result = array(
			'error'			=> '',
			'product'		=> 0,
			'category'		=> 0,
			'manufacturer'	=> 0
		);

		if (empty($this->TAB_FIELDS)) {
			$this->TAB_FIELDS = $this->defineTableFields();
		}

		$language_id = $this->getLanguageId($this->config->get('config_language'));

		if ($this->config->get('exchange1c_seo_product_mode') != 'disable') {
			// Выбрать все товары, нужны поля:
			// name, sku, model, manufacturer_id, description, product_id, category_id
			$no_update_description = array();

			if (isset($this->TAB_FIELDS['product_description']['meta_h1'])) {
				$sql = "SELECT
					p.product_id,
					p.sku,
					p.model,
					p.manufacturer_id,
					pd.name,
					pd.tag,
					pd.meta_title,
					pd.meta_description,
					pd.meta_keyword,
					pd.meta_h1
					FROM `" . DB_PREFIX . "product` p
					LEFT JOIN `" . DB_PREFIX . "product_description` pd ON (p.product_id = pd.product_id)
					WHERE pd.language_id = " . $language_id;
			} else {
				$sql = "SELECT
					p.product_id,
					p.sku,
					p.model,
					p.manufacturer_id,
					pd.name,
					pd.tag,
					pd.meta_title,
					pd.meta_description,
					pd.meta_keyword
					FROM `" . DB_PREFIX . "product` p
					LEFT JOIN `" . DB_PREFIX . "product_description` pd ON (p.product_id = pd.product_id)
					WHERE pd.language_id = " . $language_id;
				array_push($no_update_description, 'meta_h1');
			}

			$query = $this->query($sql);
			if ($query->num_rows) {
				foreach ($query->rows as $data) {

					$this->log($data, 2);
					$result['product']++;
	 				$data_old = $data;
	 				if ($this->config->get('exchange1c_seo_product_mode') != 'disable')
						$update = $this->seoGenerateProduct($data['product_id'], $data);
						$this->log($update, 2);

					if (!$update) {
						$this->log("Нечего обновлять!", 2);
						continue;
					}

					// Сравнение
					$update_fields = $this->compareArraysData($update, $data_old);

					// Если есть что обновлять
					if ($update_fields) {
						$sql_set = $this->prepareQuery($update_fields, 'set');
						$this->query(
							"UPDATE `" . DB_PREFIX . "product_description`
							SET " . $sql_set . "
							WHERE `product_id` = " . (int)$data['product_id'] . "
							AND `language_id` = " . $language_id
						);
					}
				}
			}
		}

		// Категории

		if ($this->config->get('exchange1c_seo_category_mode') != 'disable') {
			// Выбрать все категории, нужны поля:
			// name, sku, model, manufacturer_id, description, product_id, category_id
			$no_update_description = array();
			if (isset($this->TAB_FIELDS['category_description']['meta_h1'])) {
				$sql = "SELECT c.category_id, cd.name, cd.meta_title, cd.meta_description, cd.meta_keyword, cd.meta_h1
					FROM `" . DB_PREFIX . "category` c
					LEFT JOIN `" . DB_PREFIX . "category_description` cd ON (c.category_id = cd.category_id)
					WHERE cd.language_id = " . $language_id;
			} else {
				$sql = "SELECT c.category_id, cd.name, cd.meta_title, cd.meta_description, cd.meta_keyword
					FROM `" . DB_PREFIX . "category` c
					LEFT JOIN `" . DB_PREFIX . "category_description` cd
					ON (c.category_id = cd.category_id)
					WHERE cd.language_id = " . $language_id;
				array_push($no_update_description, 'meta_h1');
			}

			$query = $this->query($sql);
			if ($query->num_rows) {
				foreach ($query->rows as $data) {

					$result['category']++;
					if ($this->config->get('exchange1c_seo_category_mode') != 'disable')
						$this->seoGenerateCategory($data['category_id'], $data);

					// Сравнение
					$update_fields = $this->compareArraysData($data_old, $data, $no_update_description);

					// Если есть что обновлять
					if ($update_fields) {
						$sql_set = $this->prepareQuery($update_fields, 'set');
						$this->query(
							"UPDATE `" . DB_PREFIX . "category_description`
							SET " . $sql_set . "
							WHERE `category_id` = " . (int)$data['category_id'] . "
							AND `language_id` = " . $language_id
						);
						$this->query(
							"UPDATE `" . DB_PREFIX . "category`
							SET `date_modified` = '" . $now . "'
							WHERE `category_id` = " . (int)$data['category_id']
						);
					}
				}
			}
		}

		// Производители

		if ($this->config->get('exchange1c_seo_manufacturer_mode') != 'disable') {
			if (isset($this->TAB_FIELDS['manufacturer_description'])) {
				// Выбрать все категории, нужны поля:
				// name, sku, model, manufacturer_id, description, product_id, category_id
				$no_update_description = array();
				if (isset($this->TAB_FIELDS['manufacturer_description']['meta_h1'])) {
					$sql = "SELECT m.manufacturer_id, md.name, md.meta_title, md.meta_description, md.meta_keyword, md.meta_h1
						FROM `" . DB_PREFIX . "manufacturer` m
						LEFT JOIN `" . DB_PREFIX . "manufacturer_description` md
						ON (m.manufacturer_id = md.manufacturer_id)
						WHERE md.language_id = " . $language_id;
				} else {
					$sql = "SELECT m.manufacturer_id, md.name, md.meta_title, md.meta_description, md.meta_keyword
						FROM `" . DB_PREFIX . "manufacturer` m
						LEFT JOIN `" . DB_PREFIX . "manufacturer_description` md ON (m.manufacturer_id = md.manufacturer_id)
						WHERE md.language_id = " . $language_id;
					array_push($no_update_description, 'meta_h1');
				}

				$query = $this->query($sql);
				if ($query->num_rows) {
					foreach ($query->rows as $data) {

						$result['manufacturer']++;

						$data_old = $data;

						if ($this->config->get('exchange1c_seo_manufacturer_mode') != 'disable')
							$update = $this->seoGenerateManufacturer($data['manufacturer_id'], $data);

						if (!$update)
							continue;

						// Сравнение
						$update_fields = $this->compareArraysData($data_old, $data, $no_update_description);

						// Если есть что обновлять
						if ($update_fields) {
							$sql_set = $this->prepareQuery($update_fields, 'set');
							$this->query(
								"UPDATE `" . DB_PREFIX . "category_description` SET " . $sql_set . "
								WHERE `category_id` = " . (int)$data['category_id'] . "
								AND `language_id` = " . $language_id
							);
							$this->query(
								"UPDATE `" . DB_PREFIX . "category`
								SET `date_modified` = '" . $now . "'
								WHERE `category_id` = " . (int)$data['category_id']
							);
						}
					}
				}

			}
		}
		return $result;

	} // seoGenerate()

 

 

Не вдаваясь в подробности, это не работает. Разбирать почему - нет ни сил, ни желания.

 

Может быть кому-то пригодится мой рабочий вариант (+прямое добавление цены в паттерны, что неправильно, но меня устраивает, как добавить - писал ранее):

Спойлер

	/**
	 * ver 5
	 * update 2018-06-14
	 * Генерит SEO переменные шаблона для товара
	 * С версии 4 функция теперь не читает данные из базы
	 */
	private function seoGenerateProduct($product_id, $data) {

		$result = array();
   		// Определение дополнительных полей
		$this->TAB_FIELDS = $this->config->get('exchange1c_table_fields');
		// Товары, Категории
		$seo_fields = array();
		if (isset($this->TAB_FIELDS['product_description']['meta_title'])) {
			$seo_fields[] = 'meta_title';
		}
		if (isset($this->TAB_FIELDS['product_description']['meta_description'])) {
			$seo_fields[] = 'meta_description';
		}
		if (isset($this->TAB_FIELDS['product_description']['meta_keyword'])) {
			$seo_fields[] = 'meta_keyword';
		}
		//$this->log($this->TAB_FIELDS, 2);

		$data['price'] = strtok((float)$data['price'], '.');

		// Сопоставляем значения к паттернам
		$tags = array(
			'{name}'		=> isset($data['name']) 			? $data['name']					: '',
			'{sku}'			=> isset($data['sku'])				? $data['sku']					: '',
			'{model}'		=> isset($data['model'])			? $data['model']				: '',
			'{price}'		=> isset($data['price'])			? $data['price']				: '',
			'{brand}'		=> isset($data['manufacturer'])		? $data['manufacturer']['name'] : '',
			'{cats}'		=> $this->getProductCategoriesString($product_id),
			'{prod_id}'		=> isset($product_id)				? $product_id					: '',
			'{cat_id}'		=> isset($data['category_id'])		? $data['category_id']			: ''
		);
		if (isset($this->TAB_FIELDS['product_description']['meta_h1'])) {
			$seo_fields[] = 'meta_h1';
		}

		// Формируем массив с замененными значениями
		foreach ($seo_fields as $field) {
			$template = '';

			if ($this->config->get('exchange1c_seo_product_'.$field) == 'template') {
				$template = $this->config->get('exchange1c_seo_product_'.$field.'_template');

				// Если выбран шаблон, но он пустой, пропускаем
				if (!$template) {
					$this->log("Шаблон пустой - пропускаем");
					continue;
				}

				if ($this->config->get('exchange1c_seo_product_mode') == 'overwrite') {
					// Перезаписывать

					if ($field == 'meta_keyword' || $field == 'tag') {
						$value = $this->seoGenerateString($template, $tags, false, true);
					} else {
						$value = $this->seoGenerateString($template, $tags);
					}

					// Если вдруг по каким-либо причинам это поле отсутствует, будем считать что оно есть, но пустое
					// Вот тут может быть когда-либо ошибка...
					if (!isset($data[$field])) {
						$data[$field] = "";
					}

					// Если поле не изменилось, нет смысла его перезаписывать
					if ($value == $data[$field]) {
						$this->log("Поле '" . $field . "' не изменилось: " . $data[$field], 2);
						continue;
					}

					// Нужно обновить поле
					$this->log("Поле: '" . $field . "' старое: '" . $data[$field] . "', новое: '" . $value . "'", 2);
					$result[$field] = $value;

				} else {
					// Только если поле пустое
					if (empty($data[$field])) {
						$value = $this->seoGenerateString($template, $tags);
						$this->log("Поле: '" . $field . "' старое: '" . $data[$field] . "', новое: '" . $value . "'", 2);
						$result[$field] = $value;
					} else {
						$this->log("Пропускаем '" . $field . "', т.к. не пустое: '" . $data[$field] . "'", 2);
					}
				}
			} else {
				$this->log("Шаблон для поля '" . $field . "' не найден!");
				continue;
			}
		}

		if ($this->config->get('exchange1c_seo_product_seo_url') == 'template') {
			// Сформируем SEO URL
			$template = $this->config->get('exchange1c_seo_product_seo_url_template');
			$keyword = $this->seoGenerateString($template, $tags, true);

			// Получим старый SeoUrl
			$seo_url = $this->getSeoUrl("product_id", $product_id);

			// обновляем если только были изменения
			if ($this->config->get('exchange1c_seo_product_mode') == 'overwrite' || ($this->config->get('exchange1c_seo_product_mode') == 'if_empty' && empty($seo_url['keyword']))) {
				if ($seo_url['keyword'] != $keyword) {
					$this->setSeoURL('product_id', $product_id, $keyword, $seo_url);
				}
			}
		}

		$this->log("SEO товара обновлено полей: " . count($result));
		return $result;

	} // seoGenerateProduct()


	/**
	 * ver 6
	 * update 2018-06-14
	 * Генерит SEO переменные шаблона для категории
	 */
	private function seoGenerateCategory($category_id, &$data) {

		$seo_fields = array(
			'meta_title',
			'meta_description',
			'meta_keyword'
		);
		if (isset($this->TAB_FIELDS['category_description']['meta_h1'])) {
			$seo_fields[] = 'meta_h1';
		}

		// Сопоставляем значения к паттернам
		$tags = array(
			'{cat}'			=> isset($data['name']) 		? $data['name'] 		: '',
			'{cat_id}'		=> $category_id
		);

		// Формируем массив с замененными значениями
		foreach ($seo_fields as $field) {

			if (!isset($data[$field])) {
				$data[$field] = "";
			}

			if ($this->config->get('exchange1c_seo_category_'.$field) == 'template') {
				// Если включено формирование по шаблону

				$template = $this->config->get('exchange1c_seo_category_'.$field.'_template');

				// Если выбран шаблон, но он пустой, пропускаем
				if (!$template) {
					unset($data[$field]);
					continue;
				}

				if ($this->config->get('exchange1c_seo_category_mode') == 'overwrite') {
					// Перезаписывать

					$value = $this->seoGenerateString($template, $tags);

					// Если поле не изменилось, нет смысла его перезаписывать
					if ($value == $data[$field]) {
						$this->log("Поле '" . $field . "' не изменилось: " . $data[$field], 2);
						unset($data[$field]);
						continue;
					}

					// Нужно обновить поле
					$this->log("Поле: '" . $field . "' старое: '" . $data[$field] . "', новое: '" . $value . "', шаблон: " . $template, 2);
					$data[$field] = $value;

				} elseif ($this->config->get('exchange1c_seo_category_mode') == 'if_empty' && empty($data[$field])) {
					// Только если поле пустое

					$value = $this->seoGenerateString($template, $tags);
					$this->log("Поле: '" . $field . "' старое: '" . $data[$field] . "', новое: '" . $value . "'", 2);
					$data[$field] = $value;

				} else {
					unset($data[$field]);
				}

			} else {

				// Не изменяем это поле
				unset($data[$field]);
				continue;
			}
		} // foreach

		if ($this->config->get('exchange1c_seo_category_seo_url') == 'template') {
			// Сформируем SEO URL
			$template = $this->config->get('exchange1c_seo_category_seo_url_template');
			$keyword = $this->seoGenerateString($template, $tags, true);

			// Получим старый SeoUrl
			$seo_url = $this->getSeoUrl("category_id", $category_id);

			// обновляем если только были изменения
			if ($this->config->get('exchange1c_seo_category_mode') == 'overwrite' || ($this->config->get('exchange1c_seo_category_mode') == 'if_empty' && empty($seo_url['keyword']))) {
				if ($seo_url['keyword'] != $keyword) {
					$this->setSeoURL('category_id', $category_id, $keyword, $seo_url);
				}
			}
		}

		$this->log("Сформировано SEO для категории");

	} // seoGenerateCategory()


	/**
	 * ver 10
	 * update 2018-06-14
	 * Генерит SEO переменные шаблона для производетеля
	 */
	private function seoGenerateManufacturer($manufacturer_id, &$data) {

		if (!isset($this->TAB_FIELDS['manufacturer_description'])) {
			$this->log("В базе отсутствует таблица manufacturer_description, SEO не будет сформировано");
			return false;
		}

		$seo_fields = array();

		if (isset($this->TAB_FIELDS['manufacturer_description'])) {
			if (isset($this->TAB_FIELDS['manufacturer_description']['meta_h1'])) {
				$seo_fields[] = 'meta_h1';
			}
			if (isset($this->TAB_FIELDS['manufacturer_description']['meta_title'])) {
				$seo_fields[] = 'meta_title';
			}
			if (isset($this->TAB_FIELDS['manufacturer_description']['meta_description'])) {
				$seo_fields[] = 'meta_description';
			}
			if (isset($this->TAB_FIELDS['manufacturer_description']['meta_keyword'])) {
				$seo_fields[] = 'meta_keyword';
			}

			// Получим поля для сравнения
			$fields	= implode($seo_fields,', ');

			$query = $this->query("SELECT " . $fields . " FROM `" . DB_PREFIX . "manufacturer_description` WHERE `manufacturer_id` = " . (int)$manufacturer_id . " AND `language_id` = " . $this->LANG_ID);
			foreach ($seo_fields as $field) {
				$data[$field] = isset($query->row[$field]) ?  $query->row[$field] : "";
			}
		}

		// Сопоставляем значения к тегам
		$tags = array(
			'{brand}'		=> isset($data['name']) 			? $data['name'] 			: '',
			'{brand_id}'	=> (string)$manufacturer_id
		);

		$update = false;
		// Формируем массив с замененными значениями
		foreach ($seo_fields as $field) {
			$template = '';
			if ($this->config->get('exchange1c_seo_manufacturer_' . $field) == 'template') {
				$template = $this->config->get('exchange1c_seo_manufacturer_' . $field . '_template');

				if (!$template) {
					unset($data[$field]);
					continue;
				}

				if ($this->config->get('exchange1c_seo_manufacturer_mode') == 'overwrite') {

					// Перезаписывать
					$value = $this->seoGenerateString($template, $tags);

					// Если поле не изменилось, нет смысла его перезаписывать
					if ($value == $data[$field]) {
						$this->log("Поле '" . $field . "' не изменилось: " . $data[$field], 2);
						unset($data[$field]);
						continue;
					}

					// Нужно обновить поле
					$this->log("Поле: '" . $field . "' старое: '" . $data[$field] . "', новое: '" . $value . "'", 2);
					$data[$field] = $value;
					$update = true;

				} else {
					// Только если поле пустое
					if (empty($data[$field])) {
						$value = $this->seoGenerateString($template, $tags);
						$this->log("Поле: '" . $field . "' старое: '" . $data[$field] . "', новое: '" . $value . "'", 2);
						$data[$field] = $value;
						$update = true;
					} else {
						$this->log("Пропускаем '" . $field . "', т.к. не пустое: '" . $data[$field] . "'", 2);
						unset($data[$field]);
					}
				}

			} else {

				// Не изменяем это поле
				unset($data[$field]);
				continue;
			}

		}

		if ($this->config->get('exchange1c_seo_manufacturer_seo_url') == 'template') {
			// Сформируем SEO URL
			$template = $this->config->get('exchange1c_seo_manufacturer_seo_url_template');
			$keyword = $this->seoGenerateString($template, $tags, true);

			// Получим старый SeoUrl
			$seo_url = $this->getSeoUrl("manufacturer_id", $manufacturer_id);

			// обновляем если только были изменения
			if ($this->config->get('exchange1c_seo_manufacturer_mode') == 'overwrite' || ($this->config->get('exchange1c_seo_manufacturer_mode') == 'if_empty' && empty($seo_url['keyword']))) {
				if ($seo_url['keyword'] != $keyword) {
					$this->setSeoURL('manufacturer_id', $manufacturer_id, $keyword, $seo_url);
				}
			}
		}

		$this->log("Сформировано SEO для производителя");

	} // seoGenerateManufacturer()


	/**
	 * ver 4
	 * update 2018-06-14
	 * Генерит SEO переменные шаблона для товара
	 */
	public function seoGenerate() {

        $now = date('Y-m-d H:i:s');
		$result = array(
			'error'			=> '',
			'product'		=> 0,
			'category'		=> 0,
			'manufacturer'	=> 0
		);

		$language_id = $this->getLanguageId($this->config->get('config_language'));

		if ($this->config->get('exchange1c_seo_product_mode') != 'disable') {
			// Выбрать все товары, нужны поля:
			// name, sku, model, manufacturer_id, description, product_id, category_id
			$no_update_description = array();
			if (isset($this->TAB_FIELDS['product_description']['meta_h1'])) {
				$sql = "SELECT `p`.`product_id`, `p`.`sku`, `p`.`model`, `p`.`price`, `p`.`manufacturer_id`, `pd`.`name`, `pd`.`tag`, `pd`.`meta_title`, `pd`.`meta_description`, `pd`.`meta_keyword`, `pd`.`meta_h1` FROM `" . DB_PREFIX . "product` `p` LEFT JOIN `" . DB_PREFIX . "product_description` `pd` ON (`p`.`product_id` = `pd`.`product_id`) WHERE `pd.`language_id` = " . $language_id;
			} else {
				$sql = "SELECT `p`.`product_id`, `p`.`sku`, `p`.`model`, `p`.`price`, `p`.`manufacturer_id`, `pd`.`name`, `pd`.`tag`, `pd`.`meta_title`, `pd`.`meta_description`, `pd`.`meta_keyword` FROM `" . DB_PREFIX . "product` `p` LEFT JOIN `" . DB_PREFIX . "product_description` `pd` ON (`p`.`product_id` = `pd`.`product_id`) WHERE `pd`.`language_id` = " . $language_id;
				array_push($no_update_description, 'meta_h1');
			}

			$query = $this->query($sql);
			if ($query->num_rows) {
				foreach ($query->rows as $data) {

					$result['product']++;

	 				if ($this->config->get('exchange1c_seo_product_mode') != 'disable')
						$update = $this->seoGenerateProduct($data['product_id'], $data);

					if (!$update)
						continue;

					// Сравнение
					$no_update = array('sku','model','manufacturer_id');
					$update_fields = $this->compareArraysData($update, $data, $no_update);

					// Если есть что обновлять
					if ($update_fields) {
						$sql_set = $this->prepareQuery($update_fields, 'set');
						$this->query("UPDATE `" . DB_PREFIX . "product` SET " . $sql_set . ", `date_modified` = '" . $now . "' WHERE `product_id` = " . (int)$data['product_id']);
					}

					// Сравнение
					$update_fields = $this->compareArraysData($update, $data, $no_update_description);

					// Если есть что обновлять
					if ($update_fields) {
						$sql_set = $this->prepareQuery($update_fields, 'set');
						$this->query("UPDATE `" . DB_PREFIX . "product_description` SET " . $sql_set . " WHERE `product_id` = " . (int)$data['product_id'] . " AND `language_id` = " . $language_id);
					}
				}
			}
		}

		// Категории

		if ($this->config->get('exchange1c_seo_category_mode') != 'disable') {
			// Выбрать все категории, нужны поля:
			// name, sku, model, manufacturer_id, description, product_id, category_id
			$no_update_description = array();
			if (isset($this->TAB_FIELDS['category_description']['meta_h1'])) {
				$sql = "SELECT `c`.`category_id`, `cd`.`name`, `cd`.`meta_title`, `cd`.`meta_description`, `cd`.`meta_keyword`, `cd`.`meta_h1` FROM `" . DB_PREFIX . "category` `c` LEFT JOIN `" . DB_PREFIX . "category_description` `cd` ON (`c`.`category_id` = `cd`.`category_id`) WHERE `cd`.`language_id` = " . $language_id;
			} else {
				$sql = "SELECT `c`.`category_id`, `cd`.`name`, `cd`.`meta_title`, `cd`.`meta_description`, `cd`.`meta_keyword` FROM `" . DB_PREFIX . "category` `c` LEFT JOIN `" . DB_PREFIX . "category_description` `cd` ON (`c`.`category_id` = `cd`.`category_id`) WHERE `cd`.`language_id` = " . $language_id;
				array_push($no_update_description, 'meta_h1');
			}

			$query = $this->query($sql);
			if ($query->num_rows) {
				foreach ($query->rows as $data) {

					$result['category']++;
					$data_old = $data;
					if ($this->config->get('exchange1c_seo_category_mode') != 'disable')
						$this->seoGenerateCategory($data['category_id'], $data);

					// Сравнение
					$update_fields = $this->compareArraysData($data, $data_old, $no_update_description);

					// Если есть что обновлять
					if ($update_fields) {
						$sql_set = $this->prepareQuery($update_fields, 'set');
						$this->query("UPDATE `" . DB_PREFIX . "category_description` SET " . $sql_set . " WHERE `category_id` = " . (int)$data['category_id'] . " AND `language_id` = " . $language_id);
						$this->query("UPDATE `" . DB_PREFIX . "category` SET `date_modified` = '" . $now . "' WHERE `category_id` = " . (int)$data['category_id']);
					}
				}
			}
		}

		// Производители
		if ($this->config->get('exchange1c_seo_manufacturer_mode') != 'disable') {

			if (isset($this->TAB_FIELDS['manufacturer_description']['meta_h1'])) {

				// Выбрать все категории, нужны поля:
				// name, sku, model, manufacturer_id, description, product_id, category_id
				$no_update_description = array();
				if (isset($this->TAB_FIELDS['manufacturer_description']['meta_h1'])) {
					$sql = "SELECT `m`.`manufacturer_id`, `m`.`name`, `md`.`meta_title`, `md`.`meta_description`, `md`.`meta_keyword`, `md`.`meta_h1` FROM `" . DB_PREFIX . "manufacturer` `m` LEFT JOIN `" . DB_PREFIX . "manufacturer_description` `md` ON (`m`.`manufacturer_id` = `md`.`manufacturer_id`) WHERE `md`.`language_id` = " . $language_id;
				} else {
					$sql = "SELECT `m`.`manufacturer_id`, `m`.`name`, `md`.`meta_title`, `md`.`meta_description`, `md`.`meta_keyword` FROM `" . DB_PREFIX . "manufacturer` `m` LEFT JOIN `" . DB_PREFIX . "manufacturer_description` `md` ON (`m`.`manufacturer_id` = `md`.`manufacturer_id`) WHERE `md`.`language_id` = " . $language_id;
					array_push($no_update_description, 'meta_h1');
				}

				$query = $this->query($sql);
				if ($query->num_rows) {
					foreach ($query->rows as $data) {

						$result['manufacturer']++;
						$data_old = $data;
						if ($this->config->get('exchange1c_seo_manufacturer_mode') != 'disable')
							$this->seoGenerateManufacturer($data['manufacturer_id'], $data);

						$update_fields = $this->compareArraysData($data, $data_old, $no_update_description);

						// Если есть что обновлять
						if ($update_fields) {
							$this->log("Обновляю поля SEO для производителя.");
							$sql_set = $this->prepareQuery($update_fields, 'set');
							$this->query("UPDATE `" . DB_PREFIX . "manufacturer_description` SET " . $sql_set . " WHERE `manufacturer_id` = " . (int)$data['manufacturer_id'] . " AND `language_id` = " . $language_id);
							$this->query("UPDATE `" . DB_PREFIX . "manufacturer` SET `date_modified` = '" . $now . "' WHERE `manufacturer_id` = " . (int)$data['manufacturer_id']);
						}else{
							$this->log("Поля SEO для производителя не изменились.");
						}
					}
				}

			}
		}
		return $result;

	} // seoGenerate()

 

Расписыванием внесённых правок нет желания заниматься. Кто захочет - сравнит исходники.

Змінено користувачем herminator
Надіслати
Поділитися на інших сайтах


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

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


/catalog/controller/product/category.php

  Скрыть контент

				$this->data['products'][] = array(
					'product_id'  => $result['product_id'],
					'thumb'       => $image,
					'sku'         => $result['sku'],
					'mpn'         => $result['mpn'],
					'quantity'    => $result['quantity'],
					// получим остатки по складам
					'quantity_warehouse' =>  $this->model_catalog_product->getProductQuantity($result['product_id']),
					'discount'    => $discounts,
					'stock_status'=> $result['stock_status'],
					'name'        => $result['name'],
					'description' => utf8_substr(strip_tags(html_entity_decode($result['description'], ENT_QUOTES, 'UTF-8')), 0, 100) . '',
					'price'       => $price,
					'special'     => $special,
					'tax'         => $tax,
					'rating'      => $result['rating'],
					'reviews'     => sprintf($this->language->get('text_reviews'), (int)$result['reviews']),
					'href'        => $this->url->link('product/product', 'path=' . $this->request->get['path'] . '&product_id=' . $result['product_id'] . $url)
				);
			}

 

в шаблоне у меня выглядит так (в разных шаблонах по-разному, но смысл одинаковый)

  Скрыть контент

						<?php if (isset($product['quantity_warehouse'])) { ?>	
							<div>
								<?php $pq_style = $product['quantity'] ? ' style="color: #00AA00;"' : ' style="color: #FF0000;"'?>
								<?php foreach ($product['quantity_warehouse'] as $qw => $quantity_warehouse) { 
									if ($quantity_warehouse['quantity'] > 0) { ?> 
										<div><span<?php echo $pq_style ?> title="<?php echo 'Наличие на складе '.$quantity_warehouse['name'] ?>"> <?php echo 'Склад &quot'.$quantity_warehouse['name']. '&quot ' . $quantity_warehouse['quantity'] . ' шт'; ?></span></div>
									<?php } else {?>
										<div><span style="color: #FF0000;" title="Нет в наличии"><?php echo $product['stock_status']; ?></span></div>
									<?php } ?>
								<?php } ?>
							</div>
						<?php } ?>

 

теперь в карточке товара:

  Скрыть контент

/catalog/controller/product/product.php

меняем текст:


			if ($product_info['quantity'] <= 0) {
				$this->data['stock'] = $product_info['stock_status'];
			} elseif ($this->config->get('config_stock_display')) {
				$this->data['stock'] = $product_info['quantity'];
			} else {
				$this->data['stock'] = $this->language->get('text_instock');
			}

на


			if ($product_info['quantity'] <= 0) {
				$this->data['stock'] = $product_info['stock_status'];
			} elseif ($this->config->get('config_stock_display')) {
				$this->data['stock'] = $product_info['quantity'];
			} else {
				$this->data['stock'] = $this->language->get('text_instock');
			}
			$this->data['quantity_warehouse'] = $this->model_catalog_product->getProductQuantity($this->request->get['product_id']);


 

функция getProductQuantity() содержит следующие строки:

  Скрыть контент

	public function getProductQuantity($product_id) {
		$query = $this->db->query("SELECT * FROM " . DB_PREFIX . "product_quantity pq JOIN " . DB_PREFIX . "warehouse w ON (pq.warehouse_id = w.warehouse_id) WHERE pq.product_id = '" . (int)$product_id . "'");
		return $query->rows;
	}

 

 

Как такое реализовать на

Opencart 2.3.0.2

Версия модуля 1.6.4.5

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


В 09.08.2019 в 19:53, zack сказал:

/catalog/controller/product/category.php

  Скрыть контент


				$this->data['products'][] = array(
					'product_id'  => $result['product_id'],
					'thumb'       => $image,
					'sku'         => $result['sku'],
					'mpn'         => $result['mpn'],
					'quantity'    => $result['quantity'],
					// получим остатки по складам
					'quantity_warehouse' =>  $this->model_catalog_product->getProductQuantity($result['product_id']),
					'discount'    => $discounts,
					'stock_status'=> $result['stock_status'],
					'name'        => $result['name'],
					'description' => utf8_substr(strip_tags(html_entity_decode($result['description'], ENT_QUOTES, 'UTF-8')), 0, 100) . '',
					'price'       => $price,
					'special'     => $special,
					'tax'         => $tax,
					'rating'      => $result['rating'],
					'reviews'     => sprintf($this->language->get('text_reviews'), (int)$result['reviews']),
					'href'        => $this->url->link('product/product', 'path=' . $this->request->get['path'] . '&product_id=' . $result['product_id'] . $url)
				);
			}

 

в шаблоне у меня выглядит так (в разных шаблонах по-разному, но смысл одинаковый)

  Показать контент


						<?php if (isset($product['quantity_warehouse'])) { ?>	
							<div>
								<?php $pq_style = $product['quantity'] ? ' style="color: #00AA00;"' : ' style="color: #FF0000;"'?>
								<?php foreach ($product['quantity_warehouse'] as $qw => $quantity_warehouse) { 
									if ($quantity_warehouse['quantity'] > 0) { ?> 
										<div><span<?php echo $pq_style ?> title="<?php echo 'Наличие на складе '.$quantity_warehouse['name'] ?>"> <?php echo 'Склад &quot'.$quantity_warehouse['name']. '&quot ' . $quantity_warehouse['quantity'] . ' шт'; ?></span></div>
									<?php } else {?>
										<div><span style="color: #FF0000;" title="Нет в наличии"><?php echo $product['stock_status']; ?></span></div>
									<?php } ?>
								<?php } ?>
							</div>
						<?php } ?>

 

теперь в карточке товара:

  Показать контент

/catalog/controller/product/product.php

меняем текст:



			if ($product_info['quantity'] <= 0) {
				$this->data['stock'] = $product_info['stock_status'];
			} elseif ($this->config->get('config_stock_display')) {
				$this->data['stock'] = $product_info['quantity'];
			} else {
				$this->data['stock'] = $this->language->get('text_instock');
			}

на



			if ($product_info['quantity'] <= 0) {
				$this->data['stock'] = $product_info['stock_status'];
			} elseif ($this->config->get('config_stock_display')) {
				$this->data['stock'] = $product_info['quantity'];
			} else {
				$this->data['stock'] = $this->language->get('text_instock');
			}
			$this->data['quantity_warehouse'] = $this->model_catalog_product->getProductQuantity($this->request->get['product_id']);


 

функция getProductQuantity() содержит следующие строки:

  Скрыть контент


	public function getProductQuantity($product_id) {
		$query = $this->db->query("SELECT * FROM " . DB_PREFIX . "product_quantity pq JOIN " . DB_PREFIX . "warehouse w ON (pq.warehouse_id = w.warehouse_id) WHERE pq.product_id = '" . (int)$product_id . "'");
		return $query->rows;
	}

 

 

Как такое реализовать на

Opencart 2.3.0.2

Версия модуля 1.6.4.5

При добавлении данного кода - ошибка 500 на странице карточки товара. 
В логах ничего не появляется.

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


Добрый день! Версия ocStore 2.3.0.2.3 и модуль версия 1.6.4.7 ни как не хот\т видеть друг друга. 1с УТ 2.3 (это для Украины :) конфигурация), т.е. база не видит модуль, пишет ошибка пользователя и пароль неверный, что не в водили, хотя если ставить ниже версию модуля 1c_1.6.3.11, то и при пустых полях пользователя и пароля нормально работает. В чем может быть причина? В настройках модуля, где выбор платформы выбирали и УНФ, и УТ 11 и 10, все равно не хотят дружить :( Спасибо. (Модуль и более старой версии подходил бы, но есть некоторые косячки: в базе есть категории пустые, в которых нет товаров, а они на сайте все равно есть, не скрываются, например, а это важно!!!)

Screenshot_1.thumb.png.660b262e553c035363b9f7fbb7c27545.png

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


14 часов назад, Ryazanov сказал:

Добрый день! Версия ocStore 2.3.0.2.3 и модуль версия 1.6.4.7 ни как не хот\т видеть друг друга. 1с УТ 2.3 (это для Украины :) конфигурация), т.е. база не видит модуль, пишет ошибка пользователя и пароль неверный, что не в водили, хотя если ставить ниже версию модуля 1c_1.6.3.11, то и при пустых полях пользователя и пароля нормально работает. В чем может быть причина? В настройках модуля, где выбор платформы выбирали и УНФ, и УТ 11 и 10, все равно не хотят дружить :( Спасибо. (Модуль и более старой версии подходил бы, но есть некоторые косячки: в базе есть категории пустые, в которых нет товаров, а они на сайте все равно есть, не скрываются, например, а это важно!!!)

Screenshot_1.thumb.png.660b262e553c035363b9f7fbb7c27545.png

 

В файле .htaccess эту запись указывали?

RewriteRule .* - [E=REMOTE_USER:%{HTTP:Authorization},L]
Надіслати
Поділитися на інших сайтах


В 21.08.2019 в 07:35, marcus201832 сказал:

 

В файле .htaccess эту запись указывали?


RewriteRule .* - [E=REMOTE_USER:%{HTTP:Authorization},L]

Добрый день! Версия ocStore 2.3.0.2.3 и модуль версия 1.6.4.7 ни как не хот\т видеть друг друга. 1с УТ 2.3 (это для Украины :) конфигурация), т.е. база не видит модуль, пишет ошибка пользователя и пароль неверный, что не в водили, хотя если ставить ниже версию модуля 1c_1.6.3.11, то и при пустых полях пользователя и пароля нормально работает. В чем может быть причина? В настройках модуля, где выбор платформы выбирали и УНФ, и УТ 11 и 10, все равно не хотят дружить :( Спасибо. (Модуль и более старой версии подходил бы, но есть некоторые косячки: в базе есть категории пустые, в которых нет товаров, а они на сайте все равно есть, не скрываются, например, а это важно!!!)

В 21.08.2019 в 07:35, marcus201832 сказал:

 

В файле .htaccess эту запись указывали?


RewriteRule .* - [E=REMOTE_USER:%{HTTP:Authorization},L]

 

нет, а надо?

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


Добрый день, ни как не могу разобраться выгрузка товаров с категориями и ценами проходит отлично, но не загружаются заказы с сайта в 1С. В административной панели сайта в разделе загрузка не работает кнопка "Настройка видов доставки для экспорта в заказы в ТС", может в этом проблема скрин приложил с настройками загрузки. 1С конфигурация УНФ 1.6, opencart 2.3. В логе 1С загрузки пишет

"Фоновый обмен
24.08.2019 14:06:46 Запуск загрузки заказов
Обработано: 0
Загружено: 0
Пропущено: 0
Обновлено: 0
Создано: 0
Обработано оплат: 0
Загружено оплат: 0
Пропущено оплат: 0
Обновлено оплат: 0
Создано оплат: 0
24.08.2019 14:06:47 Завершена загрузка заказов
Дополнительная информация:
Не удалось прочитать данные, загруженные с сервера."

 

2019-08-24_13-59-42.png

Змінено користувачем alkorf
Надіслати
Поділитися на інших сайтах


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

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


 

Спойлер
В 24.08.2019 в 16:03, alkorf сказал:

Добрый день, ни как не могу разобраться выгрузка товаров с категориями и ценами проходит отлично, но не загружаются заказы с сайта в 1С. В административной панели сайта в разделе загрузка не работает кнопка "Настройка видов доставки для экспорта в заказы в ТС", может в этом проблема скрин приложил с настройками загрузки. 1С конфигурация УНФ 1.6, opencart 2.3. В логе 1С загрузки пишет

"Фоновый обмен
24.08.2019 14:06:46 Запуск загрузки заказов
Обработано: 0
Загружено: 0
Пропущено: 0
Обновлено: 0
Создано: 0
Обработано оплат: 0
Загружено оплат: 0
Пропущено оплат: 0
Обновлено оплат: 0
Создано оплат: 0
24.08.2019 14:06:47 Завершена загрузка заказов
Дополнительная информация:
Не удалось прочитать данные, загруженные с сервера."

 

2019-08-24_13-59-42.png

 

 

В версии 1.6.4.7 заказы выгружаются по статусу и если дата заказа больше периода выгрузки заказов.

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

Змінено користувачем Kirillove
Надіслати
Поділитися на інших сайтах

В 28.08.2019 в 00:20, leskurs сказал:

Вопрос к автору по заказам, можно ли как то выгрузить заказы с 2-3 разными статусами, а не только с одним?

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

Дата эта автоматически обновляется на время последнего успешного обмена заказами. Успешным считается есть 1С ответит "success"

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

В 13.08.2019 в 04:15, zack сказал:

При добавлении данного кода - ошибка 500 на странице карточки товара. 
В логах ничего не появляется.

К сожалению такое у себя нет времени реализовывать, 1.6.4.7 версия уже тоже архивная, но рабочая, использую у себя ее для обмена с УНФ. Склады идея хорошая, но требовала доработок, может в сентябре найду время, на Вашем сайте могу попробовать внедрить этот код.

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

1 час назад, DeGe сказал:

Здравствуйте! Могли бы помочь, нужен образец выгрузки orders.xml с несколькими заказами. 

orders (6).xml

Нашел такой, но он старый, для УНФ может не прокатить, УТ11 либо УТ10 схавать должна

Посмотрел еще раз файл... он для УТ11

Змінено користувачем Kirillove
Надіслати
Поділитися на інших сайтах

59 минут назад, Kirillove сказал:

orders (6).xml 6 \u043a\u0411 · 0 downloads

Нашел такой, но он старый, для УНФ может не прокатить, УТ11 либо УТ10 схавать должна

Посмотрел еще раз файл... он для УТ11

Спасибо!  Мне дали образец из 1С там такая строчка <КоммерческаяИнформация xmlns="urn:1C.ru:commerceml_2" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" ВерсияСхемы="2.09" ДатаФормирования="2018-02-05T13:26:04" Ид="1"> Это говорит о том, какая версия УТ используется?


Мне сообщили, что стоит УНФ 1.6
 

Змінено користувачем DeGe
Надіслати
Поділитися на інших сайтах


В 28.08.2019 в 01:20, leskurs сказал:

Вопрос к автору по заказам, можно ли как то выгрузить заказы с 2-3 разными статусами, а не только с одним?

в общем кому надо изменения в 2 файлах
admin/controller/extension/module/exchange1c.php
export/exchange1c.php

в изменения не вникал, оплачено

Автору, можно добавить в релиз

controller-exchange1c.php export-exchange1c.php

Змінено користувачем leskurs
Надіслати
Поділитися на інших сайтах


  • dinox changed the title to Модуль обмена для opencart v2.3 с учетной системой по стандарту CommerceML [Поддержка]

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

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

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

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

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

Вхід

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

Вхід зараз

×
×
  • Створити...

Important Information

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