Перейти к содержанию
Официальный форум поддержки Simpla

Как сделать рессайз изображений при импорте товаров?


Рекомендуемые сообщения

Здравствуйте.

Скажите пожалуйста, может кто-то сталкивался с вопросом. На сайт загружаются товары через импорт csv, фото грузятся по ссылкам с сайта-поставщика.

 

Как правильно прописать функцию в simpla/ajax/import.php чтобы каждое загружаемое фото при выполнении импорта сразу автоматически рессайзилось под заданные размеры, а не тогда, когда человек просматривает сайт?

Ссылка на сообщение
Поделиться на другие сайты

Если все изображения находятся удалённо, то для начала их нужно загрузить (см. функцию download_image в api/Image.php), после нужно выполнить ресайз (см. api/Design.php функция resize()) для каждого изображения в каждом разрешении.

Это так теория, на практике всё куда сложнее.

Изменено пользователем Noxter
Ссылка на сообщение
Поделиться на другие сайты

 

фото грузятся по ссылкам с сайта-поставщика.

 

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

Ссылка на сообщение
Поделиться на другие сайты

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

Ведь грузится по 10 штук (товаров) за раз а не по 1к, я думаю правильнее сделать загрузку и ресайз сразу, об этом писал 3 недели назад Пикусову, сказал что подумает над этим.
Ссылка на сообщение
Поделиться на другие сайты

Ведь грузится по 10 штук (товаров) за раз а не по 1к, я думаю правильнее сделать загрузку и ресайз сразу

 

Поддерживаю.

 

На сколько я понимаю, фото грузится сразу в папку originals, а не при рессайзе. А уже при просмотре, рессайзы создаются в папке products

Изменено пользователем cmssmarty
Ссылка на сообщение
Поделиться на другие сайты

Поддерживаю.

 

На сколько я понимаю, фото грузится сразу в папку originals, а не при рессайзе.

Если фото удалённое то нет, в таблице s_images хранится полный путь на удалённый источник, а уже при просмотре товара выполняется ресайз, вслед за ресайзом функция download_image которая копирует оригинал в папку originals, а уже после обновления странциы выполняется ресайз от оригинала.

Как по мне это вообще как-то топорно, куда проще было бы сразу загрузить картинку а после выполнить ресайз и вернуть обрезанную картинку.

Ссылка на сообщение
Поделиться на другие сайты

Если фото удалённое то нет, в таблице s_images хранится полный путь на удалённый источник, а уже при просмотре товара выполняется ресайз, вслед за ресайзом функция download_image которая копирует оригинал в папку originals, а уже после обновления странциы выполняется ресайз от оригинала.

Как по мне это вообще как-то топорно, куда проще было бы сразу загрузить картинку а после выполнить ресайз и вернуть обрезанную картинку.

 

Может можно вставить как раз функции download_image и resize (несколько функций resize, которые используются на сайте) в ajax/import.php

	 		// Изображения товаров
	 		if(isset($item['images']))
	 		{
	 			// Изображений может быть несколько, через запятую
	 			$images = explode(',', $item['images']);
	 			foreach($images as $image)
	 			{
	 				$image = trim($image);
	 				if(!empty($image))
	 				{
		 				// Имя файла
						$image_filename = pathinfo($image, PATHINFO_BASENAME);
		 				
		 				// Добавляем изображение только если такого еще нет в этом товаре
						$this->db->query('SELECT filename FROM __images WHERE product_id=? AND (filename=? OR filename=?) LIMIT 1', $product_id, $image_filename, $image);
						if(!$this->db->result('filename'))
						{
							$this->products->add_image($product_id, $image);
						}
					}
	 			}
	 		}

 

Сейчас буду ломать голову над этим, отпишусь о результате в случае решения  :)

Ссылка на сообщение
Поделиться на другие сайты
Может можно вставить как раз функции download_image и resize (несколько функций resize, которые используются на сайте) в ajax/import.php

Конечно можно, и причём делается это совсем не сложно.

Ссылка на сообщение
Поделиться на другие сайты

 

Может можно вставить как раз функции download_image и resize (несколько функций resize, которые используются на сайте) в ajax/import.php

Конечно можно, и причём делается это совсем не сложно.

 

Если загрузку на сервер сделать очень просто, тупо добавив строчку

$this->image->download_image($image);

После

		 				// Добавляем изображение только если такого еще нет в этом товаре
						$this->db->query('SELECT filename FROM __images WHERE product_id=? AND (filename=? OR filename=?) LIMIT 1', $product_id, $image_filename, $image);
						if(!$this->db->result('filename'))
						{
							$this->products->add_image($product_id, $image);
						}

в ajax/import.php, то с рессайзом я уже действительно запутался, множество методов перепробовал - никак не выходит реализовать запрос на рессайз с заданными параметрами в api/image

Ссылка на сообщение
Поделиться на другие сайты

Скорее всего, надо что-то вида

$this->image->resize($this->design->resize_modifier($image_filename,200,200,w));

И в базе к этому моменту запись должна уже быть...

Изменено пользователем Karabaska
Ссылка на сообщение
Поделиться на другие сайты

Скорее всего, надо что-то вида

$this->image->resize($this->design->resize_modifier($image_filename,200,200,w));

И в базе к этому моменту запись должна уже быть...

 

