Jump to content

Recommended Posts

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

 

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

 

В результате мы имеем 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';
			}
		}

 

Link to post
Share on other sites

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

 

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

 

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

 

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

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

 

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

 

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

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

Link to post
Share on other sites

Пример:

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

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

 

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

 

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

 

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

Link to post
Share on other sites

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

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

Link to post
Share on other sites

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

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

 

$r =  $this->db->result();
			if($r)
			{
				$product_id = $r->product_id;
				$variant_id = $r->variant_id;
			}
Link to post
Share on other sites

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

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

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

 

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

Link to post
Share on other sites

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

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

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

 

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

 

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

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

 

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

Link to post
Share on other sites

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

$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']);
Link to post
Share on other sites

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

 

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

 

Получается, нужно еще 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

 

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

Link to post
Share on other sites

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

 

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

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

Link to post
Share on other sites

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

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

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

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

Link to post
Share on other sites

 

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

 

$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']);

 

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

Link to post
Share on other sites

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

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

 

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

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

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

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

 

См пример:

 

 

 

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

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

 

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

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

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

 

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

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

 

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

 

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

Link to post
Share on other sites

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

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

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

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

 

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

Link to post
Share on other sites

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

 

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

 

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

 

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

Link to post
Share on other sites

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

 

 

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

 

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

Link to post
Share on other sites

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

 

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

Link to post
Share on other sites

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

Edited by osben
Link to post
Share on other sites

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

 

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

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

Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...