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

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

Котаны, помогите советом.

 

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

 

В результате мы имеем id товара и варианта, которые уже есть в базе.

 

А если в CSV добавить новые варианты товара, то импорт создаст "новые товары".

 

Подскажите, куда копать (поменять запрос или добавить/поменять условия), чтобы новые варианты добавились уже существующему товару и не создавались новые товары

 

// Если на прошлом шаге товар не нашелся, и задано хотя бы название товара
		if((empty($product_id) || empty($variant_id)) && isset($item['name']))
		{
			if(!empty($variant['sku']) && empty($variant['name']))
				$this->db->query('SELECT v.id as variant_id, p.id as product_id FROM __products p LEFT JOIN __variants v ON v.product_id=p.id WHERE v.sku=? LIMIT 1', $variant['sku']);
			elseif(isset($item['variant']))
				$this->db->query('SELECT v.id as variant_id, p.id as product_id FROM __products p LEFT JOIN __variants v ON v.product_id=p.id AND v.name=? WHERE p.name=? LIMIT 1', $item['variant'], $item['name']);
			else
				$this->db->query('SELECT v.id as variant_id, p.id as product_id FROM __products p LEFT JOIN __variants v ON v.product_id=p.id WHERE p.name=? LIMIT 1', $item['name']);			
			
			$r =  $this->db->result();
			if($r)
			{
				$product_id = $r->product_id;
				$variant_id = $r->variant_id;
			}
			// Если вариант найден - обновляем,
			if(!empty($variant_id))
			{
				$this->variants->update_variant($variant_id, $variant);
				$this->products->update_product($product_id, $product);				
				$imported_item->status = 'updated';		
			}
			// Иначе - добавляем
			elseif(empty($variant_id))
			{
				if(empty($product_id))
					$product_id = $this->products->add_product($product);

                $this->db->query('SELECT max(v.position) as pos FROM __variants v WHERE v.product_id=? LIMIT 1', $product_id);
                $pos =  $this->db->result('pos');

				$variant['position'] = $pos+1;
				$variant['product_id'] = $product_id;
				$variant_id = $this->variants->add_variant($variant);
				$imported_item->status = 'added';
			}
		}

 

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

Подскажите, ... чтобы новые варианты добавились уже существующему товару и не создавались новые товары

 

К одному - какому? Все равно какому, к какому нибудь, например, первому в списке? Действительно хотите такое?

 

Котаны, помогите советом.

 

Для начала попробовать понять ТОЧНО, что Вы хотите получить.

И осознать, что вопрос серьезный и подходить к нему надо соответственно, а не кое-как.

 

А если в CSV добавить новые варианты товара, то импорт создаст "новые товары".

 

Обычно импорт, несмотря на свои недостатки, все создает как надо.

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

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

Пример:

На сайте есть Товар, у которого название товара "1234567890"

У этого товара есть несколько вариантов, у каждого есть свой артикул.

 

Если экспортировать с сайта, скорректировать данные в файле CSV, а затем импортировать - проблем не будет.

 

Если в файл CSV добавить еще варианты этому же товару, тогда после проверок, указанных выше отработает функция создания нового товара, а не добавления варианта к существущему по признаку "название товара" == "1234567890"

 

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

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

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

...свои проблемы надо описывать не тяп-ляп, а ТОЧНО, с примерами файлов...

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

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

был сохранен product_id, а variant_id имел пустое значение вот тут:

 

$r =  $this->db->result();
			if($r)
			{
				$product_id = $r->product_id;
				$variant_id = $r->variant_id;
			}
Ссылка на сообщение
Поделиться на другие сайты

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

А в импорту не по зубам даже более простые ситуации, чем у Вас:

http://simpla-tuning.com/import-oshibki-i-neratsionalnosti

 

Надо ошибку находить и исправлять. Если готовы оплачивать - обращайтесь...

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

Если закомментировать одно из условий:

if(!empty($variant['sku'])/* && empty($variant['name'])*/)

Импорт начинает обновлять по Артикулу, а не по "Названию Варианта" (когда обновлял по названию варианта - он перезаписывал значения несколько раз у первого варианта, но при этом не создавал новые товары)

 

Но Когда начал обновлять только по Артикулу - начал создавать новые товары (т.к. в базе у данного товара не было вариантов с двумя последними артикулами)

 

Получается, нужно еще 1 условие, либо еще 1 запрос в другом месте, который будет связывать такие варианты товара с НАЗВАНИЕМ ТОВАРА.

В нашем конкретном случае с его id (product_id)

 

По поводу оплаты - мне уже самому интересно, как это лучше решить без лишнего говнокода. Цена вопроса?

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

первое что бы поправил (скорее всего у вас не поправлено )
 

$this->db->query('SELECT id as variant_id, product_id FROM __variants, __products WHERE sku=? AND __variants.product_id = __products.id LIMIT 1', $variant['sku']);

на 

$this->db->query('SELECT v.id as variant_id, v.product_id FROM __variants v, __products p WHERE v.sku=? AND v.product_id = p.id LIMIT 1', $variant['sku']);
Ссылка на сообщение
Поделиться на другие сайты

