后台菜单显示点击后404,如果adminhtml.xml配置正确,那是config.xml的问题
Magento Grid关联了多表后,表与表之间有相同字段出现。在后台点查询时出现报错解决用filter_index
$this->addColumn('name', array( 'header' => '返利商家', 'align' => 'right', 'width' => '50px', 'index' => 'vname', 'filter_index' =>'v.name', )); $this->addColumn('type', array( 'header' => '返利规则名', 'align' => 'right', 'width' => '50px', 'index' => 'name', 'filter_index' =>'main_table.name', ));
1.在后台管理界面加入菜单
1.1添加新菜单
<?xml version="1.0"?> <config> <menu> <!--子菜单标识符--> <dcatalog translate="title"> <title>推荐位管理</title> <sort_order>110</sort_order> <children> <recommend_product translate="title"> <title>商品推荐</title> <action>adminhtml/recommend_product</action> </recommend_product> <recommend_jifen translate="title"> <title>积分商户推荐</title> <action>adminhtml/recommend_jifen</action> </recommend_jifen> <recommend_image translate="title"> <title>图片推荐</title> <action>adminhtml/recommend_image</action> </recommend_image> </children> </dcatalog> </menu> <acl> <resources> <admin> <children> <dcatalog translate="title"> <title>推荐位管理</title> <children> <recommend_product translate="title"> <title>商品推荐</title> <sort_order>0</sort_order> </recommend_product> <recommend_jifen translate="title"> <title>商品推荐</title> <sort_order>0</sort_order> </recommend_jifen> <recommend_image translate="title"> <title>图片推荐</title> <sort_order>0</sort_order> </recommend_image> </children> </dcatalog> </children> </admin> </resources> </acl> </config>
1.2在已有菜单下添加:在模块的Glamour/CustomerMessage/etc目录下增加adminhtml.xml配置文件,用于加入自定义的菜单项。文件内容如下:
<?xml version="1.0"?> <config> <menu> <!-- 父菜单项标识,此处是在标题为Customers的菜单下加入子菜单--> <!-- Magento一级管理菜单标识和显示标题--> <!-- dashboard =>Dashboard catalog=>Catalog sales=>Sales customer=>Customers newsletter=>Newsletter cms=>CMS report=>Reports --> <customer> <children> <!--子菜单标识符--> <customermessage translate="title"> <title>Customer Message</title> <!--点击菜单时执行的动作,此处将执行controller/adminhtml目录下的messageController默认的action--> <action>adminhtml/message</action> <sort_order>120</sort_order> </customermessage > </children> </customer> </menu> <!--加入权限列表--> <acl> <resources> <admin> <children> <customer> <children> <customermessage translate="title"> <title>Customer Message</title> </customermessage> </children> </customer> </children> </admin> </resources> </acl> </config>
可以在后台,系统-》权限-》角色-》角色资源-》自定义 查看
2开发后台Controller
在模块的controllers目录下创建Adminhtml目录,新建一个Controller类。
<?php class Glamour_CustomerMessage_Adminhtml_MessageController extends Mage_Adminhtml_Controller_Action { public function indexAction() { $this->loadLayout() ->_setActiveMenu('customer') ->_addBreadcrumb('Customer Message', 'Customer Message') ->renderLayout(); } protected function _initData() { $id = $this->getRequest()->getParam('id', 0); $model = Mage::getModel('news/news'); if ($id > 0) { $model = $model->load($id); } Mage::register('form_data', $model); return $formdata; } public function editAction() { //页面回显 if (!$formdata = $this->_initData()) { return; } try{ $this->loadLayout(); $this->_setActiveMenu('customer/message'); $this->_addContent($this->getLayout()->createBlock('news/adminhtml_news_edit')) ->_addLeft($this->getLayout()->createBlock('news/adminhtml_news_edit_tabs')); $this->renderLayout(); } catch(Exception $e) { Mage::getSingleton('adminhtml/session')->addError('记录不存在'); $this->_redirect('*/*/'); } } public function newAction() { $this->_forward('edit'); } public function deleteAction() { $id = $this->getRequest()->getParam('id'); if ($id > 0) { try { $this->doDelete($id); Mage::getSingleton('adminhtml/session')->addSuccess('删除成功'); $this->_redirect('*/*/'); } catch (Exception $e) { Mage::getSingleton('adminhtml/session')->addError('删除失败'); $this->_redirect('*/*/edit', array('id' => $this->getRequest()->getParam('id'))); } } $this->_redirect('*/*/'); } public function saveAction() { if ($data = $this->getRequest()->getPost()) { try { $model = Mage::getModel('news/news'); $model->setData($data); $model->save(); Mage::getSingleton('adminhtml/session')->addSuccess('保存成功'); // check if 'Save and Continue' if ($this->getRequest()->getParam('back')=='edit') { $this->_redirect('*/*/edit', array('id' => $model->getId())); return; } $this->_redirect('*/*/'); } catch (Exception $e) { Mage::getSingleton('adminhtml/session')->addError($e->getMessage()); $this->_redirect('*/*/edit', array('id' => $model->getId())); return; } } $this->_redirect('*/*/'); } public function massDeleteAction() { $ids = $this->getRequest()->getParam('news'); if (!empty($ids)) { try { $this->doDelete($ids); Mage::getSingleton('adminhtml/session')->addSuccess(sprintf('删除 %d条成功', count($ids))); } catch (Exception $e) { Mage::getSingleton('adminhtml/session')->addError('删除失败'); } } $this->_redirect('*/*/'); } private function doDelete($id) { if (is_array($id)) { foreach ($id as $id) { $this->doDelete($id); } } else { Mage::getModel('news/news')->load($id)->delete(); } } public function exportCsvAction() { $fileName = 'fanli.csv'; $grid = $this->getLayout()->createBlock('rebates/adminhtml_order_grid'); $this->_prepareDownloadResponse($fileName, strip_tags($grid->getCsv())); //string 方式 // $this->_prepareDownloadResponse($fileName, $grid->getCsvFile($fileName)); //读export/xml方式导出,先写文件再读文件,性能不好 } }
后台的Controller类继承自Mage_Adminhtml_Controller_Action,在etc/config.xml加入:
</frontend> <admin> <routers> <adminhtml> <args> <modules> <customermessage before="Mage_Adminhtml">Glamour_CustomerMessage_Adminhtml</customermessage> </modules> </args> </adminhtml> </routers> </admin>
这样就可以使用和Magento自带的后台模块类似的url .../index.php/admin/message/来访问自定义模块的后台controller,也可以实现rewrite后台controller。
3开发后台Block
在app\code\local\Voodoo\News\Block\Adminhtml下,建立News.php文件:列表显示
class Voodoo_News_Block_Adminhtml_News extends Mage_Adminhtml_Block_Widget_Grid_Container { public function __construct() { $this->_controller = 'adminhtml_news'; //block路径 $this->_blockGroup = 'news';//module name $this->_headerText = '管理'; $this->_addButtonLabel = '添加'; parent::__construct(); //$this->_removeButton('back');//reset save add } }
同样目录下继续建立Grid.php文件:
<?php class Voodoo_News_Block_Adminhtml_News_Grid extends Mage_Adminhtml_Block_Widget_Grid { public function __construct() { parent::__construct(); $this->setId('newsGrid'); $this->setDefaultSort('news_id'); $this->setDefaultDir('ASC'); $this->setSaveParametersInSession(true); } protected function _prepareCollection() { $collection = Mage::getModel('news/news')->getCollection(); $this->setCollection($collection); return parent::_prepareCollection(); } protected function _prepareColumns() { $this->addColumn('news_id', array( 'header' => 'ID', 'align' => 'right', 'width' => '50px', 'index' => 'news_id', )); $this->addColumn('action', array( 'header' => '操作', 'width' => '100', 'type' => 'action', 'getter' => 'getId', 'actions' => array( array( 'caption' => '修改', 'url' => array('base' => '*/*/edit'), 'field' => 'id' ) ), 'filter' => false, 'sortable' => false, 'index' => 'stores', 'is_system' => true, )); $this->addExportType('*/*/exportCsv', 'CSV'); return parent::_prepareColumns(); } protected function _prepareMassaction() { $this->setMassactionIdField('news_id'); //checkbox value 需要_prepareMassactionColumn $this->getMassactionBlock()->setFormFieldName('news'); //checkbox name $this->getMassactionBlock()->addItem('delete', array( 'label' => '删除', 'url' => $this->getUrl('*/*/massDelete'), 'confirm' => '确认删除?' )); return $this; } protected function _prepareMassactionColumn() { $columnId = 'massaction'; $massactionColumn = $this->getLayout()->createBlock('adminhtml/widget_grid_column') ->setData(array( 'index' => $this->getMassactionIdField(), 'type' => 'massaction', 'name' => $this->getMassactionBlock()->getFormFieldName(), 'align' => 'center', 'disabled_values' => array(1, 3), // checkbox disabled values 'is_system' => true, //系统自带导出csv/excel中不显示 'use_index' =>true // 关联setMassactionIdField )); if ($this->getNoFilterMassactionColumn()) { $massactionColumn->setData('filter', false); } $massactionColumn->setSelected($this->getMassactionBlock()->getSelected()) ->setGrid($this) ->setId($columnId); $oldColumns = $this->_columns; $this->_columns = array(); $this->_columns[$columnId] = $massactionColumn; $this->_columns = array_merge($this->_columns, $oldColumns); return $this; } public function getRowUrl($row) //点击tr进入edit,去掉后显示# { return $this->getUrl('*/*/edit', array('id' => $row->getId())); } }
app\code\local\Voodoo\News\Block\Adminhtml\News中建立Edit.php文件:
<?php class Voodoo_News_Block_Adminhtml_News_Edit extends Mage_Adminhtml_Block_Widget_Form_Container { //protected $_mode = 'edit';//form.php目录名 public function __construct() { parent::__construct(); $this->_objectId = 'id'; $this->_blockGroup = 'news'; $this->_controller = 'adminhtml_news'; $this->_updateButton('save', 'label', '保存'); $this->_updateButton('delete', 'label', '删除'); $this->_addButton('saveandcontinue', array( 'label' => Mage::helper('adminhtml')->__('Save and Continue Edit'), 'onclick' => 'saveAndContinueEdit()', 'class' => 'save', ), -100); $this->_formScripts[] =<<<JS function toggleEditor() { if (tinyMCE.getInstanceById('block_content') == null) { tinyMCE.execCommand('mceAddControl', false, 'block_content'); } else { tinyMCE.execCommand('mceRemoveControl', false, 'block_content'); } } function saveAndContinueEdit(){ editForm.submit(\$('edit_form').action+'back/edit/'); } JS; } public function getHeaderText() { if (Mage::registry('form_data') && Mage::registry('form_data')->getId()) { return ("Edit Item '%s'", $this->htmlEscape(Mage::registry('news_data')->getTitle()); } else { return 'Add Item'; } } public function _prepareLayout() { //add js css 需要添加此方法,其他可以删除 $this->getLayout()->getBlock('head') ->addJs('extjs/ext-tree.js') ->addJs('extjs/ext-tree-checkbox.js') ->addItem('js_css', 'extjs/resources/css/ext-all.css'); return parent::_prepareLayout(); } }
app\code\local\Voodoo\News\Block\Adminhtml\News\Edit下创建Form.php和Tabs.php:
<?php class Voodoo_News_Block_Adminhtml_News_Edit_Form extends Mage_Adminhtml_Block_Widget_Form { protected function _prepareForm() { $form = new Varien_Data_Form(array( 'id' => 'edit_form', 'action' => $this->getUrl('*/*/save', array('id' =>$this->getRequest()->getParam('id'))), 'method' => 'post', 'enctype' => 'multipart/form-data' )); $form->setUseContainer(true); $this->setForm($form); return parent::_prepareForm(); } }
下面的是tab选项卡带form,可以不要。将$fieldset的内容放到上面去
<?php class Voodoo_News_Block_Adminhtml_News_Edit_Tabs extends Mage_Adminhtml_Block_Widget_Tabs { public function __construct() { parent::__construct(); $this->setId('news_tabs'); $this->setDestElementId('edit_form'); $this->setTitle('News Information'); } protected function _beforeToHtml() { $this->addTab('form_section', array( 'label' => 'News Information', 'title' => 'News Information', 'content' => $this->getLayout()->createBlock('news/adminhtml_news_edit_tab_form')->toHtml(), )); return parent::_beforeToHtml(); } }
最后在app\code\local\Voodoo\News\Block\Adminhtml\News\Edit\Tab下建立Form.php
<?php class Voodoo_News_Block_Adminhtml_News_Edit_Tab_Form extends Mage_Adminhtml_Block_Widget_Form { /*public function __construct() { parent::__construct(); $this->setTemplate('news/news/tab/form.phtml'); //用setTemplate时不需要用_prepareForm }*/ protected function _prepareForm() { $form = new Varien_Data_Form(); $fieldset = $form->addFieldset('news_form', array('legend' => 'Item information')); $fieldset->addField('title', 'text', array('label' => 'Title', 'class' => 'required-entry', 'required' => true, 'name' => 'title')); $model = Mage::registry('form_data'); $form->setValues($model->getData()); $this->setForm($form); return parent::_prepareForm(); } }
这样就完成了模块的创建。block是Magento的重要部分,这里我们创建了7个新闻模块功能,我们写了一些方法,并且将数据传递到布局。
这样我们便完成了新闻模块的开发,这是后台截图:
相信留心的人已经在看Mage_Widget模块了,对的就是从这里学到的。像这种例子还可以参考Mage_Centinel。目前我只能向大家讲些框架的理论,具体里面的业务逻辑,还要靠自己多看、多理解。学习Magento绝对是个体力活,希望大家能够少走些弯路。
相关推荐
NULL 博文链接:https://hudeyong926.iteye.com/blog/1728074
此插件功能可以在后台添加magento的客户属性已经客户地址属性,已在1.8.1测试,正常安装使用。
Magento 日志管理器有时您在 Magento 商家的网站上工作,您必须从 Magento 扩展程序中筛选数千行日志才能找到有用的东西。... 作为交换,请查看我最新的,它将商店信用功能无缝添加到您的 Magento 商店。 谢谢! :)
Magento后台控制面板介绍..................................................................................................14 创建多网站和商店(Creating Multiple Websites and Stores)......................
激活Magento后台的“将商店代码添加到Urls”,即使没有商店代码,也可以使用您的主要URL。 此扩展名仅在主页上检查商店代码是否在URL中。 如果不是,它将重定向(301)到“基本URL +当前网站的默认商店查看代码”。...
Magento后台控制面板介绍..................................................................................................14 创建多网站和商店(Creating Multiple Websites and Stores)......................
完全可管理,您可以在后台启用/禁用所有功能 下载,删除和匿名化客户数据 实时系统:客户可以直接从仪表板上下载或删除自己的数据 [仅限开发人员]队列系统:如果处理不当,可以启用队列系统以删除或下载客户数据 ...
1.后台商品添加查看商品按钮 2.支付宝、财付通付款成功以后默认生成付款记录 3.前台订单查询功能增强,需要同时输入订单号和收件人 4.修改颜色属性表存储引擎为 InnoDB 修复: 1.修复不能评论的问题 2....
到目前为止, 不支持底部导航中最常用的多种后台堆栈管理。 Google已经有一个,该演示了如何处理多个Backstack。 缺点: 无论用户打开的顺序如何,它总是将用户带回到第一个选项卡。 主观方法,它每次用户在...