проблема пробелов magento admin html grid рендерер - PullRequest
1 голос
/ 07 июня 2011

Я переписал app/code/core/Mage/Adminhtml/Block/Sales/Order/Grid.php с app/code/local/Mage/Adminhtml/Block/Sales/Order/Grid.php & создали средство визуализации для отображения столбца электронной почты клиента в сетке.

Вот мой файл рендерера:

class Mage_Adminhtml_Block_Renderer_Customer extends Mage_Adminhtml_Block_Widget_Grid_Column_Renderer_Abstract 
{

public function render(Varien_Object $row)
{   
    $model = Mage::getModel('customer/customer')->load($row->getCustomerId());

    return  $model->getEmail();

 }

}

& вот мои изменения в Grid (я только что добавил столбец и собираюсь сделать его доступным для поиска)

$this->addColumn('billing_name', array(
        'header' => Mage::helper('sales')->__('Bill to Name'),
        'index' => 'billing_name',
    ));
       // this is new col.
    $this->addColumn('customer_email', array(
        'header' => Mage::helper('sales')->__('Customer Email'),
        'renderer' => 'adminhtml/renderer_customer',

    ));

Я получаю то, что хочу. Но этот столбец имеет много пробелов, как ведущих, так и конечных из-за этого я думаю, что это сед. не в состоянии поиска. Кто-нибудь может подсказать, что можно сделать, чтобы убрать эти пробелы

Большое спасибо заранее

EDIT Через несколько дней я понял, что эти пробелы являются общими в сетке, и это не имеет ничего общего с опцией поиска. Кто-нибудь может подсказать, как сделать пользовательский столбец в состоянии поиска, который был добавлен в сетку с помощью рендерера ??? Спасибо

2 РЕДАКТИРОВАТЬ Ребята Согласно Clockworkgeek я настроил мой _prepareCollection() метод перезаписанной сетки следующим образом

 protected function _prepareCollection()
  { 
    // 'sales/order_collection' is changed from 'sales/order_grid_collection'
    $collection = Mage::getResourceModel('sales/order_collection');  

    $collection->addAttributeToSelect('*')
    ->joinAttribute('billing_firstname', 'order_address/firstname', 'billing_address_id', null, 'left')
    ->joinAttribute('billing_lastname', 'order_address/lastname', 'billing_address_id', null, 'left')
    ->joinAttribute('shipping_firstname', 'order_address/firstname', 'shipping_address_id', null, 'left')
    ->joinAttribute('shipping_lastname', 'order_address/lastname', 'shipping_address_id', null, 'left')
    ->joinAttribute('billing_fax', 'order_address/fax', 'billing_address_id', null, 'left')
    ->joinAttribute('billing_telephone', 'order_address/telephone', 'billing_address_id', null, '')

    ->addExpressionAttributeToSelect('billing_name',
    'CONCAT({{billing_firstname}}, " ", {{billing_lastname}})',
    array('billing_firstname', 'billing_lastname'))


    ->addExpressionAttributeToSelect('shipping_name',
    'CONCAT({{shipping_firstname}}, " ", {{shipping_lastname}})',
    array('shipping_firstname', 'shipping_lastname'));

    $this->setCollection($collection);
    return parent::_prepareCollection();
}

Я также исследовал, что для Grid Magento получает данные из таблицы sales_flat_order_grid , а не из sales_flat_order , именно поэтому он сообщает об ошибке в неизвестном столбце согласно clockworkgeek первое решение

Проблема с текущей реализацией заключается в том, что Magento сообщает об ошибке Неустранимая ошибка: вызов неопределенного метода Mage_Sales_Model_Mysql4_Order_Collection :: addExpressionAttributeToSelect ()

, поскольку Mage_Sales_Model_Mysql4_Order_Collection не имеет метода addExpressionAttributeToSelect, вместо этого у него есть addExpressionFieldToSelect метод Теперь мне нужна помощь, чтобы написать правильный синтаксис для метода addExpressionAttributeToSelect. Изменение только имени метода мне не помогает. Я также сослался на документы

Ответы [ 2 ]

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

В ответ на вторую часть вашего вопроса могу я предложить этот маленький трюк.

Столбцы сетки Adminhtml могут принимать дополнительный параметр filter_condition_callback, который принимает стандартный тип обратного вызова PHP . В вашем случае вы можете изменить сетку следующим образом:

protected function _prepareColumns() {
    // ...
    $this->addColumn('customer_email', array(
        'header' => Mage::helper('sales')->__('Customer Email'),
        'renderer' => 'adminhtml/renderer_customer',
        'filter_condition_callback' => array($this, 'addCustomerEmailFilter'),
    ));
}

public function addCustomerEmailFilter(Mage_Eav_Model_Entity_Collection_Abstract $collection, Mage_Adminhtml_Block_Widget_Grid_Column $column) {
    $collection->addAttributeToFilter('customer_email', $column->getFilter()->getValue());
}

Но все это выглядит немного грязно, особенно если атрибут не является столбцом первого класса. Для этих необычных случаев вы можете объединить обработку вывода и поиск в классе коллекции ...

protected function _initSelect() {
    parent::_initSelect();

    // email is existing column, customer_email is generated column
    $this->addExpressionAttributeToSelect(
        'customer_email',
        'TRIM({{email}})',
        array('email')
    );

    return $this;
}

Метод addExpressionAttributeToSelect() временно сохраняет выражение SQL в виде сопоставленного поля, так что когда сетка пытается найти customer_email, она заменяется выражением.

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

Добавьте 'index' => 'email' к вашему addColumn() в Grid.php, а затем попробуйте что-то вроде этого:

$emailaddress = trim($row->getData($this->getColumn()->getIndex()));
return '<a href="mailto:'.$emailaddress.'">'.$emailaddress.'</a>';

Таким образом вы удаляете пробелы и также предоставляете интерактивную ссылку для ваших администраторов:)

...