ОБНОВЛЕНО: Magento добавляет фильтр атрибутов клиентов в сетку заказов - PullRequest
0 голосов
/ 21 июня 2011

Я расширил класс Mage_Adminhtml_Block_Sales_Order_Grid с помощью пользовательского модуля для добавления нескольких атрибутов клиента (Magento EE 1.10) в сетку.

Два из добавленных мною атрибутов являются текстовыми полями (то есть они живут в таблице customer_entity_varchar, и я смог добавить их в коллекцию и отобразить их в сетке. Пока все хорошо.

Третий атрибут - это выбор, поэтому значения хранятся в таблицах customer_entity_int, eav_attribute_option и eav_attribute_option_value. Я добавил необходимые значения в коллекцию (используя $collection->getSelect()->joinLeft(.....). Опять же, пока все хорошо.

Моя проблема заключается в возможности одновременного отображения атрибутов и .

Внутри функции _prepareColumns() в моем классе MyCompany_MyModule_Block_Adminhtml_Order_Grid, если я добавлю столбец, подобный этому, - как и ожидалось - я могу отобразить значения атрибута в каждой строке, но я не получаю выпадающий фильтр в шапке:

protected function _prepareColumns()
{
    ...
    $this->addColumn('bureau', array(
        'header'    => Mage::helper('sales')->__('Bureau'),
        'index'     => 'bureau',
        'type'      => 'text'
    ));
    ...
}

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

protected function _prepareColumns()
{
    ...
    $this->addColumn('bureau', array(
        'header'    => Mage::helper('sales')->__('Bureau'),
        'index'     => 'bureau',
        'type'      => 'options',
        'options'   => $this->_getBureauOptions(),
        'filter_index' => 'value_option_table.option_id'
    ));
    ...
}   

protected function _getBureauOptions()
{
    $bureau = Mage::getResourceModel('eav/entity_attribute_collection')
        ->setCodeFilter('bureau')
        ->getFirstItem();

    $bureauOptions = $bureau->getSource()->getAllOptions(false);
    $optionsArr = array();

    foreach ($bureauOptions as $option) {
        $optionsArr[$option['value']] = $option['label'];
    }

    return $optionsArr;
} 

Любой совет / объяснение будет высоко ценится.

UPDATE: Оказывается, мой код также вызывает ошибку SQL в среде с несколькими веб-сайтами, когда пользователь с правами администратора имеет разрешения только для некоторых веб-сайтов: "SQLSTATE[23000]: Integrity constraint violation: 1052 Column 'store_id' in where clause is ambiguous"

1 Ответ

0 голосов
/ 28 июня 2011

@ clockworkgeek получил ответ на первую часть моего вопроса.

Проблема заключалась в том, что мой joinLeft() получал текстовые значения из параметров атрибута, в то время как я должен был получать целочисленные значения при использовании 'type => 'options'.

Как только я изменил свой joinLeft(), чтобы получать только целочисленные значения из customer_entity_int (на самом деле более простое соединение), фильтрация и отображение работали безупречно - спасибо, сэр.

Iповторно напишет мою вторую проблему (об ошибках SQL, вызванных разрешениями) как отдельный вопрос.

...