Jump to content
  • разработка интернет магазинов на opencart
  • доработка интернет магазинов на opencart

Интеграция 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 .'[email protected]', $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 );
		}
	}

 

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

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

 

 

 

 

 

 

 

 

Link to comment
Share on other sites


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

Посмотреть путь на 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)

 

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

Edited by searchingman
  • +1 1
Link to comment
Share on other sites


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? 

Link to comment
Share on other sites


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

 

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

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

  • +1 1
Link to comment
Share on other sites


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

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

    private $_1CfilePath = DIR_UPLOAD . 'ftp'; 

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

 

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

 

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

Link to comment
Share on other sites


Строка в когде

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/'); 

 

Edited by searchingman
  • +1 1
Link to comment
Share on other sites


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), чтобы не нарушать проэтосс гдефолтной усиновки модулей.

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

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

 

 

Edited by 7ochukwu
Link to comment
Share on other sites


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/'); 

 

 

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

 

Link to comment
Share on other sites


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
Link to comment
Share on other sites


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

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

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

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

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

 

Пути поменял 

 

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

 

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

Link to comment
Share on other sites


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

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

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

  • +1 1
Link to comment
Share on other sites


Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...

Important Information

On our site, cookies are used and personal data is processed to improve the user interface. To find out what and what personal data we are processing, please go to the link. If you click "I agree," it means that you understand and accept all the conditions specified in this Privacy Notice.