Jump to content
Sign in to follow this  
Einshtein

[Решено] Дублировать данные из одной таблицы в другую

Recommended Posts

Нужно в бд дублировать данные при заказе товара в таблицу Order_product (колонка upc) из таблицы product (колонка upc)

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

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

Я залез в бд и решил посмотреть в чем дело. Оказалось что в таблице Product все данные сохраняются нормально, но в order_product стоит значение "0", хотя если вручную в базе вбить название поставщика в эту колонку, в этом заказе в админке всё нормально показывает. Вот я и подумал что нужно каким то образом вытягивать данные из таблицы product.

Для этого в файле adminmodelsaleorder.php я прописал следующий код (по примеру "model", да и вообще все делал по примеру модели товара)

"', upc = '" . $this->db->escape($return_product['upc']) .

Результат всё равно нулевой.

Так же правкам подвергался admincontrollersaleorder.php

$this->data['entry_upc'] = $this->language->get('entry_upc');

$this->data['column_upc'] = $this->language->get('column_upc');

'upc'			=> $product_info['upc'],

'upc'		 => $product['upc'],

А так же adminviewtemplatesaleorder_info.tpl

<td class="right"><?php echo $column_upc; ?></td>

<td class="right"><?php echo $product['upc']; ?></td>

Мб ктонить подскажет где рыть и в чем я не прав?

Ах да, версия магазина ocstore 1.5.1.3

Share this post


Link to post
Share on other sites

Вот я и подумал что нужно каким то образом вытягивать данные из таблицы product.

Вам нужно расширить модель заказа, а не «вытягивать данные из таблицы product».

Мб ктонить подскажет где рыть и в чем я не прав?

Вы архитектурно неправильно подошли к решению задачи, извините, но Ваш подход напоминает знаменитый подход «танком по воробьям», предполагаю, что это происходит от недопонимания модели MVC и архитектуры OpenCart в целом!

Share this post


Link to post
Share on other sites

Вы правильно всё поняли, я далеко не программист и порой не понимаю простых прописных истин, но пытаюсь по ходу работы разобраться.

По моей логике вещей вывести нужную мне колонку из карточки товара в заказ можно по принципу вывода модели товара...

А что вы имели ввиду под "расширить модель заказа" ?

Share this post


Link to post
Share on other sites

Под расширением модели заказа я как раз и подразумевал дополнение модели заказа необходимой Вам информацией (название поставщика)! :wink:

Я реализовывал данную задачу в более широком варианте (список поставщиков с их контактными данными, код товара у поставщика, себестоимость товара у поставщика и т.п.) так что попробую кратко указать на ошибки:

Оказалось что в таблице Product все данные сохраняются нормально, но в order_product стоит значение "0", хотя если вручную в базе вбить название поставщика в эту колонку, в этом заказе в админке всё нормально показывает. Вот я и подумал что нужно каким то образом вытягивать данные из таблицы product.

Таблица order_product по умолчанию не содержит поле upc, так как оно не входит в модель заказа, соответственно не может содержать какие либо данные. Если Вы добавили данное поле самостоятельно, то Вам нужно определиться с подходом, Вы либо «вытягиваете данные из таблицы product» либо расширяете модель заказа, а у Вас получается не то не другое!

Смысл этой строки

"', upc = '" . $this->db->escape($return_product['upc']) .

если в модели товаре уже содержится данная информация ($product['upc'])?

Share this post


Link to post
Share on other sites

Спасибо за ответ.

Сейчас попытаюсь обьяснить что я хочу.

В карточке товара была строка "upc" - для моего магазина абсолютно ненужная, я её просто переименовал в "поставщик" и контенты при наполнении товара будут указывать в этой строке поставщика товара. Это стандартная процедура которая у нас происходит, только для этого я раньше создавал другое поле, где указывались все контактные данные поставщика и урл сайта поставщика.

Но сейчас мы столкнулись с проблемой когда товаров много, а поставщиков ещё больше. Контакты со всеми поставщиками у нас есть, зная поставщика товара который заказали мы легко выйдем с ним на связь. Для этого я хочу выводить имя поставщика данного товара в заказ.

