对于在后台的grid,form等控件,在显示的时候前,一般在_prepareForm(这个比较复杂,后面再介绍!)

 

 

在RichardMason_Profile_Block_Adminhtml_Profile_Grid定义的

 

 

 protected function _prepareColumns()

    {

        $baseUrl = $this->getUrl();

 

        $this->addColumn('content_heading', array(

            'header'    => Mage::helper('profile')->getText(Mage::registry('profile_category_id'),'content_heading'),

            'align'     => 'left',

            'index'     => 'content_heading'

        ));

 

        /*

        if(Mage::registry('profile_category_id') != RichardMason_Profile_Model_Profile::CATEGORY_RELEASES) {

       $this->addColumn('content', array(

           'header'    => Mage::helper('profile')->getText(Mage::registry('profile_category_id'),'content'),

           'align'     => 'left',

           'index'     => 'content'

       ));

        }

*/

 

        if (!Mage::app()->isSingleStoreMode()) {

            $this->addColumn('store_id', array(

                'header'        => Mage::helper('profile')->__('Store View'),

                'index'         => 'store_id',

                'type'          => 'store',

                'store_all'     => true,

                'store_view'    => true,

                'sortable'      => false,

                'filter_condition_callback'

                                => array($this, '_filterStoreCondition'),

            ));

        }

 

        $this->addColumn('is_active', array(

            'header'    => Mage::helper('profile')->__('Status'),

            'index'     => 'is_active',

            'type'      => 'options',

            'options'   => array(

                0 => Mage::helper('profile')->__('Disabled'),

                1 => Mage::helper('profile')->__('Enabled')

            ),

        ));

 

        $this->addColumn('creation_time', array(

            'header'    => Mage::helper('profile')->__('Date Created'),

            'index'     => 'creation_time',

            'type'      => 'datetime',

        ));

 

        $this->addColumn('update_time', array(

            'header'    => Mage::helper('profile')->__('Last Modified'),

            'index'     => 'update_time',

            'type'      => 'datetime',

        ));

 

        return parent::_prepareColumns();

    }

 

$this->addColumns('store_id',array())

在这个函数里面的这个方法为Mage_Adminhtml_Block_Widget_Grid的方法,这里覆盖

目的是为了设置

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

访问url

profile/adminhtml_profile/news/key/fdsfsdfsadfds

 

 

grid的流程显示:

 

前提,各种资源,model,config.xml都配置好,

 

 

1.config.xml配置。

<adminhtml>

<menu>

<cms>

<children>

<news module="profile">

<title>News</title>

<sort_order>60</sort_order>

<action>profile/adminhtml_profile/news</action>

</news>

</children>

 

 

2 controller----newsaction方法的填写

 

在RichardMason_Profile_Adminhtml_ProfileController写一个函数newsAction()

 

 

public function newsAction(){

Mage::register('profile_category_id', RichardMason_Profile_Model_Profile::CATEGORY_NEWS);

$this->_initAction()

->renderLayout();

}

 

 

protected function _initAction() {

$this->loadLayout()

->_setActiveMenu('profile/items')

->_addBreadcrumb(Mage::helper('adminhtml')->__('Profiles Manager'), Mage::helper('adminhtml')->__('Profile Manager'));

return $this;

}

 

 

 

3.layouthandle

到profile.xml中写一个layouthandle:

 

  <profile_adminhtml_profile_news>

        <reference name="content">

            <block type="profile/adminhtml_profile" name="profile" />

        </reference>

    </profile_adminhtml_profile_news>

 

 

4.Block/Adminhtml/Profile.php

 

 

