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

Интеграция 1С с OpenCart 3


Recommended Posts

После переноса с облачного сервера появилась проблема с синхронизацией 1С.

По сути синхронизацией не стало совсем.

 

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

Решение без кабинета в админке OC.

 

 

SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/

# For details see man 4 crontabs

# Example of job definition:
# .---------------- minute (0 - 59)
# |  .------------- hour (0 - 23)
# |  |  .---------- day of month (1 - 31)
# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# |  |  |  |  |
# *  *  *  *  * user-name command to be executed
*/2 * * * * root /usr/bin/links -source https://www.сайт.ru/wp-cron.php?10517f841dbb594cdbccc0c734ee41e2&action=wysija_cron&process=all
*/2 * * * * root wget -O /dev/null -q https://www.сайт.ru/s/cron.php > /dev/null
40 * * * * mv /home/1cftp/ftp/* /home/datasub/htdocs/storage/upload/ftp > /dev/null
45 * * * * wget -O /dev/null -q https://shop.сайт.ru/index.php?route=product/product/import1c > /dev/null
0 9 * * * root wget -O /dev/null -q https://www.сайт.ru/s/index.php?route=product/product/soldout > /dev/null
* * * * * root wget -O /dev/null --password=devcd --user=devcd -q http://test.сайт.ru/s/cron.php > /dev/null
#37 17 2 9 5 root /usr/bin/php -f /home/datasub/htdocs/backup.charmdis.ru/docs/static/cdmailer/index.php >> /home/datasub/htdocs/backup.charmdis.ru/docs/var/mailer.log
#5 16 * * * root /usr/bin/php -f /home/charmdis/docs/static/cdmailer/index.php >> /home/charmdis/docs/static/cdmailer/sending.log
0 3 * * * root /usr/bin/lynx -source -accept_all_cookies https://www.сайт.ru/s/index.php?route=api/ordercoupon/cron
0 4 * * * root /usr/bin/lynx -source -accept_all_cookies https://www.сайт.ru/s/index.php?route=api/instagram
0 1 * * * export APPLICATION_ENV="production" && cd /home/datasub/htdocs/hairbrand.ru/ && nice -n 15 php console.php -m site -c index -a upload-backups-to-drop-box >> /tmp/cron-upload-backups-to-dropbox.log


 

 

вот так выглядел файл крона на облачном сервере

 

Переносили только сайт на субдомене на другой, обычный хостинг.

Понятно дело доступа к файлам и папкам теперь нет, к которым был ранее. 

 

Получается из файла крона нас интересует только сайт на субдомене shop

К этому сайту относится запрос

 

45 * * * * wget -O /dev/null -q https://shop.сайт.ru/index.php?route=product/product/import1c > /dev/null

 

и

 

40 * * * * mv /home/1cftp/ftp/* /home/datasub/htdocs/storage/upload/ftp > /dev/null

 

так, как только он работал с 1С и обменивался. 

 

Как я понял, файл прилетал в директиву /home/1cftp/ftp/ из 1С - напрямую. Я так понимаю сам 1С отправлял и отправляет прямо сейчас через FTP туда файл

после чего он перемещался кроном в директорию /home/datasub/htdocs/storage/upload/ftp

Оттуда его OC через скрипт  45 * * * * wget -O /dev/null -q https://shop.сайт.ru/index.php?route=product/product/import1c > /dev/null 

о котором я говорил ранее съедает.

 

Но, OC есть не хочет, пишет нет файла. Пока писал понял что это ведь логично - 1С выгружает файл по старому FTP подключению.

 

image.png.68a63ef81a1b0bd51282cfe4b9598280.png

 

Вот такие ошибки он выводит каждый час. Иногда чаще.

 

 

В связи с этим вопросы: 

Если я изменю в настройках 1С параметры FTP подключения, мне же нужно будет использовать какую то другую директорию. Понятно, что 1С будет выгружать прямо в корень папки которая будет указана в параметрах FTP доступа. Но какую и главное КАК указать директорию для скрипта который будет кроном пытаться съесть файл, которого нет в папке (директива где то указана старая, от прошлого сервака). 

 

45 * * * * wget -O /dev/null -q https://shop.сайт.ru/index.php?route=product/product/import1c > /dev/null

 

Я так понимаю этот файл, исполняемый поможет внести хоть какую то ясность. 

Как можно этот файл открыть? Что это вообще такое? Где это находится, вообще? 

В качестве дополнения добавлю код, который нашел по пути /www/shop.charmdis.ru/catalog/controller/product/product.php , относящийся к импорту

 

 

 

 

 

		/* Apr 9th 2020 new format
			сайт SKU
			1C ID
			Moscow qty
			SPb qty
			Price


		* 		Old schema:
		*	сайт SKU
		*	1C ID
		* 	Moscow Qty
		* 	Moscow Price
		* 	SPb Qty
		* 	SPb Price
		*/ 
	
		$this->log->write( 'Import from 1C FTP file start' );

		if( ! file_exists( $this->_1CfilePath )) {
			return 'Не найден путь к файлу импорта';
		}

		$ftpDir = opendir( $this->_1CfilePath );
		$itemsProcessed = $itemsUnprocessed = 0;

		while( $ftpFile = readdir( $ftpDir )) {
			if( preg_match( '@\.'. $this->_1CfileExtension .'$@', $ftpFile )) {
				$aFileName = explode( '-', $ftpFile );

				if( count( $aFileName ) < 7 ) {
					$ftpFileNewName = preg_replace( '@\.'. $this->_1CfileExtension .'@', '-' . date('Y-m-d-H-i-s') . '$0', $ftpFile );

					$this->load->model('catalog/product');

					$this->log->write( 'Importing from file ' . $ftpFile );
					$source1CFile = $this->_1CfilePath . DIRECTORY_SEPARATOR . $ftpFile;

					$in1c = file( $source1CFile );

					foreach( $in1c as $inline ) {
						$inline = preg_replace( '@[^0-9а-яa-z;/\s-]@iu', '', $inline );
						$al = explode( ';', trim( $inline ));
						$model1c = $al[1];
						if( count( $al ) < 3 || count( $al ) > 5 ) {
							return 'Неправильное число колонок в файле, должно быть: артикул, ID из 1C, остатки, цена (опционально)';
						}

						$this->model_catalog_product->updateProduct1c( $al[0], $model1c );

						// Has SPB data
						if( count( $al ) == 6 ) {
							if( $this->model_catalog_product->setProductQuantity( $model1c, (int) $al[4], "Санкт-Петербург" )) {
								$itemsProcessed ++;
								// Ignore SPb price?
								/*if( $this->model_catalog_product->setProductPrice( $model1c, (float) $al[5] ) ) {
								}*/
							}
						} elseif( count( $al ) == 5 ) { // New format

							$this->model_catalog_product->setProductQuantity( $model1c, (int) $al[2], "Москва" );
							$this->model_catalog_product->setProductQuantity( $model1c, (int) $al[3], "Санкт-Петербург" );

							$product_status = $al[2] + $al[2] > 0 ? 7 : 5;
							$this->model_catalog_product->setProductStatus( $model1c, $product_status );
							 

							if( $this->model_catalog_product->setProductPrice( $model1c, (float) $al[4] ) ) {
								$itemsProcessed ++;
							} else {
								$itemsUnprocessed ++;
							}
						}
						
					}

					$this->log->write( 'Import from 1C FTP file finished: ' . $itemsProcessed . ' processed items, ' . $itemsUnprocessed . ' unprocessed items' );

					if( copy( $source1CFile, $this->_1CfilePath . DIRECTORY_SEPARATOR . $ftpFileNewName  )) {
						$this->log->write( 'Renaming file to ' . $ftpFileNewName );
						if( unlink( $source1CFile )) {
							$this->log->write( 'Deleting original file' );
						} else {
							$this->log->write( 'Failed to delete original file' );
						}
					} else {
						$this->log->write( 'Renaming file failed' );
					}

					return '';
				}
			}
		}

		return 'Не найдены файлы для импорта';
	}

	public function import1c()
	{

		ini_set('display_errors', '1' );
		$error = $this->process1cFile();
		$this->cache->delete('product.bestseller');
		$this->cache->delete('products');
		if( $error ) {
			$this->log->write( 'Import error: ' . $error );
			die( $error );
		}
	}

 