Так как информации никакой я не нашел по выводу дополнительных строк в заказе, приходится самому разбираться в процессе. И я решил пойти по простому пути взяв за основу код отвечающий за вывод модели товара. В общем то вывести дополнительную колонку в заказ мне удалось, но вот она остается пустой. Вы подтвердили мои подозрения сказав что изначально upc колонка отсутствует в order_product и поэтому неможет содержать данных, вот я и подумал что было бы логично указать ей путь к таблице product и колонке upc в этой таблице. Но как это сделать я не знаю.

Мне пока что не нужно вести статистику и сбор данных о поставщиках. Для этого у меня в скором времени будет модуль 1с. Хочу просто вытягивать данные из карточки товара с "поставщика" в заказ.

Скрины на всякий:

Карточка товара

Изображение

Заказ:

Изображение

Order_product

Изображение

Share this post


Link to post
Share on other sites

Ясно, для начала уберите строку (admincontrollersaleorder.php):

'upc' => $product_info['upc'],

она дублирует:

'upc' => $product['upc'],

Share this post


Link to post
Share on other sites

убрал.

Как я понимаю обращение

'upc' => $product['upc'],
ведет к таблице "product", к колонке "upc" ?

Share this post


Link to post
Share on other sites

убрал.

Как я понимаю обращение

'upc' => $product['upc'],
ведет к таблице "product", к колонке "upc" ?

Нет, это выборка из таблицы order_product.

  • +1 1

Share this post


Link to post
Share on other sites

Расширяем модель заказа:

1. В файле catalogcontrollercheckoutconfirm.php найдите массив product_data и добавьте после поля tax данную строку:

'upc'		=> $product['upc'],

2. В файле catalogmodelcheckoutorder.php найдите цикл foreach ($data['products'] as $product) и добавьте после (float)$product['tax'] данный кусок кода:

. "', upc = '" . $this->db->escape($product['upc'])

3. В файле systemlibrarycart.php найдите массив product_data и добавьте после поля height данную строку:

'upc'	   => $product_query->row['upc'],

Для проверки того что мы с Вами натворили, проведите тестовый заказ с товаром, у которого прописан поставщик (поле upc) и проверьте через phpMyAdmin поле upc в таблице order_product. Если Вы все сделали правильно, то поле будет заполнено.

  • +1 1

Share this post


Link to post
Share on other sites

Я бы данную задачу решал примерно так:

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

В карточке товара добавил бы множественный выбор поставщиков товара.

В заказе записывать всех поставщиков товара - можно, но это плохо... правильнее в не закрытом заказе отображать всех поставщиков, вытягивая их из таблицы поставщиков, а при изменении статуса заказа на "Отгружен" - отмечать в заказе от какого поставщика товар ушел клиенту... эту информацию уже надо писать в таблицу заказов. Это и для статистики и для понимания к какому поставщику обращаться в случае проблем с товаром.

Share this post


Link to post
Share on other sites

Полностью с тобой согласен, именно такое решение я и реализовывал, о чем указал выше:

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

Но если ты перечитаешь тему, то наткнешься на такие слова топикстартера:

Мне пока что не нужно вести статистику и сбор данных о поставщиках. Для этого у меня в скором времени будет модуль 1с. Хочу просто вытягивать данные из карточки товара с "поставщика" в заказ.

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

Share this post


Link to post
Share on other sites

Хочу поблагодарить CODEONETEAM за помощь :) Прошло несколько месяцев, я набрался немного знаний и вернулся к данной теме. Случайно нашел эту тему и она мне очень помогла :)

  • +1 1

Share this post


Link to post
Share on other sites

Всегда, пожалуйста! Рад, что Вы смогли разобраться в данном вопросе :wink:

  • +1 2

Share this post


Link to post
Share on other sites

Тема просто бомба, думал что только я этим страдал

Спасибо парни за подсказку!

Share this post


Link to post
Share on other sites

