3

2つのカスタムコレクションがあります。フラットデータを使用した通常のコレクション。私はそれらを顧客の選択に参加させる必要があります。これはinnerJoinで正常に機能しますが、結合されたフィールドのフィルタリングと並べ替えは機能しません。どうすればこれを解決できますか?

_prepareCollection()の例

$collection = Mage::getResourceModel('customer/customer_collection')
    ->addNameToSelect()
    ->addAttributeToSelect('email');

$collection
    ->getSelect()
    ->joinInner(array('my_table' => $collection->getTable('my/table')), 'e.entity_id = my_table.customer_id', array('custom_field' => my_table.custom_field))
    ->joinInner(array('my_table1' => $collection->getTable('my/table1')), 'my_table1.other_id = my_table.id', array('custom_field1' => my_table1.custom_field));

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

そのため、custom_fieldとcustom_field1では並べ替えとフィルタリングは機能しません

列呼び出しを追加します。

$this->addColumn('custom_field',
        array(
            'header'=>$this->__('Shopping club name'),
            'index'=>'custom_field',
            'filter_index'=>'my_table.custom_field',
    ));

フィルタリング中に致命的なエラーが発生します:

Call to a member function getBackend() on a non-object

並べ替えが機能せず、エラーは表示されません

フラットテーブルをフラットテーブルに結合する場合、「filter_index」は正常に機能します。しかし、ここではフラットがEAVに参加しています。

4

2 に答える 2

15

これは実際にはそれほど難しいことではありません!

これを行ったとき、last_loginをカスタマーグリッドに追加していました。

すでに実行した最初のステップですが、完全を期すためにここに含めますが、最初のselectステートメントに列を追加することです。

/**
 * set collection object
 *
 * @param Mage_Customer_Model_Resource_Customer_Collection $collection
 */
public function setCollection($collection)
{
    //Group by email since multiple customer_ids can exist in the log/customer.
    $collection->groupByEmail();

    //join the last_login field here.
    $collection->getSelect()->joinLeft(array('c_log' => $collection->getTable('log/customer')), 'c_log.customer_id=e.entity_id', array('last_login' => 'login_at'));

    parent::setCollection($collection);
}

次に、列をグリッドに追加します。2つのコールバックを定義していることに注意してください。'filter_condition_callback'はストックMagentoです。奇妙なことに、これをソートするためのコールバックインデックスはありません(私が知る限り)。並べ替えコールバックを追加する必要があります。そうしないと、新しい列を並べ替えることができません。

    $this->addColumnAfter('last_login', array(
         'header'                    => Mage::helper('customer')->__('Last Login'),
         'type'                      => 'datetime',
         'align'                     => 'center',
         'index'                     => 'last_login',
         'filter_index'              => '`c_log`.`login_at`',
         'gmtoffset'                 => true,
         //Stock Magento Callback - Notice the callback key has been assigned.
         'filter_condition_callback' => 'filter_last_login',
         //Custom Callback Index
         'order_callback'            => 'sort_last_login'
    ), 'customer_since');

次に、フィルタリングと並べ替えを処理するコールバック関数を追加します。

if (!function_exists('filter_last_login')) {
    /**
     * @param Mage_Customer_Model_Resource_Customer_Collection $collection
     * @param Mage_Adminhtml_Block_Widget_Grid_Column          $column
     */
    function filter_last_login($collection, $column)
    {
        if (!$column->getFilter()->getCondition()) {
            return;
        }

        $condition = $collection->getConnection()
            ->prepareSqlCondition('c_log.login_at', $column->getFilter()->getCondition());
        $collection->getSelect()->where($condition);
    }
}

if (!function_exists('sort_last_login')) {
    /**
     * @param Mage_Customer_Model_Resource_Customer_Collection $collection
     * @param Mage_Adminhtml_Block_Widget_Grid_Column          $column
     */
    function sort_last_login($collection, $column)
    {
        $collection->getSelect()->order($column->getIndex() . ' ' . strtoupper($column->getDir()));
    }
}

最後に、order_callbackは実際のインデックスではないため、デフォルトの並べ替えメカニズムの代わりに定義されている場合は、このコールバックを呼び出す必要があります。これは私がそれを達成した方法です:

/**
 * Sets sorting order by some column
 *
 * @param Mage_Adminhtml_Block_Widget_Grid_Column $column
 *
 * @return Mage_Adminhtml_Block_Widget_Grid
 */
protected function _setCollectionOrder($column)
{
    if ($column->getOrderCallback()) {
        call_user_func($column->getOrderCallback(), $this->getCollection(), $column);

        return $this;
    }

    return parent::_setCollectionOrder($column);
}

これが誰かを助けることを願っています。

于 2013-05-08T17:53:02.097 に答える
6

属性をグリッドに追加するaddColumn()の呼び出しを表示できますか?

次のようになります。

$this->addColumn('custom_field', array(
    ...
    'filter_index' => 'my_table.custom_field',
    ...
));

おそらく、「filter_index」キーのエイリアス値を設定します。

于 2013-01-17T06:23:19.700 に答える