magento---后台grid加载过程分析(二)-------edit grid-----news插件为例!

magento---后台grid加载过程分析(二)-------edit grid-----news插件为例!

http://www.g4qq.com/index.php/profile/adminhtml_profile/edit/profile_id/1/category_id/0/key/2e5cb07d908be9b66bd9f753824a7025/

当点击add a news Ariticle 或者编辑的时候,访问的URL大致就是上面的那个地址。

分析过程如下:仅供参考,无法保证正确性。

1带有key值-----后台URL

访问:RichardMason_Profile_Adminhtml_ProfileController的editAction()方法

/*

* Edit CMS page

*/

public function editAction()

{

// 1. Get ID and create model

$id = $this->getRequest()->getParam('profile_id');

$model = Mage::getModel('profile/profile');

// 2. Initial checking

if ($id) {

$model->load($id);

if (! $model->getId()) {

Mage::getSingleton('adminhtml/session')->addError(Mage::helper('profile')->__('This profile no longer exists'));

$this->_redirect('*/*/');

return;

}

}

// 3. Set entered data if was error when we do save

$data = Mage::getSingleton('adminhtml/session')->getFormData(true);

if (! empty($data)) {

$model->setData($data);

}

if($this->getRequest()->getParam('category_id'))

$model->setData("category_id", $this->getRequest()->getParam('category_id'));

// 4. Register model to use later in blocks

Mage::register('profile_profile', $model);

// 5. Build edit form

$this->_initAction()

->_addBreadcrumb(Mage::helper('profile')->__('CMS'), Mage::helper('profile')->__('CMS'))

->_addContent($this->getLayout()->createBlock('profile/adminhtml_profile_edit'))

->_addLeft($this->getLayout()->createBlock('profile/adminhtml_profile_edit_tabs'));

$this->renderLayout();

}

1.1得到profile_id

当profile_id为零的时候,说明为new news,

当profile_id大于零的时候,说明为edit news

1.2

if($id),如果为edit的时候,执行if下面的语句。得到编辑的news的全部信息。

1.3

$data = Mage::getSingleton('adminhtml/session')->getFormData(true);

if (! empty($data)) {

$model->setData($data);

}

这块先一放,待会回来研究。

1.4

将$model注册到Mage。此时$model是编辑的该news的全部信息的collection。

1.5

content---profile/adminhtml_profile_edit

left ---profile/adminhtml_profile_edit_tabs

2(1.3)

layout---<profile_adminhtml_profile_edit>

<profile_adminhtml_profile_edit>

<update handle="editor"/>

<reference name="content">

<block type="profile/adminhtml_profile_edit" name="profile_edit"></block>

</reference>

<reference name="left">

<block type="profile/adminhtml_profile_edit_tabs" name="profile_edit_tabs">

<block type="profile/adminhtml_profile_edit_tab_main" name="profile_edit_tab_main" />

<block type="profile/adminhtml_profile_edit_tab_meta" name="profile_edit_tab_meta" />

<action method="addTab"><name>main_section</name><block>profile_edit_tab_main</block></action>

<action method="addTab"><name>meta_section</name><block>profile_edit_tab_meta</block></action>

</block>

</reference>

</profile_adminhtml_profile_edit>

2.1

<update handle="editor"/>

加入一个 editor layout handle

具体下面研究

2.2

content加入:block

type="profile/adminhtml_profile_edit"

2.3

left 加入:block

type="profile/adminhtml_profile_edit_tabs"

子block:

type="profile/adminhtml_profile_edit_tab_main"

type="profile/adminhtml_profile_edit_tab_meta"

增加方法action:method="addTab"

profile_edit_tab_main

profile_edit_tab_meta

tabs点击对应相应的

3(1.3--2.3)

接2.2

block

type="profile/adminhtml_profile_edit"

public function __construct()