RichardMason_Profile_Block_Adminhtml_Profile   extends  Mage_Adminhtml_Block_Widget_Grid_Container

 public function __construct()

  {

    $this->_controller = 'adminhtml_profile';

    $this->_blockGroup = 'profile';

 

    $this->_headerText = Mage::helper('profile')->getText(Mage::registry('profile_category_id'), '_headerText');

    parent::__construct();

    parent::_addButton('add', array(

'label'     => Mage::helper('profile')->getText(Mage::registry('profile_category_id'), 'New'),

'onclick'   => 'setLocation(/''.$this->getUrl('*/*/edit', array('category_id' => Mage::registry('profile_category_id'))).'/')',

        'class'     => 'add',

    ));    

  }

5.

因为在该函数构造的时候需要用到grid,系统的默认路径为adminhtml/profile/grid.php(prifile.php的地址:adminhtml)

 

 

class RichardMason_Profile_Block_Adminhtml_Profile_Grid extends Mage_Adminhtml_Block_Widget_Grid

{

//1

    public function __construct()

    {

        parent::__construct();

        $this->setId('profileBlockGrid');

        $this->setDefaultSort('profile_id');

        $this->setDefaultDir('ASC');

    }

//2

    protected function _prepareCollection()

    {

$collection = Mage::getModel('profile/profile')->getCollection();

$collection->addFieldToFilter('category_id', Mage::registry('profile_category_id'));

        /* @var $collection Mage_Cms_Model_Mysql4_Block_Collection */

        $this->setCollection($collection);

        return parent::_prepareCollection();

    }

//3

    protected function _prepareColumns()

    {

        $baseUrl = $this->getUrl();

 

        $this->addColumn('content_heading', array(

            'header'    => Mage::helper('profile')->getText(Mage::registry('profile_category_id'),'content_heading'),

            'align'     => 'left',

            'index'     => 'content_heading'

        ));

 

        /*

        if(Mage::registry('profile_category_id') != RichardMason_Profile_Model_Profile::CATEGORY_RELEASES) {

       $this->addColumn('content', array(

           'header'    => Mage::helper('profile')->getText(Mage::registry('profile_category_id'),'content'),

           'align'     => 'left',

           'index'     => 'content'

       ));

        }

*/

 

        if (!Mage::app()->isSingleStoreMode()) {

            $this->addColumn('store_id', array(

                'header'        => Mage::helper('profile')->__('Store View'),

                'index'         => 'store_id',

                'type'          => 'store',

                'store_all'     => true,

                'store_view'    => true,

                'sortable'      => false,

                'filter_condition_callback'

                                => array($this, '_filterStoreCondition'),

            ));

        }

 

        $this->addColumn('is_active', array(

            'header'    => Mage::helper('profile')->__('Status'),

            'index'     => 'is_active',

            'type'      => 'options',

            'options'   => array(

                0 => Mage::helper('profile')->__('Disabled'),

                1 => Mage::helper('profile')->__('Enabled')

            ),

        ));

 

        $this->addColumn('creation_time', array(

            'header'    => Mage::helper('profile')->__('Date Created'),

            'index'     => 'creation_time',

            'type'      => 'datetime',

        ));

 

        $this->addColumn('update_time', array(

            'header'    => Mage::helper('profile')->__('Last Modified'),

            'index'     => 'update_time',

            'type'      => 'datetime',

        ));

 

        return parent::_prepareColumns();

    }

//4

    protected function _afterLoadCollection()

    {

        $this->getCollection()->walk('afterLoad');

        parent::_afterLoadCollection();

    }

//5

    protected function _filterStoreCondition($collection, $column)

    {

        if (!$value = $column->getFilter()->getValue()) {

            return;

        }

 

        $this->getCollection()->addStoreFilter($value);

    }

 

    /**

     * Row click url

     *

     * @return string

     */

//6

    public function getRowUrl($row)

    {

        return $this->getUrl('*/*/edit', array('profile_id' => $row->getId(), 'category_id' => Mage::registry('profile_category_id') ));

    }

}

 

以上函数的讲解:

6.1

 public function __construct()

    {

        parent::__construct();  //上层构造函数调用。

        $this->setId('profileBlockGrid');   //Set object id field value

        $this->setDefaultSort('profile_id');  //以那个字段来排序

        $this->setDefaultDir('ASC');      //升序还是降序。

    }

 

6.2

 

   protected function _prepareCollection()

    {

$collection = Mage::getModel('profile/profile')->getCollection();

$collection->addFieldToFilter('category_id', Mage::registry('profile_category_id'));

        /* @var $collection Mage_Cms_Model_Mysql4_Block_Collection */

        $this->setCollection($collection);

        return parent::_prepareCollection();

    }

 

得到过滤条件后的collection,然后将_data[collection],赋值。

 

 

6.3

//3

    protected function _prepareColumns()

    {

        $baseUrl = $this->getUrl();

 

        $this->addColumn('content_heading', array(

            'header'    => Mage::helper('profile')->getText(Mage::registry('profile_category_id'),'content_heading'),

            'align'     => 'left',

            'index'     => 'content_heading'

        ));

 

        /*

        if(Mage::registry('profile_category_id') != RichardMason_Profile_Model_Profile::CATEGORY_RELEASES) {

       $this->addColumn('content', array(

           'header'    => Mage::helper('profile')->getText(Mage::registry('profile_category_id'),'content'),

           'align'     => 'left',

           'index'     => 'content'

       ));

        }

*/

 

        if (!Mage::app()->isSingleStoreMode()) {

            $this->addColumn('store_id', array(

                'header'        => Mage::helper('profile')->__('Store View'),

                'index'         => 'store_id',

                'type'          => 'store',

                'store_all'     => true,

                'store_view'    => true,

                'sortable'      => false,

                'filter_condition_callback'

                                => array($this, '_filterStoreCondition'),

            ));

        }

 

        $this->addColumn('is_active', array(

            'header'    => Mage::helper('profile')->__('Status'),

            'index'     => 'is_active',

            'type'      => 'options',

            'options'   => array(

                0 => Mage::helper('profile')->__('Disabled'),

                1 => Mage::helper('profile')->__('Enabled')

            ),

        ));

 

        $this->addColumn('creation_time', array(

            'header'    => Mage::helper('profile')->__('Date Created'),

            'index'     => 'creation_time',

            'type'      => 'datetime',

        ));

 

        $this->addColumn('update_time', array(

            'header'    => Mage::helper('profile')->__('Last Modified'),

            'index'     => 'update_time',

            'type'      => 'datetime',

        ));

 

        return parent::_prepareColumns();

    }

 

_prepareColumns()

主要应用addColumns方法:增加grid的列!

$this->addColumns("此处为在数据库中的字段名称".array())

array(

header-----在页面显示的列名

index------数据库中的字段名称

type ------在前台显示使用的小控件类型,如options(select下拉条),datetime(会显示时间控件)

store_all--是否显示所有商店。

sortable---是否可以排序,也就是在页面的字段名称处点击,然后以此字段排序的功能是否开启,flase/true.

type--------store类型,应该是根据值去对应相应的key,得到相应的value吧。

filter_condition_callback---array($this,'_filterStoreCondition')

是store_id的,对于这个,还是很模糊,先这样吧。遇到store,直接把这个赋值过去就可以了。

 

6.4

    protected function _afterLoadCollection()

    {

        $this->getCollection()->walk('afterLoad');

        parent::_afterLoadCollection();

    }

还是不是很懂。看来想做grid,还是得摸索着做,以后再回来看奥秘。

 

6.5

//5

    protected function _filterStoreCondition($collection, $column)

    {

        if (!$value = $column->getFilter()->getValue()) {

            return;

        }

 

        $this->getCollection()->addStoreFilter($value);

    }

为addcolumns store_id处的filter_condition_callback---array($this,'_filterStoreCondition')

对应的方法。

 

 

 

//6

    public function getRowUrl($row)

    {

        return $this->getUrl('*/*/edit', array('profile_id' => $row->getId(), 'category_id' => Mage::registry('profile_category_id') ));

    }

}

得到URL,也就是grid中每行可以通过点击该行进入编辑的URL获得,就是通过这个函数得到的!

 

 

 

 

 

到此,吧一个grid显示出来编写结束!主要难点为block/Profile.php文件和block/profile/Grid.php文件的编写。

 

 

 

 

 

附加:

 parent::_addButton('add', array(

'label'     => Mage::helper('profile')->getText(Mage::registry('profile_category_id'), 'New'),

'onclick'   => 'setLocation(/''.$this->getUrl('*/*/edit', array('category_id' => Mage::registry('profile_category_id'))).'/')',

        'class'     => 'add',

    ));

add按钮,编写的时候模仿就可以,一切可以山寨!懂原理就可以!!