Что это может быть? Может кто то шарит в программировании? Если этот код не запускает тарелку в космос, что еще это может быть? 

Помогите пожалуйста по данному вопросу. 

 

 

 

 

 

 

 

 

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


Скорее всего дело в путях.

Посмотреть путь на linux-хостинге при доступе по ssh можно с помощью  команды pwd

Команда крона

45 * * * * wget -O /dev/null -q https://shop.сайт.ru/index.php?route=product/product/import1c > /dev/null

каждый 45 мин запускает функцию import1c() контроллера catalog/controller/product/product.php, который Вы верно нашли.

Судя по логам, начинается выполнятся код

$this->log->write( 'Import from 1C FTP file start' );

		if( ! file_exists( $this->_1CfilePath )) {
			return 'Не найден путь к файлу импорта';
		}

не находится путь и выводится сообщение в лог.

Обратите внимание в коде как определяется переменная _1CfilePath в которой содержится путь к директории с файлами для дальнейшего их разбора.

Возможное направление для действий.

1. На новом хостинге

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

- определяете (создаете) директорию  из которой будут забираться файлы для импорта в OpenCart, этот путь должен быть указан для переменной  _1CfilePath (см. выше)

2. В кроне изменяете пути для команды перемещения

40 * * * * mv /home/1cftp/ftp/* /home/datasub/htdocs/storage/upload/ftp > /dev/null

3. В 1с при импорте прописываете новый путь для экспорта по FTP (путь узнаем на хостинге с помощью команды pwd)

 

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

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


12 часов назад, searchingman сказал:

Скорее всего дело в путях.

Посмотреть путь на linux-хостинге при доступе по ssh можно с помощью  команды pwd

Команда крона


45 * * * * wget -O /dev/null -q https://shop.сайт.ru/index.php?route=product/product/import1c > /dev/null

каждый 45 мин запускает функцию import1c() контроллера catalog/controller/product/product.php, который Вы верно нашли.

Судя по логам, начинается выполнятся код


$this->log->write( 'Import from 1C FTP file start' );

		if( ! file_exists( $this->_1CfilePath )) {
			return 'Не найден путь к файлу импорта';
		}

не находится путь и выводится сообщение в лог.

Обратите внимание в коде как определяется переменная _1CfilePath в которой содержится путь к директории с файлами для дальнейшего их разбора.

Возможное направление для действий.

1. На новом хостинге

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

- определяете (создаете) директорию  из которой будут забираться файлы для импорта в OpenCart, этот путь должен быть указан для переменной  _1CfilePath (см. выше)

2. В кроне изменяете пути для команды перемещения


40 * * * * mv /home/1cftp/ftp/* /home/datasub/htdocs/storage/upload/ftp > /dev/null

3. В 1с при импорте прописываете новый путь для экспорта по FTP (путь узнаем на хостинге с помощью команды pwd)

 

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

 

Так, подскажите, а где я в теории могу посмотреть путь в переменной  _1CfilePath? 

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


7 минут назад, 7ochukwu сказал:

 

Так, подскажите, а где я в теории могу посмотреть путь в переменной  _1CfilePath? 

Н-р, в  контроллере поиском по _1CfilePath.

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


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

Н-р, в  контроллере поиском по _1CfilePath.

    private $_1CfilePath = DIR_UPLOAD . 'ftp'; 

вот такое значение нашел.

 

    private $error = array();
    private $_1CfilePath = DIR_UPLOAD . 'ftp';    
    private $_1CfileExtension = 'csv';

 

Как я могу заменить адрес директории, например интересует директория /catalog/1С_upload ?

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


Строка в коде

private $_1CfilePath = DIR_UPLOAD . 'ftp';  

ссылалась на старый путь /home/datasub/htdocs/storage/upload/ftp

 

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

Лучше правильно пропишите пути в кроне для перемещения файлов с учетом ваших новых путей, т.е.

40 * * * * mv /home/1cftp/ftp/* /home/datasub/htdocs/storage/upload/ftp > /dev/null

Если после переноса сайт работает, значит, пути уже прописаны. 

Посмотреть их можно в конфигурационном файле \config.php

define('DIR_STORAGE', 'Какой-то ваш/путь/');

define('DIR_UPLOAD', DIR_STORAGE . 'upload/'); 

 

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


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

Строка в коде


private $_1CfilePath = DIR_UPLOAD . 'ftp';  

ссылалась на старый путь /home/datasub/htdocs/storage/upload/ftp

 

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

Лучше правильно пропишите пути в кроне для перемещения файлов с учетом ваших новых путей, т.е.


40 * * * * mv /home/1cftp/ftp/* /home/datasub/htdocs/storage/upload/ftp > /dev/null

Если после переноса сайт работает, значит, пути уже прописаны. 

Посмотреть их можно в конфигурационном файле \config.php


define('DIR_STORAGE', 'Какой-то ваш/путь/');

define('DIR_UPLOAD', DIR_STORAGE . 'upload/'); 

 

 

Понял о чем вы говорите.

Такой вопрос

Дело в том, что папка storage сейчас вынесена за пределы папки сайта.

Произошло это еще на облачном сервере. 

По каким причинам это было сделано не ясно.

 

image.png.0242d80c970e67f094b71c9129e6fb21.png

 

Иерархию сохранили и на новом обычном хостинге.

В конфиге уже на новом хостинге есть об этом информация.

 

image.png.868f54d5d75f43122a6576fc38285191.png

 

Вроде все модули работают как нужно. Да и вообще сайт работает как нужно, кроме импорта 1С и установки модулей.

При установкt через ocmod выдает ошибку о том, что папка не найдена. 

Я так понимаю из-за того, что дефолтно в модификаторах xml указан путь к storage внутри папки сайта, каким он и должен быть.

 

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

Как быть в этой ситуации? стоит ли переносить папку?  и менять ее путь в конфиге

А в кроне указать просто путь к этой папке?

 

 

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


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

Строка в коде


private $_1CfilePath = DIR_UPLOAD . 'ftp';  

ссылалась на старый путь /home/datasub/htdocs/storage/upload/ftp

 

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

Лучше правильно пропишите пути в кроне для перемещения файлов с учетом ваших новых путей, т.е.


40 * * * * mv /home/1cftp/ftp/* /home/datasub/htdocs/storage/upload/ftp > /dev/null

Если после переноса сайт работает, значит, пути уже прописаны. 

Посмотреть их можно в конфигурационном файле \config.php


define('DIR_STORAGE', 'Какой-то ваш/путь/');

define('DIR_UPLOAD', DIR_STORAGE . 'upload/'); 

 

 

Поменял пути, создал папки!

 

image.thumb.png.1685cf774558750241bbb57ce48c504e.png

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


13 минут назад, 7ochukwu сказал:

 

Понял о чем вы говорите.

Такой вопрос

Дело в том, что папка storage сейчас вынесена за пределы папки.

Произошло это еще на облачном сервере. 

По каким причинам это было сделано не ясно.

 

image.png.0242d80c970e67f094b71c9129e6fb21.png

 

Иерархию сохранили и на новом обычном хостинге.

В конфиге уже на новом хостинге есть об этом информация.

 

image.png.868f54d5d75f43122a6576fc38285191.png

 

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

Как быть в этой ситуации? стоит ли переносить папку?  и менять ее путь в конфиге

А в кроне указать просто путь к этой папке?

 

 

Для OC 3.x папка storage вынесена для безопасности и возвращать ее не нужно. При установке OC 3 при входе в админку запрашивается разрешение на перенос этой папки.

Если в путях содержится кириллица ( сайт.ru),  то очень желательно от нее избавиться, т.е. в путях должна быть латиница без пробелов.

Путь назначения файлов импорта будет /var/www/u1352512/data/www/storage/upload/ftp Для теста можете вручную положить в нее файл импорта  и сделать импорт командой, как в кроне. По идее должно сработать.

Надеюсь у Вас есть актуальный бэкап перед любыми экспериментами.

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


31 минуту назад, searchingman сказал:

Для OC 3.x папка storage вынесена для безопасности и возвращать ее не нужно. При установке OC 3 при входе в админку запрашивается разрешение на перенос этой папки.

Если в путях содержится кириллица ( сайт.ru),  то очень желательно от нее избавиться, т.е. в путях должна быть латиница без пробелов.

Путь назначения файлов импорта будет /var/www/u1352512/data/www/storage/upload/ftp Для теста можете вручную положить в нее файл импорта  и сделать импорт командой, как в кроне. По идее должно сработать.

Надеюсь у Вас есть актуальный бэкап перед любыми экспериментами.

 

Пути поменял 

image.thumb.png.bb8ab4df4332009d8ad0edbaadd03c6b.png

 

Вроде импорт закончился успешно.

 

Правильно понимаю, что папка storage в OC 3 всегда и была вынесена в отдельную директиву за папку сайта? 

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


Только что, 7ochukwu сказал:

Правильно понимаю, что папка storage в OC 3 всегда и была вынесена в отдельную директиву за папку сайта? 

Да, правильно. 

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


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

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

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

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

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

Вхід

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

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

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

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

Important Information

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