{

//3.1

$this->_objectId = 'profile_id';

$this->_blockGroup = 'profile';

$this->_controller = 'adminhtml_profile';

//3/2

parent::__construct();

//3.3---back button

$url=Mage::registry('profile_profile')->getCategoryUrl(Mage::registry('profile_profile')->getData("category_id"));

//3.4

parent::addButton('back', array(

'label' => Mage::helper('adminhtml')->__('Back'),

'onclick' => 'setLocation(/'' . $this->getUrl("*/*/".$url."/") . '/')',

'class' => 'back',

), -1);

//3.5--save and continue edit

if ($this->_isAllowedAction('save')) {

$this->_updateButton('save', 'label', Mage::helper('profile')->__('Save'));

$this->_addButton('saveandcontinue', array(

'label' => Mage::helper('adminhtml')->__('Save And Continue Edit'),

'onclick' => 'saveAndContinueEdit()',

'class' => 'save',

), -100);

} else {

$this->_removeButton('save');

}

//3.6--delete button

if ($this->_isAllowedAction('delete')) {

$this->_updateButton('delete', 'label', Mage::helper('profile')->__('Delete'));

} else {

$this->_removeButton('delete');

}

//3.7---js

$this->_formScripts[] = "

function toggleEditor() {

if (tinyMCE.getInstanceById('page_content') == null) {

tinyMCE.execCommand('mceAddControl', false, 'content');

} else {

tinyMCE.execCommand('mceRemoveControl', false, 'content');

}

}

function saveAndContinueEdit(){

editForm.submit($('edit_form').action+'back/edit/');

}

";

}

函数比较长,从标记一点一点的分析:

3.1

为block字段赋值。

$this->_objectId = 'profile_id'; news表的唯一索引。

$this->_blockGroup = 'profile';

$this->_controller = 'adminhtml_profile'; 生成block用的。

3.2

parent::__construct();

先一放

3.3-3.4

back button返回按钮的赋值

关于里面的如何写,改天再详细研究

3.5

--save and continue edit

3.6

delete button

3.7

js函数

譬如:

'onclick' => 'saveAndContinueEdit()',

对应:

function saveAndContinueEdit()

4(1.3--2.3)

下面研究3.2

public function __construct()

{

//4.1

parent::__construct();

//4.2

if (!$this->hasData('template')) {

$this->setTemplate('widget/form/container.phtml');

}

//4.3 返回按钮,已经被覆盖掉了

$this->_addButton('back', array(

'label' => Mage::helper('adminhtml')->__('Back'),

'onclick' => 'setLocation(/'' . $this->getBackUrl() . '/')',

'class' => 'back',

), -1);

//4.4 重置按钮

$this->_addButton('reset', array(

'label' => Mage::helper('adminhtml')->__('Reset'),

'onclick' => 'setLocation(window.location.href)',

), -1);

//4.5 如果edit,$objId不为空,如果new $objId为空,以此判断是否添加删除按钮

$objId = $this->getRequest()->getParam($this->_objectId);

if (! empty($objId)) {

$this->_addButton('delete', array(

'label' => Mage::helper('adminhtml')->__('Delete'),

'class' => 'delete',

'onclick' => 'deleteConfirm(/''. Mage::helper('adminhtml')->__('Are you sure you want to do this?')

.'/', /'' . $this->getDeleteUrl() . '/')',

));

}

//4.6 保存按钮

$this->_addButton('save', array(

'label' => Mage::helper('adminhtml')->__('Save'),

'onclick' => 'editForm.submit();',

'class' => 'save',

), 1);

}

有是一个好长的函数:

4.1

parent::__construct();

4.2

$this->setTemplate('widget/form/container.phtml');

5(1.3--2.3--4.2)

研究4.1

5.1

parent::__construct();为

public function __construct()

{

$args = func_get_args();

if (empty($args[0])) {

$args[0] = array();

}

$this->_data = $args[0];

$this->_construct();

}

前面已经研究过

6(1.3--2.3)

接4.2

$this->setTemplate('widget/form/container.phtml');

文件就不写了,该template用到的函数

$this->getFormInitScripts()

$this->getHeaderHtml()

$this->getButtonsHtml('header')

$this->getFormHtml()

$this->hasFooterButtons()

$this->getButtonsHtml('footer')

$this->getValidationUrl()

$this->getFormScripts()

最重要的就是

$this->getFormHtml();

public function getFormHtml()

{

$this->getChild('form')->setData('action', $this->getSaveUrl());

return $this->getChildHtml('form');

}

6.1

$this->getChild('form')->setData('action', $this->getSaveUrl());

//$this->_children[$name]->setData('action', $this->getSaveUrl());

还没打看明白,留下,继续往下走

6.2

$this->getChildHtml('form');

Mage_Adminhtml_Block_Widget_Form_Container里面有这么个函数:

protected function _prepareLayout()

{

if ($this->_blockGroup && $this->_controller && $this->_mode) {

$this->setChild('form', $this->getLayout()->createBlock($this->_blockGroup . '/' . $this->_controller . '_' . $this->_mode . '_form'));

}

return parent::_prepareLayout();

}

