yoshkin Posted March 24, 2016 Report Share Posted March 24, 2016 Котаны, помогите советом. В блоке указанном ниже при импорте товара и его вариантов делеаются запросы к базе. В результате мы имеем 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'; } } Quote Link to post Share on other sites
Kors Posted March 24, 2016 Report Share Posted March 24, 2016 Подскажите, ... чтобы новые варианты добавились уже существующему товару и не создавались новые товары К одному - какому? Все равно какому, к какому нибудь, например, первому в списке? Действительно хотите такое? Котаны, помогите советом. Для начала попробовать понять ТОЧНО, что Вы хотите получить.И осознать, что вопрос серьезный и подходить к нему надо соответственно, а не кое-как. А если в CSV добавить новые варианты товара, то импорт создаст "новые товары". Обычно импорт, несмотря на свои недостатки, все создает как надо.Если у Вас не так, то свои проблемы надо описывать не тяп-ляп, а ТОЧНО, с примерами файлов, на которых работает неправильно. Вот тогда у Вас будет хороший шанс разрешить свой вопрос... Quote Link to post Share on other sites
yoshkin Posted March 24, 2016 Author Report Share Posted March 24, 2016 Пример:На сайте есть Товар, у которого название товара "1234567890"У этого товара есть несколько вариантов, у каждого есть свой артикул. Если экспортировать с сайта, скорректировать данные в файле CSV, а затем импортировать - проблем не будет. Если в файл CSV добавить еще варианты этому же товару, тогда после проверок, указанных выше отработает функция создания нового товара, а не добавления варианта к существущему по признаку "название товара" == "1234567890" Нужно, чтобы по признаку "название товара" к товару добавились новые варианты, а не создавались новые товары. Quote Link to post Share on other sites
Kors Posted March 24, 2016 Report Share Posted March 24, 2016 Нужно, чтобы по признаку "название товара" к товару добавились новые варианты, а не создавались новые товары....свои проблемы надо описывать не тяп-ляп, а ТОЧНО, с примерами файлов... Quote Link to post Share on other sites
yoshkin Posted March 24, 2016 Author Report Share Posted March 24, 2016 Не получается приложить файл к посту вот скрин: http://prntscr.com/ajegjm Quote Link to post Share on other sites
yoshkin Posted March 24, 2016 Author Report Share Posted March 24, 2016 В архиве получилось__export (7).rar Quote Link to post Share on other sites
yoshkin Posted March 24, 2016 Author Report Share Posted March 24, 2016 Грубо говоря, мне нужно получить результат, при котором для варианта (которого еще нет в базе сайта)был сохранен product_id, а variant_id имел пустое значение вот тут: $r = $this->db->result(); if($r) { $product_id = $r->product_id; $variant_id = $r->variant_id; } Quote Link to post Share on other sites
yoshkin Posted March 24, 2016 Author Report Share Posted March 24, 2016 Что вот тут второе условие не выполнилось: elseif(empty($variant_id)) { if(empty($product_id)) $product_id = $this->products->add_product($product); Quote Link to post Share on other sites
Kors Posted March 24, 2016 Report Share Posted March 24, 2016 Вы набрели на очередную ошибку в импорте. Она связана с тем, что у Вас строчки файла импорта почти одинаковы и из важных для сопоставления полей отличаются только артикулом. А в импорту не по зубам даже более простые ситуации, чем у Вас:http://simpla-tuning.com/import-oshibki-i-neratsionalnosti Надо ошибку находить и исправлять. Если готовы оплачивать - обращайтесь... Quote Link to post Share on other sites
yoshkin Posted March 24, 2016 Author Report Share Posted March 24, 2016 Если закомментировать одно из условий: if(!empty($variant['sku'])/* && empty($variant['name'])*/) Импорт начинает обновлять по Артикулу, а не по "Названию Варианта" (когда обновлял по названию варианта - он перезаписывал значения несколько раз у первого варианта, но при этом не создавал новые товары) Но Когда начал обновлять только по Артикулу - начал создавать новые товары (т.к. в базе у данного товара не было вариантов с двумя последними артикулами) Получается, нужно еще 1 условие, либо еще 1 запрос в другом месте, который будет связывать такие варианты товара с НАЗВАНИЕМ ТОВАРА.В нашем конкретном случае с его id (product_id) По поводу оплаты - мне уже самому интересно, как это лучше решить без лишнего говнокода. Цена вопроса? Quote Link to post Share on other sites
osben Posted March 24, 2016 Report Share Posted March 24, 2016 первое что бы поправил (скорее всего у вас не поправлено ) $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']); Quote Link to post Share on other sites
Kors Posted March 24, 2016 Report Share Posted March 24, 2016 первое что бы поправил (скорее всего у вас не поправлено ) Это не исправляет ситуацию, для примера, который дал ТС, указанный запрос в исправленном и неисправленном случае одинаково не возвращает результата. Причина существенно глубже... Получается, нужно еще 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 Во всяком случае, объяснить вразумительно автор не может... Quote Link to post Share on other sites
osben Posted March 24, 2016 Report Share Posted March 24, 2016 как вариант делать поиск еще по урл товару на совпадение (если ета колонка есть) Quote Link to post Share on other sites
Kors Posted March 25, 2016 Report Share Posted March 25, 2016 как вариант делать поиск еще по урл товару на совпадение (если ета колонка есть) Это не исправляет ситуацию для примера, который дал ТС. В примере все URL одинаковые, так как предполагается, что это варианты ОДНОГО ТОВАРА."Как вариант" - можно нафантазировать еще десятки способов... Quote Link to post Share on other sites
Kors Posted March 25, 2016 Report Share Posted March 25, 2016 Пробую переделать импорт. Желающие могут потестировать по адресу:http://demo.simpla-tuning.com/140817/simpla/index.php?module=ImportAdminПриветствуются замечания конкретного содержания с указанием ошибки и файла, при котором она возникает... Quote Link to post Share on other sites
yoshkin Posted March 25, 2016 Author Report Share Posted March 25, 2016 первое что бы поправил (скорее всего у вас не поправлено ) $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']); это у меня было еще задолго до возникновения проблемы) Quote Link to post Share on other sites
yoshkin Posted March 25, 2016 Author Report Share Posted March 25, 2016 Давайте тогда еще раз попробую описать суть вопроса, если вдруг до этого неясно объяснил.Мне проблема понятна, но вот решить ее - пока не могу (скорее в силу недостаточного опыта). 1. На сайте есть товар, к которого есть 3 варианта товара:- у всех трех вариантов одинаковое название варианта (либо вообще не будет названия варианта). Давайте забудем про привязку к этому параметру.- у всех трех вариантов товара есть уникальный артикул.- у всех трех вариантов товара есть общее: НАЗВАНИЕ САМОГО ТОВАРА (как следствие и URL) См пример: 2. При использовании стандартного импорта для файла указанного выше прозойдет следующее: - импорт при прохождении по файлу двумя последними (новыми) вариантами товара, которых еще нет в базе сайта - перезапишет первый вариант товара в базе сайта, т.к. найдет соответствие по НАЗВАНИЮ ВАРИАНТА. 3. Если закомментировать одно из условий: if(!empty($variant['sku'])/* && empty($variant['name'])*/) Импорт начинает обновлять по Артикулу, а не по "Названию Варианта". Он находит соответствия для первых трех вариантов из файла в базе сайта (по артикулу) и обновляет их,НО не находит в базе сайта АРТИКУЛЫ для последний двух вариантов товара из файла - и как следствие, создает для них новые товары (2 шт.) 4. Задача состоит в том, чтобы поставить правильное условие для последних двух вариантов, которых нет в базе сайта и запрос к базе, в результате которого мы сохраним значение product_id от первых трех вариантов товара, которые уже есть в базе, и у которых ТАКОЕ ЖЕ НАЗВАНИЕ ТОВАРА и такой же URL ТОВАРА, как и у новых двух вариантов. Далее мы будем использовать полученный product_id для ДОБАВЛЕНИЯ к нему новых ВАРИАНТОВ товара, без создания НОВЫХ ТОВАРОВ. Quote Link to post Share on other sites
yoshkin Posted March 25, 2016 Author Report Share Posted March 25, 2016 Пробую переделать импорт. Желающие могут потестировать по адресу:http://demo.simpla-tuning.com/140817/simpla/index.php?module=ImportAdminПриветствуются замечания конкретного содержания с указанием ошибки и файла, при котором она возникает... Ваш вариант, кстати, корретно обрабатывает мой файл, покажите условия? Quote Link to post Share on other sites
yoshkin Posted March 25, 2016 Author Report Share Posted March 25, 2016 Пробовал делать импорт двумя файлами (оба в 1 архиве) 2 files.rar Quote Link to post Share on other sites
Kors Posted March 25, 2016 Report Share Posted March 25, 2016 4. Задача ... поставить правильное условие для последних двух вариантов... Изменять ТОЛЬКО условия в стандартном файле импорта - вряд ли что так выйдет. Надо менять всю схему сопоставления... Пробовал делать импорт двумя файлами (оба в 1 архиве) Непонятно, зачем это написано и что хотите этим сказать... Quote Link to post Share on other sites
yoshkin Posted March 25, 2016 Author Report Share Posted March 25, 2016 Изменять ТОЛЬКО условия в стандартном файле импорта - вряд ли что так выйдет. Надо менять всю схему сопоставления... Непонятно, зачем это написано и что хотите этим сказать... Хочу сказать, что ваш вариант - работает Quote Link to post Share on other sites
yoshkin Posted March 25, 2016 Author Report Share Posted March 25, 2016 Подскажите, что меняли? Ваш импорт в текущий момент учитывает все, описанное мной ранее Quote Link to post Share on other sites
Kors Posted March 25, 2016 Report Share Posted March 25, 2016 Подскажите, что меняли? Ваш импорт в текущий момент учитывает все, описанное мной ранее Изменена полностью часть, отвечающая за сопоставление... Quote Link to post Share on other sites
osben Posted March 25, 2016 Report Share Posted March 25, 2016 (edited) Корс ты же прекрасно понимаешь, что человек просить код сбросить. Скажи сразу что бесплатно ты не предоставишь и хочешь какую то сумму, а не дурака клеить (или что решение еще полностью не готово, как сделаешь - выложишь (или даже PR сделаешь ) ) Edited March 25, 2016 by osben Quote Link to post Share on other sites
Kors Posted March 25, 2016 Report Share Posted March 25, 2016 Корс ты же прекрасно понимаешь, что человек просить код сбросить. Скажи сразу что бесплатно ты не предоставишь и хочешь какую то сумму, а не дурака клеить (или что решение еще полностью не готово, как сделаешь - выложишь (или даже PR сделаешь ) ) Спасибо. Замечание Ваше правильное и ценное, но уже не актуальное.Ваш совет выполнен примерно за полдня до того, как он поступил... Quote Link to post Share on other sites
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.