Как добавить тип доставки в грид заказов

[10 ноября 2016 г.]    Российская сборка Magento 2.49.12
Magento 2: модули и услуги
#1 IgorN
  • Группа: Пользователь
  • Сообщений: 293
  • Регистрация: 09.03.2011

03.11.2011 12:49

Добрый день!

При создании заказа можно выбрать способ доставки. Клиент хочет что бы я отобразил его в гриде заказов.
Мне не удается обнаружить связь для добавления joinAttribute к коллекции.
Есть еще идея повесить свой класс на render и отталкиваясь от данных address_id и country_id обратится к нужным методам и узнать способ доставки.
Но не будет фильтрации и проблема в поиске нужных методов.

Буду благодарен за любую помощь.

#2 Дмитрий Федюк
  • Администратор
  • Иконка
  • Группа: Администратор
  • Сообщений: 8886
  • Регистрация: 20.02.2010

03.11.2011 12:51

В Magento заказы отображаются списком в разных местах, какой конкретно экран вы имеете в виду?

#3 IgorN
  • Группа: Пользователь
  • Сообщений: 293
  • Регистрация: 09.03.2011

03.11.2011 12:56

Sales->Orders

/index.php/admin/sales_order/index/

#4 Дмитрий Федюк
  • Администратор
  • Иконка
  • Группа: Администратор
  • Сообщений: 8886
  • Регистрация: 20.02.2010

03.11.2011 13:00

Как добавить колонку в административную таблицу

#5 IgorN
  • Группа: Пользователь
  • Сообщений: 293
  • Регистрация: 09.03.2011

03.11.2011 13:01

С добавлением колонки проблем нет. Проблема именно с данными для этой колонки.

#6 Дмитрий Федюк
  • Администратор
  • Иконка
  • Группа: Администратор
  • Сообщений: 8886
  • Регистрация: 20.02.2010

03.11.2011 13:05

Как автоматически загружать в коллекцию данные сразу из нескольких таблиц

#7 IgorN
  • Группа: Пользователь
  • Сообщений: 293
  • Регистрация: 09.03.2011

03.11.2011 13:08

Проблема именно в построении связи.
Удалось найти таблицу sales_flat_quote_shipping_rate в ней есть нужные данные, но не могу понять как построить связь, поле address_id не уникальное.

#8 Дмитрий Федюк
  • Администратор
  • Иконка
  • Группа: Администратор
  • Сообщений: 8886
  • Регистрация: 20.02.2010

03.11.2011 13:18

Выбранный покупателем способ доставки хранится прямо в основной таблице заказов sales_flat_order в графе shipping_method.

#9 IgorN
  • Группа: Пользователь
  • Сообщений: 293
  • Регистрация: 09.03.2011

03.11.2011 13:26

У меня нет такой таблицы :( Мажента 1.3.2

#10 Дмитрий Федюк
  • Администратор
  • Иконка
  • Группа: Администратор
  • Сообщений: 8886
  • Регистрация: 20.02.2010

03.11.2011 13:35

В устаревших версиях Magento (ранее 1.4) поле shipping_method содержится в таблице sales_flat_quote_address.

#11 IgorN
  • Группа: Пользователь
  • Сообщений: 293
  • Регистрация: 09.03.2011

03.11.2011 14:02

О, есть такое правда ключ owebiashipping3_Poste_france мне не сильно поможет, но есть описание, может его парсить буду.
Попытаюсь как то сделать связь, есть поле quote_id может по нему как то получится связать $collection = Mage::getResourceModel('sales/order_collection') с этой таблицей.

#12 IgorN
  • Группа: Пользователь
  • Сообщений: 293
  • Регистрация: 09.03.2011

03.11.2011 16:26

->joinAttribute('shipping_method', 'quote_address/shipping_method', 'entity_id', 'quote_id', 'left')
Вроде то что нужно.
Но появляется ошибка Item (Mage_Spplus_Model_Sales_Order) with the same id "2164" already exist
Не врублюсь почему.

#13 Дмитрий Федюк
  • Администратор
  • Иконка
  • Группа: Администратор
  • Сообщений: 8886
  • Регистрация: 20.02.2010

03.11.2011 18:52

А вы выполните формирующий коллекцию запрос вручную через phpMyAdmin и увидите, что у вас заказы в выборке дублируются.

#14 IgorN
  • Группа: Пользователь
  • Сообщений: 293
  • Регистрация: 09.03.2011

04.11.2011 10:23

А как это исправить? ->joinAttribute('shipping_method', 'quote_address/shipping_method', 'entity_id', 'quote_id', 'left') в метод больше вроде нечего не передать... Видать надо как то про другому, но как?

#15 Дмитрий Федюк
  • Администратор
  • Иконка
  • Группа: Администратор
  • Сообщений: 8886
  • Регистрация: 20.02.2010

04.11.2011 10:46

Как правило, дублирующие записи в языке SQL устраняют выражением distinct.

#16 IgorN
  • Группа: Пользователь
  • Сообщений: 293
  • Регистрация: 09.03.2011

04.11.2011 11:04

Но тут то мы работаем через коллекцию и доступные методы, а не с чистым SQL... Хочется понять как правильно сделать. Может метод другой заюзать...

#17 Дмитрий Федюк
  • Администратор
  • Иконка
  • Группа: Администратор
  • Сообщений: 8886
  • Регистрация: 20.02.2010

04.11.2011 11:05

Для начала - прочитать про выполение distinct средствами Zend Framework.

#18 IgorN
  • Группа: Пользователь
  • Сообщений: 293
  • Регистрация: 09.03.2011

04.11.2011 11:11

В зенде проще там у метода Zend_Db_Select есть метод distinct и при построенни запроса его можно заюзать. Тут же мажента сверху накинула кучу своих классов и как правильно сделать я не знаю. Патчить системные классы как то не комильфо...

#19 Дмитрий Федюк
  • Администратор
  • Иконка
  • Группа: Администратор
  • Сообщений: 8886
  • Регистрация: 20.02.2010

04.11.2011 11:14

У колллекции в Magento присутствует общедоступный метод getSelect - это и есть Zend_Db_Select.

#20 IgorN
  • Группа: Пользователь
  • Сообщений: 293
  • Регистрация: 09.03.2011

04.11.2011 11:24

У коллекции есть метод $collection->distinct();
Я его как то пропустил.
Но попробовал вывести запрос и выполнить его в phpmyadmin - отрабатывает c distinct и без distinct...
Но на странице та же ошибка.
Теперь, как то вообще не понятно в каком направлении копать.

#21 Дмитрий Федюк
  • Администратор
  • Иконка
  • Группа: Администратор
  • Сообщений: 8886
  • Регистрация: 20.02.2010

04.11.2011 11:30

Перечитать внимательно сообщение №13.

#22 IgorN
  • Группа: Пользователь
  • Сообщений: 293
  • Регистрация: 09.03.2011

04.11.2011 11:37

Да, туплю что то ))

