ОБНОВЛЕНО: Magento добавляет фильтр атрибутов клиента в сетку заказов

Я продлил 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;
} 

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

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

1 ответ

Решение

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

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

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

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

Другие вопросы по тегам