первое что бы поправил (скорее всего у вас не поправлено )

 

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

 

Получается, нужно еще 1 условие, либо еще 1 запрос в другом месте, который будет связывать такие варианты товара с НАЗВАНИЕМ ТОВАРА.

В нашем конкретном случае с его id (product_id)

 

А еще может быть, что все значительно сложнее.

А может, даже так сложно, что сам автор не до конца понимает:

http://forum.simplacms.ru/topic/8601-%D0%BE%D1%87%D0%B5%D1%80%D0%B5%D0%B4%D0%BD%D0%B0%D1%8F-%D0%BE%D1%88%D0%B8%D0%B1%D0%BA%D0%B0-%D0%B8%D0%BC%D0%BF%D0%BE%D1%80%D1%82%D0%B0/?do=findComment&comment=64365

 

Во всяком случае, объяснить вразумительно автор не может...

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

как вариант делать поиск еще по урл товару на совпадение (если ета колонка есть)

 

Это не исправляет ситуацию для примера, который дал ТС. В примере все URL одинаковые, так как предполагается, что это варианты ОДНОГО ТОВАРА.

"Как вариант" - можно нафантазировать еще десятки способов...

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

Пробую переделать импорт. 

Желающие могут потестировать по адресу:

http://demo.simpla-tuning.com/140817/simpla/index.php?module=ImportAdmin

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

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

 

первое что бы поправил (скорее всего у вас не поправлено )

 

$this->db->query('SELECT id as variant_id, product_id FROM __variants, __products WHERE sku=? AND __variants.product_id = __products.id LIMIT 1', $variant['sku']);

на 

$this->db->query('SELECT v.id as variant_id, v.product_id FROM __variants v, __products p WHERE v.sku=? AND v.product_id = p.id LIMIT 1', $variant['sku']);

 

это у меня было еще задолго до возникновения проблемы)

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

Давайте тогда еще раз попробую описать суть вопроса, если вдруг до этого неясно объяснил.

Мне проблема понятна, но вот решить ее - пока не могу (скорее в силу недостаточного опыта).

 

1. На сайте есть товар, к которого есть 3 варианта товара:

- у всех трех вариантов одинаковое название варианта (либо вообще не будет названия варианта). Давайте забудем про привязку к этому параметру.

- у всех трех вариантов товара есть уникальный артикул.

- у всех трех вариантов товара есть общее: НАЗВАНИЕ САМОГО ТОВАРА (как следствие и URL)

 

См пример:

 

 

 

2. При использовании стандартного импорта для файла указанного выше прозойдет следующее:

 - импорт при прохождении по файлу двумя последними (новыми) вариантами товара, которых еще нет в базе сайта - перезапишет первый вариант товара в базе сайта, т.к. найдет соответствие по НАЗВАНИЮ ВАРИАНТА.

 

3. Если закомментировать одно из условий:

if(!empty($variant['sku'])/* && empty($variant['name'])*/)
 

Импорт начинает обновлять по Артикулу, а не по "Названию Варианта".

 

Он находит соответствия для первых трех вариантов из файла в базе сайта (по артикулу) и обновляет их,

НО не находит в базе сайта АРТИКУЛЫ для последний двух вариантов товара из файла - и как следствие, создает для них новые товары (2 шт.)

 

4. Задача состоит в том, чтобы поставить правильное условие для последних двух вариантов, которых нет в базе сайта и запрос к базе, в результате которого мы сохраним значение product_id от первых трех вариантов товара, которые уже есть в базе, и у которых ТАКОЕ ЖЕ НАЗВАНИЕ ТОВАРА и такой же URL ТОВАРА, как и у новых двух вариантов.

 

Далее мы будем использовать полученный product_id для ДОБАВЛЕНИЯ к нему новых ВАРИАНТОВ товара, без создания НОВЫХ ТОВАРОВ.

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

Пробую переделать импорт. 

Желающие могут потестировать по адресу:

http://demo.simpla-tuning.com/140817/simpla/index.php?module=ImportAdmin

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

 

Ваш вариант, кстати, корретно обрабатывает мой файл, покажите условия?

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

4. Задача ... поставить правильное условие для последних двух вариантов...

 

Изменять ТОЛЬКО условия в стандартном файле импорта - вряд ли что так выйдет. Надо менять всю схему сопоставления... 

 

Пробовал делать импорт двумя файлами (оба в 1 архиве)

 

Непонятно, зачем это написано и что хотите этим сказать...

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

Изменять ТОЛЬКО условия в стандартном файле импорта - вряд ли что так выйдет. Надо менять всю схему сопоставления... 

 

 

Непонятно, зачем это написано и что хотите этим сказать...

 

Хочу сказать, что ваш вариант - работает

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

Подскажите, что меняли? Ваш импорт в текущий момент учитывает все, описанное мной ранее

 

Изменена полностью часть, отвечающая за сопоставление...

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

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

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

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

 

Спасибо. Замечание Ваше правильное и ценное, но уже не актуальное.

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

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

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

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

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

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

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

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

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

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

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