почему то не получается :( (дублирую sku)

 

во все указанные CODEONETEAM файлы внес поправки согласно образца переменной model

 

ошибка получается в файле

 

2016-11-20 3:24:05 - PHP Notice:  Undefined index: sku in /.../catalog/model/checkout/order.php on line 9

 

в дефолтном файле там код

$this->db->query("INSERT INTO " . DB_PREFIX . "order_product SET order_id = '" . (int)$order_id . "', product_id = '" . (int)$product['product_id'] . "', name = '" . $this->db->escape($product['name']) . "', model = '" . $this->db->escape($product['model']) . "', quantity = '" . (int)$product['quantity'] . "', price = '" . (float)$product['price'] . "', total = '" . (float)$product['total'] . "', tax = '" . (float)$product['tax'] . "', reward = '" . (int)$product['reward'] . "'");
 

я изменяю так

 

$this->db->query("INSERT INTO " . DB_PREFIX . "order_product SET order_id = '" . (int)$order_id . "', product_id = '" . (int)$product['product_id'] . "', name = '" . $this->db->escape($product['name']) . "', model = '" . $this->db->escape($product['model']) . "', sku = '" . $this->db->escape($product['sku']) . "', quantity = '" . (int)$product['quantity'] . "', price = '" . (float)$product['price'] . "', total = '" . (float)$product['total'] . "', tax = '" . (float)$product['tax'] . "', reward = '" . (int)$product['reward'] . "'");
в таблице oc_order_product поле sku вставил после поля model

 

 

подскажите пожалуйста, почему ошибка

 

релиз - OCSHOP.CMS Версия 1.5.6.4

Edited by cherkas

Share this post


Link to post
Share on other sites

причину нашел, как исправить не знаю (

. "', sku = '" . $this->db->escape($product['sku']) .
если в место

$this->db->escape($product['sku'])
вставить

"артикул"

т.е.

. "', sku = '" . "артикул"
то в нужную таблицу в нужное поле попадает значение - артикул

т.е. получается переменная не правильно написана или от куда то не передается.

Edited by cherkas

Share this post


Link to post
Share on other sites

или от куда то не передается.

Это точно, если совсем упростить дебагинг не видя проекта, то просто идите по цепочке, начните с места первой вставки, например здесь: system\library\cart.php так же, как Вы уже делали, замените значение $product_query->row['sku'] на 'test' и проверьте результат и т.д.

Share this post


Link to post
Share on other sites

Это точно, если совсем упростить дебагинг не видя проекта, то просто идите по цепочке, начните с места первой вставки, например здесь: system\library\cart.php так же, как Вы уже делали, замените значение $product_query->row['sku'] на 'test' и проверьте результат и т.д.

заменил так

 

$this->data[$key] = array(
	'key'                       => $key,
	'product_id'                => $product_query->row['product_id'],
	'name'                      => $product_query->row['name'],
	'model'                     => $product_query->row['model'],
	'sku'                     => "test",

...

в БД ничего не попало

Share this post


Link to post
Share on other sites

Значит проблема в catalog\controller\checkout\confirm.php, проверьте его внимательно.

Share this post


Link to post
Share on other sites

там в 2-х местах добавлен sku и в одном месте column_sku

 

вроде бы всё правильно, я скопировал строку model  и поменял только имя переменной

confirm.php

Edited by cherkas

Share this post


Link to post
Share on other sites

На первый взгляд действительно все верно.

Share this post


Link to post
Share on other sites

На первый взгляд действительно все верно.

 

 

с одной стороны это радует конечно :)

 

а с другой всё равно не работает

 

а есть еще какие нибудь варианты/мысли по этому поводу?

Edited by cherkas

Share this post


Link to post
Share on other sites

а есть еще какие нибудь варианты/мысли по этому поводу?

Возможны мелкие отличия в коде ocstore 1.5.1.3 и OCSHOP.CMS 1.5.6.4, но это уже нужно смотреть на живую, а я со свободным временем к сожалению, не дружу.

Share this post


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
You are posting as a guest. If you have an account, please sign in.
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.

Sign in to follow this  

  • Recently Browsing   0 members

    No registered users viewing this page.

×

Important Information

On our site, cookies are used and personal data is processed to improve the user interface. To find out what and what personal data we are processing, please go to the link. If you click "I agree," it means that you understand and accept all the conditions specified in this Privacy Notice.