yoshkin Опубликовано 24 марта, 2016 Жалоба Поделиться Опубликовано 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'; } } Цитата Ссылка на сообщение Поделиться на другие сайты
Kors Опубликовано 24 марта, 2016 Жалоба Поделиться Опубликовано 24 марта, 2016 Подскажите, ... чтобы новые варианты добавились уже существующему товару и не создавались новые товары К одному - какому? Все равно какому, к какому нибудь, например, первому в списке? Действительно хотите такое? Котаны, помогите советом. Для начала попробовать понять ТОЧНО, что Вы хотите получить.И осознать, что вопрос серьезный и подходить к нему надо соответственно, а не кое-как. А если в CSV добавить новые варианты товара, то импорт создаст "новые товары". Обычно импорт, несмотря на свои недостатки, все создает как надо.Если у Вас не так, то свои проблемы надо описывать не тяп-ляп, а ТОЧНО, с примерами файлов, на которых работает неправильно. Вот тогда у Вас будет хороший шанс разрешить свой вопрос... Цитата Ссылка на сообщение Поделиться на другие сайты
yoshkin Опубликовано 24 марта, 2016 Автор Жалоба Поделиться Опубликовано 24 марта, 2016 Пример:На сайте есть Товар, у которого название товара "1234567890"У этого товара есть несколько вариантов, у каждого есть свой артикул. Если экспортировать с сайта, скорректировать данные в файле CSV, а затем импортировать - проблем не будет. Если в файл CSV добавить еще варианты этому же товару, тогда после проверок, указанных выше отработает функция создания нового товара, а не добавления варианта к существущему по признаку "название товара" == "1234567890" Нужно, чтобы по признаку "название товара" к товару добавились новые варианты, а не создавались новые товары. Цитата Ссылка на сообщение Поделиться на другие сайты
Kors Опубликовано 24 марта, 2016 Жалоба Поделиться Опубликовано 24 марта, 2016 Нужно, чтобы по признаку "название товара" к товару добавились новые варианты, а не создавались новые товары....свои проблемы надо описывать не тяп-ляп, а ТОЧНО, с примерами файлов... Цитата Ссылка на сообщение Поделиться на другие сайты
yoshkin Опубликовано 24 марта, 2016 Автор Жалоба Поделиться Опубликовано 24 марта, 2016 Не получается приложить файл к посту вот скрин: http://prntscr.com/ajegjm Цитата Ссылка на сообщение Поделиться на другие сайты
yoshkin Опубликовано 24 марта, 2016 Автор Жалоба Поделиться Опубликовано 24 марта, 2016 В архиве получилось__export (7).rar Цитата Ссылка на сообщение Поделиться на другие сайты
yoshkin Опубликовано 24 марта, 2016 Автор Жалоба Поделиться Опубликовано 24 марта, 2016 Грубо говоря, мне нужно получить результат, при котором для варианта (которого еще нет в базе сайта)был сохранен product_id, а variant_id имел пустое значение вот тут: $r = $this->db->result(); if($r) { $product_id = $r->product_id; $variant_id = $r->variant_id; } Цитата Ссылка на сообщение Поделиться на другие сайты
yoshkin Опубликовано 24 марта, 2016 Автор Жалоба Поделиться Опубликовано 24 марта, 2016 Что вот тут второе условие не выполнилось: elseif(empty($variant_id)) { if(empty($product_id)) $product_id = $this->products->add_product($product); Цитата Ссылка на сообщение Поделиться на другие сайты
Kors Опубликовано 24 марта, 2016 Жалоба Поделиться Опубликовано 24 марта, 2016 Вы набрели на очередную ошибку в импорте. Она связана с тем, что у Вас строчки файла импорта почти одинаковы и из важных для сопоставления полей отличаются только артикулом. А в импорту не по зубам даже более простые ситуации, чем у Вас:http://simpla-tuning.com/import-oshibki-i-neratsionalnosti Надо ошибку находить и исправлять. Если готовы оплачивать - обращайтесь... Цитата Ссылка на сообщение Поделиться на другие сайты
yoshkin Опубликовано 24 марта, 2016 Автор Жалоба Поделиться Опубликовано 24 марта, 2016 Если закомментировать одно из условий: if(!empty($variant['sku'])/* && empty($variant['name'])*/) Импорт начинает обновлять по Артикулу, а не по "Названию Варианта" (когда обновлял по названию варианта - он перезаписывал значения несколько раз у первого варианта, но при этом не создавал новые товары) Но Когда начал обновлять только по Артикулу - начал создавать новые товары (т.к. в базе у данного товара не было вариантов с двумя последними артикулами) Получается, нужно еще 1 условие, либо еще 1 запрос в другом месте, который будет связывать такие варианты товара с НАЗВАНИЕМ ТОВАРА.В нашем конкретном случае с его id (product_id) По поводу оплаты - мне уже самому интересно, как это лучше решить без лишнего говнокода. Цена вопроса? Цитата Ссылка на сообщение Поделиться на другие сайты
osben Опубликовано 24 марта, 2016 Жалоба Поделиться Опубликовано 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']); Цитата Ссылка на сообщение Поделиться на другие сайты
Kors Опубликовано 24 марта, 2016 Жалоба Поделиться Опубликовано 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 Во всяком случае, объяснить вразумительно автор не может... Цитата Ссылка на сообщение Поделиться на другие сайты
osben Опубликовано 24 марта, 2016 Жалоба Поделиться Опубликовано 24 марта, 2016 как вариант делать поиск еще по урл товару на совпадение (если ета колонка есть) Цитата Ссылка на сообщение Поделиться на другие сайты
Kors Опубликовано 25 марта, 2016 Жалоба Поделиться Опубликовано 25 марта, 2016 как вариант делать поиск еще по урл товару на совпадение (если ета колонка есть) Это не исправляет ситуацию для примера, который дал ТС. В примере все URL одинаковые, так как предполагается, что это варианты ОДНОГО ТОВАРА."Как вариант" - можно нафантазировать еще десятки способов... Цитата Ссылка на сообщение Поделиться на другие сайты
Kors Опубликовано 25 марта, 2016 Жалоба Поделиться Опубликовано 25 марта, 2016 Пробую переделать импорт. Желающие могут потестировать по адресу:http://demo.simpla-tuning.com/140817/simpla/index.php?module=ImportAdminПриветствуются замечания конкретного содержания с указанием ошибки и файла, при котором она возникает... Цитата Ссылка на сообщение Поделиться на другие сайты
yoshkin Опубликовано 25 марта, 2016 Автор Жалоба Поделиться Опубликовано 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']); это у меня было еще задолго до возникновения проблемы) Цитата Ссылка на сообщение Поделиться на другие сайты
yoshkin Опубликовано 25 марта, 2016 Автор Жалоба Поделиться Опубликовано 25 марта, 2016 Давайте тогда еще раз попробую описать суть вопроса, если вдруг до этого неясно объяснил.Мне проблема понятна, но вот решить ее - пока не могу (скорее в силу недостаточного опыта). 1. На сайте есть товар, к которого есть 3 варианта товара:- у всех трех вариантов одинаковое название варианта (либо вообще не будет названия варианта). Давайте забудем про привязку к этому параметру.- у всех трех вариантов товара есть уникальный артикул.- у всех трех вариантов товара есть общее: НАЗВАНИЕ САМОГО ТОВАРА (как следствие и URL) См пример: 2. При использовании стандартного импорта для файла указанного выше прозойдет следующее: - импорт при прохождении по файлу двумя последними (новыми) вариантами товара, которых еще нет в базе сайта - перезапишет первый вариант товара в базе сайта, т.к. найдет соответствие по НАЗВАНИЮ ВАРИАНТА. 3. Если закомментировать одно из условий: if(!empty($variant['sku'])/* && empty($variant['name'])*/) Импорт начинает обновлять по Артикулу, а не по "Названию Варианта". Он находит соответствия для первых трех вариантов из файла в базе сайта (по артикулу) и обновляет их,НО не находит в базе сайта АРТИКУЛЫ для последний двух вариантов товара из файла - и как следствие, создает для них новые товары (2 шт.) 4. Задача состоит в том, чтобы поставить правильное условие для последних двух вариантов, которых нет в базе сайта и запрос к базе, в результате которого мы сохраним значение product_id от первых трех вариантов товара, которые уже есть в базе, и у которых ТАКОЕ ЖЕ НАЗВАНИЕ ТОВАРА и такой же URL ТОВАРА, как и у новых двух вариантов. Далее мы будем использовать полученный product_id для ДОБАВЛЕНИЯ к нему новых ВАРИАНТОВ товара, без создания НОВЫХ ТОВАРОВ. Цитата Ссылка на сообщение Поделиться на другие сайты
yoshkin Опубликовано 25 марта, 2016 Автор Жалоба Поделиться Опубликовано 25 марта, 2016 Пробую переделать импорт. Желающие могут потестировать по адресу:http://demo.simpla-tuning.com/140817/simpla/index.php?module=ImportAdminПриветствуются замечания конкретного содержания с указанием ошибки и файла, при котором она возникает... Ваш вариант, кстати, корретно обрабатывает мой файл, покажите условия? Цитата Ссылка на сообщение Поделиться на другие сайты
yoshkin Опубликовано 25 марта, 2016 Автор Жалоба Поделиться Опубликовано 25 марта, 2016 Пробовал делать импорт двумя файлами (оба в 1 архиве) 2 files.rar Цитата Ссылка на сообщение Поделиться на другие сайты
Kors Опубликовано 25 марта, 2016 Жалоба Поделиться Опубликовано 25 марта, 2016 4. Задача ... поставить правильное условие для последних двух вариантов... Изменять ТОЛЬКО условия в стандартном файле импорта - вряд ли что так выйдет. Надо менять всю схему сопоставления... Пробовал делать импорт двумя файлами (оба в 1 архиве) Непонятно, зачем это написано и что хотите этим сказать... Цитата Ссылка на сообщение Поделиться на другие сайты
yoshkin Опубликовано 25 марта, 2016 Автор Жалоба Поделиться Опубликовано 25 марта, 2016 Изменять ТОЛЬКО условия в стандартном файле импорта - вряд ли что так выйдет. Надо менять всю схему сопоставления... Непонятно, зачем это написано и что хотите этим сказать... Хочу сказать, что ваш вариант - работает Цитата Ссылка на сообщение Поделиться на другие сайты
yoshkin Опубликовано 25 марта, 2016 Автор Жалоба Поделиться Опубликовано 25 марта, 2016 Подскажите, что меняли? Ваш импорт в текущий момент учитывает все, описанное мной ранее Цитата Ссылка на сообщение Поделиться на другие сайты
Kors Опубликовано 25 марта, 2016 Жалоба Поделиться Опубликовано 25 марта, 2016 Подскажите, что меняли? Ваш импорт в текущий момент учитывает все, описанное мной ранее Изменена полностью часть, отвечающая за сопоставление... Цитата Ссылка на сообщение Поделиться на другие сайты
osben Опубликовано 25 марта, 2016 Жалоба Поделиться Опубликовано 25 марта, 2016 (изменено) Корс ты же прекрасно понимаешь, что человек просить код сбросить. Скажи сразу что бесплатно ты не предоставишь и хочешь какую то сумму, а не дурака клеить (или что решение еще полностью не готово, как сделаешь - выложишь (или даже PR сделаешь ) ) Изменено 25 марта, 2016 пользователем osben Цитата Ссылка на сообщение Поделиться на другие сайты
Kors Опубликовано 25 марта, 2016 Жалоба Поделиться Опубликовано 25 марта, 2016 Корс ты же прекрасно понимаешь, что человек просить код сбросить. Скажи сразу что бесплатно ты не предоставишь и хочешь какую то сумму, а не дурака клеить (или что решение еще полностью не готово, как сделаешь - выложишь (или даже PR сделаешь ) ) Спасибо. Замечание Ваше правильное и ценное, но уже не актуальное.Ваш совет выполнен примерно за полдня до того, как он поступил... Цитата Ссылка на сообщение Поделиться на другие сайты
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.