故可以知道as="form" type="RichardMason/Profile_Block_Adminhtml_Profile_Edit_Form"

7(1.3--2.3)

type="RichardMason/Profile_Block_Adminhtml_Profile_Edit_Form"

该类下面有这么个函数。

protected function _prepareForm()

{

$form = new Varien_Data_Form(array('id' => 'edit_form', 'action' => $this->getData('action'), 'method' => 'post', 'enctype' => 'multipart/form-data'));

$form->setUseContainer(true);

$this->setForm($form);

return parent::_prepareForm();

}

这块还真没大看明白。太他妈的复杂,擦!

猜想:获取bar的值,也就是left,点击那个,就会显示相应的form,'action' => $this->getData('action')进而显示不同form。

$this->setForm($form);给block _data[form]赋值。

8(1.3--2.3)

接7

return parent::_prepareForm();

实例化,执行

protected function _construct()

{

parent::_construct();

$this->setTemplate('widget/form.phtml');

$this->setDestElementId('edit_form');

$this->setShowGlobalIcon(false);

}

故template="widget/form.phtml"

9(1.3--2.3)

template="widget/form.phtml"

<?php echo $this->getFormHtml();?>

--Mage_Adminhtml_Block_Widget_Form

public function getFormHtml()

{

if (is_object($this->getForm())) {

return $this->getForm()->getHtml();

}

return '';

}

$this->getForm()->getHtml();----->

public function toHtml()

{

Varien_Profiler::start('form/toHtml');

$html = '';

if ($useContainer = $this->getUseContainer()) {

$html .= '<form '.$this->serialize($this->getHtmlAttributes()).'>';

$html .= '<div>';

if (strtolower($this->getData('method')) == 'post') {

$html .= '<input name="form_key" type="hidden" value="'.Mage::getSingleton('core/session')->getFormKey().'" />';

}

$html .= '</div>';

}

foreach ($this->getElements() as $element) {

$html.= $element->toHtml();

}

if ($useContainer) {

$html.= '</form>';

}

Varien_Profiler::stop('form/toHtml');

return $html;

}

将对象form的子元素以form的形式显示出来。

10(2.3)

接1.3

$data = Mage::getSingleton('adminhtml/session')->getFormData(true);

if (! empty($data)) {

$model->setData($data);

}

Set entered data if was error when we do save

可能保存失败后,session就不存在相应的值了吧。还不是很懂

***********************************************************

left 代码

***********************************************************

11

接2.3

<reference name="left">

<block type="profile/adminhtml_profile_edit_tabs" name="profile_edit_tabs">

<block type="profile/adminhtml_profile_edit_tab_main" name="profile_edit_tab_main" />

<block type="profile/adminhtml_profile_edit_tab_meta" name="profile_edit_tab_meta" />

<action method="addTab"><name>main_section</name><block>profile_edit_tab_main</block></action>

<action method="addTab"><name>meta_section</name><block>profile_edit_tab_meta</block></action>

</block>

</reference>

-----------------------------------------------------------

left 加入:block

type="profile/adminhtml_profile_edit_tabs"

子block:

type="profile/adminhtml_profile_edit_tab_main"

type="profile/adminhtml_profile_edit_tab_meta"

增加方法action:method="addTab"

profile_edit_tab_main

profile_edit_tab_meta

tabs点击对应相应的

11.1

profile/adminhtml_profile_edit_tabs

RichardMason_Profile_Block_Adminhtml_Profile_Edit_Tabs

public function __construct()

{

parent::__construct();

$this->setId('profiles_tabs');

$this->setDestElementId('edit_form');

$this->setTitle(Mage::helper('profile')->__('Information'));

}

11.1.1

赋值:

$this->setId('profiles_tabs');

$this->setDestElementId('edit_form');

$this->setTitle(Mage::helper('profile')->__('Information'));

11.1.2

parent::__construct();

找这个函数找到,但是找不到template

它继承的类找到这个函数,不知道怎么执行,应该就是这个template吧

protected function _construct()

{

$this->setTemplate('widget/tabs.phtml');

}

12

widget/tabs.phtml

foreach ($tabs as $_tab):

<a href="<?php echo $this->getTabUrl($_tab) ?>"

$tabs应该就是

<action method="addTab"><name>main_section</name><block>profile_edit_tab_main</block></action>

<action method="addTab">的使用参看文章:tab的分析和使用!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值