Нет, рессайз не создается в папке files/products..,.

Ссылка на сообщение
Поделиться на другие сайты

 

Нет, рессайз не создается в папке files/products..,.

Вам нужно выполнить:
print $this->design->resize_modifier($image_filename, 200, 200);
Вариант выше работать не будет. Изменено пользователем Noxter
Ссылка на сообщение
Поделиться на другие сайты

 

Вам нужно выполнить:

$this->design->resize_modifier($image_filename, 200, 200);
Вариант выше работать не будет.

И что, неужели это будет работать?

Указанную строку куда ни вставляй, результата не будет НИКАКОГО. Ибо вызываемая в этой строке функция просто формирует текстовую строку, после чего возвращает результат в НИКУДА. Результат просто теряется и выходит бесполезная работа...

 

А вот вариант выше у меня работает (при небольших изменениях). Если, конечно, его вставить в нужное место...

Ссылка на сообщение
Поделиться на другие сайты

И что, неужели это будет работать?

Указанную строку куда ни вставляй, результата не будет НИКАКОГО. Ибо вызываемая в этой строке функция просто формирует текстовую строку, после чего возвращает результат в НИКУДА. Результат просто теряется и выходит бесполезная работа...

 

А вот вариант выше у меня работает (при небольших изменениях). Если, конечно, его вставить в нужное место...

Много ума не нужно чтобы распечатать результат выполнения функции, так что свои выпендрёжи прояви в другом месте, возможно в кругу семьи, друзей.
Ссылка на сообщение
Поделиться на другие сайты

 

Вам нужно выполнить:

print $this->design->resize_modifier($image_filename, 200, 200);
Вариант выше работать не будет.

 

И что, этот новый способ будет работать?

Насколько я понимаю, вставлять такое в  simpla/ajax/import.php - значит сделать импорт гарантированно неработоспособным...

Ссылка на сообщение
Поделиться на другие сайты

И что, этот новый способ будет работать?

Насколько я понимаю, вставлять такое в simpla/ajax/import.php - значит сделать импорт гарантированно неработоспособным...

А я нигде не писал что и где нужно "вставлять".

Оставить свои глупые умозаключения при себе.

Ссылка на сообщение
Поделиться на другие сайты

И что, неужели это будет работать?

Указанную строку куда ни вставляй, результата не будет НИКАКОГО. Ибо вызываемая в этой строке функция просто формирует текстовую строку, после чего возвращает результат в НИКУДА. Результат просто теряется и выходит бесполезная работа...

 

А вот вариант выше у меня работает (при небольших изменениях). Если, конечно, его вставить в нужное место...

 

Можете написать подробнее о изменениях и нужном месте?  :)

Ссылка на сообщение
Поделиться на другие сайты

Писать полностью хороший и работоспособный код - это некоторая работа. И имеется риск получить сразу ответ - а я вот что-то такое как-то у себя делаю по рекомендации, но не выходит.

Если готовы оплачивать - обращайтесь в личку...

Ссылка на сообщение
Поделиться на другие сайты

Писать полностью хороший и работоспособный код - это некоторая работа. И имеется риск получить сразу ответ - а я вот что-то такое как-то у себя делаю по рекомендации, но не выходит.

 

++
Ссылка на сообщение
Поделиться на другие сайты

Писать полностью хороший и работоспособный код - это некоторая работа. И имеется риск получить сразу ответ - а я вот что-то такое как-то у себя делаю по рекомендации, но не выходит.

Если готовы оплачивать - обращайтесь в личку...

 

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

Ссылка на сообщение
Поделиться на другие сайты

Нашел решение сам.
Убрал для начала токен изображения по инструкции (это сделал для себя, не знаю играет роль в данной теме или нет).
 
После

$this->image->download_image($image);

Вставил

file_get_contents($this->design->resize_modifier($image_filename, 120, 120));

И все работает. Создается рессайз в папке /files/products при импорте с вышеуказанными параметрами.
 


Karabaska, у вас какое-то может быть другое решение? Я просто не думаю что вы хотели 1 строчку кода "писать" платно.

Изменено пользователем cmssmarty
Ссылка на сообщение
Поделиться на другие сайты

Нашел решение сам.

Убрал для начала токен изображения по инструкции (это сделал для себя, не знаю играет роль в данной теме или нет).

 

После

$this->image->download_image($image);

Вставил

file_get_contents($this->design->resize_modifier($image_filename, 120, 120));

И все работает. Создается рессайз в папке /files/products при импорте с вышеуказанными параметрами.

 

 

Karabaska, у вас какое-то может быть другое решение? Я просто не думаю что вы хотели 1 строчку кода "писать" платно.

 

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

 

но если все же задача в том что бы скачать и нарезать именно в импорте тогда вы все правильно сделали

Изменено пользователем DaVinci
Ссылка на сообщение
Поделиться на другие сайты

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

 

Тут задача стоит именно в том, чтобы изображения при импорте сразу сохранялись в /files/originals и сразу нарезались нужные рессайзы в папку /files/products , а не по запросу.

Ссылка на сообщение
Поделиться на другие сайты

Тут задача стоит именно в том, чтобы изображения при импорте сразу сохранялись в /files/originals и сразу нарезались нужные рессайзы в папку /files/products , а не по запросу.

 

тогда все верно

Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
×
×
  • Создать...