#23 IgorN
  • Группа: Пользователь
  • Сообщений: 293
  • Регистрация: 09.03.2011

04.11.2011 11:43

Метод Distinct просто добавляет DISTINCT в запрос, и это не помогает. Мне необходимо добавить в запрос DISTINCT entity_id. Как правильно сделать без влезания в класс коллекции?

#24 IgorN
  • Группа: Пользователь
  • Сообщений: 293
  • Регистрация: 09.03.2011

04.11.2011 11:54

Пытаюсь через addExpressionAttributeToSelect, но явно метод не для этого.

#25 Дмитрий Федюк
  • Администратор
  • Иконка
  • Группа: Администратор
  • Сообщений: 8886
  • Регистрация: 20.02.2010

04.11.2011 11:55

Нпплохо бы вам ещё прочитать про разницу между видами join в языке SQL.

#26 IgorN
  • Группа: Пользователь
  • Сообщений: 293
  • Регистрация: 09.03.2011

04.11.2011 12:03

В метод можно передать left либо по умолчанию будет inner.
Т.е. при чем тут другие виды связи? Если в итоге будет
 $joinMethod = ($joinType == 'left') ? 'joinLeft' : 'join';


#27 Дмитрий Федюк
  • Администратор
  • Иконка
  • Группа: Администратор
  • Сообщений: 8886
  • Регистрация: 20.02.2010

04.11.2011 12:07

Вот и посмотрите на практике, в чём разница между left и inner.

#28 IgorN
  • Группа: Пользователь
  • Сообщений: 293
  • Регистрация: 09.03.2011

04.11.2011 12:09

Попробовал без left, тот же эффект и ошибка та же.

#29 Дмитрий Федюк
  • Администратор
  • Иконка
  • Группа: Администратор
  • Сообщений: 8886
  • Регистрация: 20.02.2010

04.11.2011 12:13

У вас получается, что INNER JOIN по первичному ключу приводит к дублированию первичных ключей в выборке.
Боюсь, этот ваш вывод противоречит реляционной алгебре.
Думаю, для вас будет лучшим для начала теорию SQL прочитать, а потом заново прочитать эту тему и сделать всё аккуратно, как я написал.

#30 IgorN
  • Группа: Пользователь
  • Сообщений: 293
  • Регистрация: 09.03.2011

04.11.2011 12:25

Пока не вижу связи. буду копаться.

#31 IgorN
  • Группа: Пользователь
  • Сообщений: 293
  • Регистрация: 09.03.2011

04.11.2011 13:02

Похоже не в ту сторону копал :)
В таблице sales_flat_quote_address на каждый заказ приходится по 2 записи c address_type = billing and address_type = shipping.
Тут distinct и др. манипуляции не помогут.
Похоже надо заюзать метод join и при объединении прописать address_type = 'shipping'

#32 IgorN
  • Группа: Пользователь
  • Сообщений: 293
  • Регистрация: 09.03.2011

04.11.2011 13:29

$collection->getSelect()->joinLeft('sales_flat_quote_address', 'sales_flat_quote_address.quote_id=e.entity_id AND address_type="shipping"', array('shipping_description', 'shipping_method')); - вот таким способом решил задачу.

Поделиться темой: