1

app/code/core/Mage/Adminhtml/Block/Sales/Order/Grid.php with &を書き直して、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();

 }

}

&これが私のグリッドの変更です(列を追加したばかりで、検索可能にするつもりです)

$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',

    ));

私は欲しいものを手に入れています。しかし、この列/には、この列の先頭と末尾の両方に多くの空白があります。この列だと思います。検索できません。これらの空白を取り除くために何ができるかを誰かが提案できますか

よろしくお願いします

編集 数日後、これらの空白はグリッドで一般的であり、検索可能なオプションとは何の関係もないことがわかりました。レンダラーを使用してグリッドに追加された検索可能なカスタム列を作成する方法を誰かが提案できますか?ありがとう

2 EDIT Guys 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からではなくsales_flat_order_gridテーブルからデータを取得することを調査しました。これが、 clockworkgeekの最初のソリューションに従って不明な列のエラーを報告した理由です。

現在の実装の問題は、Magentoがエラーを報告すること です。致命的なエラー:未定義のメソッドMage_Sales_Model_Mysql4_Order_Collection :: addExpressionAttributeToSelect()の呼び出し

Mage_Sales_Model_Mysql4_Order_CollectionにはaddExpressionAttributeToSelectメソッドがなく、代わりにaddExpressionFieldToSelectメソッドがあるため、addExpressionAttributeToSelectメソッドの適切な構文を作成するためのヘルプが必要です。メソッド名を変更するだけでは役に立ちません。ドキュメントも参照しました

4

2 に答える 2

0

Grid.phpに追加'index' => 'email'して、次のようにしてみてください。addColumn()

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

このようにして、空白を取り除き、管理者ユーザーにクリック可能なリンクを提供します:)

于 2011-06-08T13:43:32.027 に答える
0

あなたの質問の 2 番目の部分に応えて、このちょっとしたトリックを提供できますか。

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代わりに式に置き換えられます。

于 2011-06-13T12:57:37.740 に答える