Перейти к содержанию
Einshtein

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

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

Нужно в бд дублировать данные при заказе товара в таблицу 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

Поделиться сообщением


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

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

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

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

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

Поделиться сообщением


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

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

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

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

Поделиться сообщением


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

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

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

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

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

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

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

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

Поделиться сообщением


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

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

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

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

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

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

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

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

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

Изображение

Заказ:

Изображение

Order_product

Изображение

Поделиться сообщением


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

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

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

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

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

Поделиться сообщением


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

убрал.

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

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

Поделиться сообщением


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

убрал.

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

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

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

  • +1 1

Поделиться сообщением


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

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

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

Поделиться сообщением


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

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

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

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

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

Поделиться сообщением


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

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

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

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

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

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

Поделиться сообщением


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

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

  • +1 1

Поделиться сообщением


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

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

  • +1 2

Поделиться сообщением


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

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

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

Поделиться сообщением


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

почему то не получается :( (дублирую 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

Изменено пользователем cherkas

Поделиться сообщением


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

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

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

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

"артикул"

т.е.

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

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

Изменено пользователем cherkas

Поделиться сообщением


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

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

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

Поделиться сообщением


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

Это точно, если совсем упростить дебагинг не видя проекта, то просто идите по цепочке, начните с места первой вставки, например здесь: 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",

...

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

Поделиться сообщением


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

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

Поделиться сообщением


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

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

 

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

confirm.php

Изменено пользователем cherkas

Поделиться сообщением


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

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

Поделиться сообщением


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

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

 

 

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

 

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

 

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

Изменено пользователем cherkas

Поделиться сообщением


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

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

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

Поделиться сообщением


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

Для публикации сообщений создайте учётную запись или авторизуйтесь

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

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти

  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу

×

Важная информация

На нашем сайте используются файлы cookie и происходит обработка некоторых персональных данных пользователей, чтобы улучшить пользовательский интерфейс. Чтобы узнать для чего и какие персональные данные мы обрабатываем перейдите по ссылке. Если Вы нажмете «Я даю согласие», это означает, что Вы понимаете и принимаете все условия, указанные в этом Уведомлении о Конфиденциальности.