Создание сетки позиций заказа в Magento

Я работаю над созданием сетки позиций заказов на продажу в Magento 1.7. Для этого я создал новое подменю в меню «Продажи» в админке. В сетке Order Item каждый заказанный продукт будет отображаться в новой строке. Следовательно, в сетке может быть несколько идентификаторов OrderId. Мой запрос в классе сетки:

$collection = Mage::getResourceModel('sales/order_collection')
        ->join(
            'sales/order_item',
            '`sales/order_item`.order_id=`main_table`.entity_id',
            array(
                'skus'  => `sales/order_item`.`sku`,
                'names' => `sales/order_item`.`name`,
                'order_incharge' => `sales/order_item`.`order_incharge` ,
                'proptions' => `sales/order_item`.`product_options` ,

            ));

У меня нет предложения GroupBy. Когда я печатаю этот запрос в журнале, он выглядит так:

SELECT `main_table`.* FROM `sales_flat_order` AS `main_table` INNER JOIN `sales_flat_order_item` AS `sales/order_item` ON `sales/order_item`.order_id=`main_table`.entity_id

У меня есть 2 заказа в моей базе. Идентификатор заказа = 24 имеет два продукта. Идентификатор заказа 25 имеет один продукт. Таким образом, приведенный выше запрос при запуске в базе данных правильно отображает 3 записи. Однако это не отображается в сетке. Я получаю следующую ошибку при попытке отобразить в сетке:

Item (Mage_Sales_Model_Order) with the same id "24" already exist";i:1;s:4274:"#0 C:\wamp\www\bakery\lib\Varien\Data\Collection\Db.php(576): Varien_Data_Collection->addItem(Object(Mage_Sales_Model_Order))

Как решить эту проблему, чтобы в коллекцию можно было добавить тот же идентификатор заказа?

Спасибо, Нит


person neetw    schedule 10.08.2013    source источник


Ответы (2)


Вы должны получить sales/order_item_collection, а затем присоединиться к таблице sales/order вместо этого.

Ваша проблема в том, что вы отображаете информацию о заказе для каждой позиции в заказе. Вместо этого вы должны получать информацию об элементе конкретно и смешивать некоторую информацию о заказе с объединением.

В зависимости от того, что вы хотите, вам может даже не понадобиться присоединяться к таблице sales/order — вам может понадобиться только коллекция sales/order_item.

person Emery King    schedule 11.08.2013
comment
Это не дает ответа на вопрос. Чтобы подвергнуть критике или запросить разъяснения у автора, оставьте комментарий под его публикацией. - person Tala; 11.08.2013
comment
Это ответ. Это просто сказано. - person Emery King; 11.08.2013
comment
Привет, Маршалл. Спасибо за совет. Он отлично работал, получив файл sales/order_item_collection. - person neetw; 12.08.2013
comment
Привет, Есть еще один запрос. Когда пользователь выбирает элемент из сетки элементов заказа на продажу в admin, он должен перенаправляться на страницу сведений о заказе для этого заказа. Но эти ссылки генерируются вызовом $row->getId(), который возвращает идентификатор order_item, а не order_id. Как это исправить? public function getRowUrl($row) { if (Mage::getSingleton('admin/session')-›isAllowed('sales/order/actions/view')) { return $this-›getUrl('*/sales_order/view ', array('order_id' => $row->getId())); } вернуть ложь; } Спасибо, Нит - person neetw; 12.08.2013
comment
просто измените $row->getId() на $row->getOrderId() - person Emery King; 12.08.2013
comment
Может ли кто-нибудь опубликовать пример того, как в коде будет выполнено это соединение? - person skyler; 18.03.2014
comment
@skyler ... прошло несколько лет, но, возможно, кто-то еще сможет его использовать: объект коллекции элементов заказа уже реализует Mage_Core_Model_Mysql4_Collection_Abstract. Это означает, что метод соединения не нуждается в массиве для таблицы, и вам не нужно получать таблицу вручную. Просто определите модель «продажи/коллекция_предметов_заказа», например: - person Stefan; 17.05.2018

Спасибо Маршаллу за то, что указал мне правильное направление. Вот мое решение, если оно кому-то нужно

MY_MODULE_Block_Adminhtml_Order_Grid

protected function _getCollectionClass()
{
   // This is the model we are using for the grid
   // We need to work with the item collection and join the sales/order table because we wanna show one item per line
   return 'sales/order_item_collection';
}

protected function _prepareCollection()
{
    // Get the collection for the grid
    $collection = Mage::getResourceModel($this->_getCollectionClass())

    // Join the order table
    // The order item collection object already implements Mage_Core_Model_Mysql4_Collection_Abstract. 
    // That means, the join method doesn't need an array for the table and you don't need to get the table manually. 
    ->join('order', 'order_id=entity_id')

    // Get the address
    ->join(array('a' => 'sales/order_address'), 'order.entity_id = a.parent_id AND a.address_type != \'billing\'', array(
        'city'       => 'city',
        'postcode'   => 'postcode',
        'region'     => 'region',
        'country_id' => 'country_id',
        'street'     => 'street',
        'telephone'  => 'telephone'
    ))

    // Get the customer group
    ->join(array('c' => 'customer/customer_group'), 'order.customer_group_id = c.customer_group_id', array(
            'customer_group_code' => 'customer_group_code'
    ))

    // Concat customer name
    ->addExpressionFieldToSelect(
        'customer_name',
        'CONCAT({{customer_firstname}}, \' \', {{customer_lastname}})',
        array('customer_firstname' => 'order.customer_firstname', 'customer_lastname' => 'order.customer_lastname'))
    ;
person Stefan    schedule 17.05.2018