Magento 添加后台管理

简介:

后台菜单显示点击后404,如果adminhtml.xml配置正确,那是config.xml的问题

Magento Grid关联了多表后,表与表之间有相同字段出现。在后台点查询时出现报错解决用filter_index

Java代码   收藏代码
  1. $this->addColumn('name', array(  
  2.     'header' => '返利商家',  
  3.     'align' => 'right',  
  4.     'width' => '50px',  
  5.     'index' => 'vname',  
  6.     'filter_index' =>'v.name',  
  7. ));  
  8. $this->addColumn('type', array(  
  9.     'header' => '返利规则名',  
  10.     'align' => 'right',  
  11.     'width' => '50px',  
  12.     'index' => 'name',  
  13.     'filter_index' =>'main_table.name',  
  14. ));  

1.在后台管理界面加入菜单

1.1添加新菜单

Java代码   收藏代码
  1. <?xml version="1.0"?>  
  2. <config>  
  3.     <menu>  
  4.         <!--子菜单标识符-->  
  5.         <dcatalog translate="title">  
  6.             <title>推荐位管理</title>  
  7.             <sort_order>110</sort_order>  
  8.             <children>  
  9.                 <recommend_product translate="title">  
  10.                     <title>商品推荐</title>  
  11.                     <action>adminhtml/recommend_product</action>  
  12.                 </recommend_product>  
  13.                 <recommend_jifen translate="title">  
  14.                     <title>积分商户推荐</title>  
  15.                     <action>adminhtml/recommend_jifen</action>  
  16.                 </recommend_jifen>  
  17.                 <recommend_image translate="title">  
  18.                     <title>图片推荐</title>  
  19.                     <action>adminhtml/recommend_image</action>  
  20.                 </recommend_image>  
  21.             </children>  
  22.         </dcatalog>  
  23.     </menu>  
  24.     <acl>  
  25.         <resources>  
  26.             <admin>  
  27.                 <children>  
  28.                     <dcatalog translate="title">  
  29.                         <title>推荐位管理</title>  
  30.                         <children>  
  31.                             <recommend_product translate="title">  
  32.                                 <title>商品推荐</title>  
  33.                                 <sort_order>0</sort_order>  
  34.                             </recommend_product>  
  35.                             <recommend_jifen translate="title">  
  36.                                 <title>商品推荐</title>  
  37.                                 <sort_order>0</sort_order>  
  38.                             </recommend_jifen>  
  39.                             <recommend_image translate="title">  
  40.                                 <title>图片推荐</title>  
  41.                                 <sort_order>0</sort_order>  
  42.                             </recommend_image>  
  43.                         </children>  
  44.                     </dcatalog>  
  45.                 </children>  
  46.             </admin>  
  47.         </resources>  
  48.     </acl>  
  49. </config>  


 

1.2在已有菜单下添加:在模块的Glamour/CustomerMessage/etc目录下增加adminhtml.xml配置文件,用于加入自定义的菜单项。文件内容如下:

Java代码   收藏代码
  1. <?xml version="1.0"?>  
  2. <config>  
  3.     <menu>  
  4.         <!-- 父菜单项标识,此处是在标题为Customers的菜单下加入子菜单-->  
  5.         <!-- Magento一级管理菜单标识和显示标题-->  
  6.         <!--  
  7.              dashboard =>Dashboard  
  8.              catalog=>Catalog  
  9.              sales=>Sales  
  10.              customer=>Customers  
  11.              newsletter=>Newsletter  
  12.              cms=>CMS  
  13.              report=>Reports  
  14.         -->  
  15.         <customer>  
  16.             <children>  
  17.                 <!--子菜单标识符-->  
  18.                 <customermessage translate="title">  
  19.                     <title>Customer Message</title>  
  20.                 <!--点击菜单时执行的动作,此处将执行controller/adminhtml目录下的messageController默认的action-->  
  21.                     <action>adminhtml/message</action>  
  22.                     <sort_order>120</sort_order>  
  23.                 </customermessage >  
  24.             </children>  
  25.          </customer>  
  26.     </menu>  
  27.    <!--加入权限列表-->  
  28.     <acl>  
  29.         <resources>  
  30.             <admin>  
  31.                 <children>  
  32.                     <customer>  
  33.                         <children>  
  34.                             <customermessage translate="title">  
  35.                                 <title>Customer Message</title>  
  36.                             </customermessage>  
  37.                         </children>  
  38.                     </customer>  
  39.                 </children>  
  40.             </admin>  
  41.         </resources>  
  42.     </acl>  
  43. </config>  

可以在后台,系统-》权限-》角色-》角色资源-》自定义 查看

2开发后台Controller

在模块的controllers目录下创建Adminhtml目录,新建一个Controller类。

Java代码   收藏代码
  1. <?php  
  2. class Glamour_CustomerMessage_Adminhtml_MessageController extends Mage_Adminhtml_Controller_Action {  
  3.   
  4.     public function indexAction() {  
  5.         $this->loadLayout()  
  6.             ->_setActiveMenu('customer')  
  7.             ->_addBreadcrumb('Customer Message''Customer Message')  
  8.         ->renderLayout();  
  9.     }  
  10.   
  11.     protected function _initData() {  
  12.         $id = $this->getRequest()->getParam('id'0);  
  13.         $model = Mage::getModel('news/news');  
  14.         if ($id > 0) {  
  15.             $model = $model->load($id);  
  16.         }  
  17.         Mage::register('form_data', $model);  
  18.   
  19.         return $formdata;  
  20.     }  
  21.   
  22.     public function editAction() { //页面回显  
  23.     if (!$formdata = $this->_initData()) {  
  24.             return;  
  25.         }  
  26.         try{  
  27.             $this->loadLayout();  
  28.             $this->_setActiveMenu('customer/message');  
  29.             $this->_addContent($this->getLayout()->createBlock('news/adminhtml_news_edit'))  
  30.                 ->_addLeft($this->getLayout()->createBlock('news/adminhtml_news_edit_tabs'));  
  31.             $this->renderLayout();  
  32.         } catch(Exception $e) {  
  33.             Mage::getSingleton('adminhtml/session')->addError('记录不存在');  
  34.             $this->_redirect('*/*/');  
  35.         }  
  36.     }  
  37.   
  38.     public function newAction() {  
  39.         $this->_forward('edit');  
  40.     }  
  41.   
  42.     public function deleteAction() {  
  43.         $id = $this->getRequest()->getParam('id');  
  44.         if ($id > 0) {  
  45.             try {  
  46.                 $this->doDelete($id);  
  47.                 Mage::getSingleton('adminhtml/session')->addSuccess('删除成功');  
  48.                 $this->_redirect('*/*/');  
  49.             } catch (Exception $e) {  
  50.                 Mage::getSingleton('adminhtml/session')->addError('删除失败');  
  51.                 $this->_redirect('*/*/edit', array('id' => $this->getRequest()->getParam('id')));  
  52.             }  
  53.         }  
  54.         $this->_redirect('*/*/');  
  55.     }  
  56.   
  57.     public function saveAction() {  
  58.         if ($data = $this->getRequest()->getPost()) {  
  59.             try {  
  60.                 $model = Mage::getModel('news/news');  
  61.                 $model->setData($data);  
  62.                 $model->save();  
  63.                 Mage::getSingleton('adminhtml/session')->addSuccess('保存成功');  
  64.                 // check if 'Save and Continue'  
  65.                 if ($this->getRequest()->getParam('back')=='edit') {  
  66.                     $this->_redirect('*/*/edit', array('id' => $model->getId()));  
  67.                     return;  
  68.                 }  
  69.                 $this->_redirect('*/*/');  
  70.             } catch (Exception $e) {  
  71.                 Mage::getSingleton('adminhtml/session')->addError($e->getMessage());  
  72.                 $this->_redirect('*/*/edit', array('id' => $model->getId()));  
  73.                 return;  
  74.             }  
  75.         }  
  76.         $this->_redirect('*/*/');  
  77.     }  
  78.   
  79.     public function massDeleteAction() {  
  80.         $ids = $this->getRequest()->getParam('news');  
  81.         if (!empty($ids)) {  
  82.             try {  
  83.                 $this->doDelete($ids);  
  84.                 Mage::getSingleton('adminhtml/session')->addSuccess(sprintf('删除 %d条成功', count($ids)));  
  85.             } catch (Exception $e) {  
  86.                 Mage::getSingleton('adminhtml/session')->addError('删除失败');  
  87.             }  
  88.         }  
  89.         $this->_redirect('*/*/');  
  90.     }  
  91.   
  92.     private function doDelete($id) {  
  93.         if (is_array($id)) {  
  94.             foreach ($id as $id) {  
  95.                 $this->doDelete($id);  
  96.             }  
  97.         } else {  
  98.             Mage::getModel('news/news')->load($id)->delete();  
  99.         }  
  100.     }  
  101.   
  102.     public function exportCsvAction() {  
  103.         $fileName = 'fanli.csv';  
  104.         $grid = $this->getLayout()->createBlock('rebates/adminhtml_order_grid');  
  105.         $this->_prepareDownloadResponse($fileName, strip_tags($grid->getCsv()));   //string 方式  
  106. //      $this->_prepareDownloadResponse($fileName, $grid->getCsvFile($fileName)); //读export/xml方式导出,先写文件再读文件,性能不好  
  107.     }  
  108. }  

后台的Controller类继承自Mage_Adminhtml_Controller_Action,在etc/config.xml加入:

Java代码   收藏代码
  1. </frontend>  
  2. <admin>  
  3.      <routers>  
  4.         <adminhtml>  
  5.             <args>  
  6.                 <modules>  
  7.                     <customermessage before="Mage_Adminhtml">Glamour_CustomerMessage_Adminhtml</customermessage>  
  8.                 </modules>  
  9.             </args>  
  10.         </adminhtml>  
  11.     </routers>  
  12. </admin>  

这样就可以使用和Magento自带的后台模块类似的url .../index.php/admin/message/来访问自定义模块的后台controller,也可以实现rewrite后台controller。

 

3开发后台Block

在app\code\local\Voodoo\News\Block\Adminhtml下,建立News.php文件:列表显示

Java代码   收藏代码
  1. class Voodoo_News_Block_Adminhtml_News extends Mage_Adminhtml_Block_Widget_Grid_Container  
  2. {  
  3.     public function __construct()  
  4.     {  
  5.         $this->_controller = 'adminhtml_news'//block路径  
  6.         $this->_blockGroup = 'news';//module name  
  7.         $this->_headerText = '管理';  
  8.         $this->_addButtonLabel = '添加';  
  9.         parent::__construct();  
  10. //$this->_removeButton('back');//reset save add  
  11.     }  
  12. }   

 同样目录下继续建立Grid.php文件:

Java代码   收藏代码
  1. <?php  
  2. class Voodoo_News_Block_Adminhtml_News_Grid extends Mage_Adminhtml_Block_Widget_Grid {  
  3.   
  4.     public function __construct() {  
  5.         parent::__construct();  
  6.         $this->setId('newsGrid');  
  7.         $this->setDefaultSort('news_id');  
  8.         $this->setDefaultDir('ASC');  
  9.         $this->setSaveParametersInSession(true);  
  10.     }  
  11.   
  12.     protected function _prepareCollection() {  
  13.         $collection = Mage::getModel('news/news')->getCollection();  
  14.         $this->setCollection($collection);  
  15.         return parent::_prepareCollection();  
  16.     }  
  17.   
  18.     protected function _prepareColumns() {  
  19.         $this->addColumn('news_id', array(  
  20.             'header' => 'ID',  
  21.             'align' => 'right',  
  22.             'width' => '50px',  
  23.             'index' => 'news_id',  
  24.         ));  
  25.         $this->addColumn('action', array(  
  26.             'header' => '操作',  
  27.             'width' => '100',  
  28.             'type' => 'action',  
  29.             'getter' => 'getId',  
  30.             'actions' => array(  
  31.                 array(  
  32.                     'caption' => '修改',  
  33.                     'url' => array('base' => '*/*/edit'),  
  34.                     'field' => 'id'  
  35.                 )  
  36.             ),  
  37.             'filter' => false,  
  38.             'sortable' => false,  
  39.             'index' => 'stores',  
  40.             'is_system' => true,  
  41.         ));  
  42.         $this->addExportType('*/*/exportCsv''CSV');  
  43.         return parent::_prepareColumns();  
  44.     }  
  45.   
  46.     protected function _prepareMassaction() {  
  47.         $this->setMassactionIdField('news_id');  //checkbox value  需要_prepareMassactionColumn  
  48.         $this->getMassactionBlock()->setFormFieldName('news'); //checkbox name  
  49.         $this->getMassactionBlock()->addItem('delete', array(  
  50.             'label' => '删除',  
  51.             'url' => $this->getUrl('*/*/massDelete'),  
  52.             'confirm' => '确认删除?'  
  53.         ));  
  54.         return $this;  
  55.     }  
  56.   
  57.     protected function _prepareMassactionColumn() {  
  58.         $columnId = 'massaction';  
  59.         $massactionColumn = $this->getLayout()->createBlock('adminhtml/widget_grid_column')  
  60.             ->setData(array(  
  61.             'index'     => $this->getMassactionIdField(),  
  62.             'type'      => 'massaction',  
  63.             'name'      => $this->getMassactionBlock()->getFormFieldName(),  
  64.             'align'     => 'center',  
  65.             'disabled_values' => array(13),  // checkbox disabled values  
  66.             'is_system' => true//系统自带导出csv/excel中不显示  
  67.             'use_index' =>true  // 关联setMassactionIdField  
  68.         ));  
  69.   
  70.         if ($this->getNoFilterMassactionColumn()) {  
  71.             $massactionColumn->setData('filter'false);  
  72.         }  
  73.   
  74.         $massactionColumn->setSelected($this->getMassactionBlock()->getSelected())  
  75.             ->setGrid($this)  
  76.             ->setId($columnId);  
  77.   
  78.         $oldColumns = $this->_columns;  
  79.         $this->_columns = array();  
  80.         $this->_columns[$columnId] = $massactionColumn;  
  81.         $this->_columns = array_merge($this->_columns, $oldColumns);  
  82.         return $this;  
  83.     }  
  84.   
  85.     public function getRowUrl($row) //点击tr进入edit,去掉后显示#  
  86.     {  
  87.         return $this->getUrl('*/*/edit', array('id' => $row->getId()));  
  88.     }  
  89. }  

 app\code\local\Voodoo\News\Block\Adminhtml\News中建立Edit.php文件:

Java代码   收藏代码
  1. <?php  
  2. class Voodoo_News_Block_Adminhtml_News_Edit extends Mage_Adminhtml_Block_Widget_Form_Container {  
  3.     //protected $_mode = 'edit';//form.php目录名  
  4.   
  5.     public function __construct() {  
  6.         parent::__construct();  
  7.         $this->_objectId = 'id';  
  8.         $this->_blockGroup = 'news';  
  9.         $this->_controller = 'adminhtml_news';  
  10.   
  11.         $this->_updateButton('save''label''保存');  
  12.         $this->_updateButton('delete''label''删除');  
  13.         $this->_addButton('saveandcontinue', array(  
  14.             'label'     => Mage::helper('adminhtml')->__('Save and Continue Edit'),  
  15.             'onclick'   => 'saveAndContinueEdit()',  
  16.             'class'     => 'save',  
  17.         ), -100);  
  18.   
  19.         $this->_formScripts[] =<<<JS  
  20.             function toggleEditor() {  
  21.                 if (tinyMCE.getInstanceById('block_content') == null) {  
  22.                     tinyMCE.execCommand('mceAddControl'false'block_content');  
  23.                 } else {  
  24.                     tinyMCE.execCommand('mceRemoveControl'false'block_content');  
  25.                 }  
  26.             }  
  27.   
  28.             function saveAndContinueEdit(){  
  29.                 editForm.submit(\$('edit_form').action+'back/edit/');  
  30.             }  
  31. JS;  
  32.     }  
  33.   
  34.     public function getHeaderText() {  
  35.         if (Mage::registry('form_data') && Mage::registry('form_data')->getId()) {  
  36.             return ("Edit Item '%s'", $this->htmlEscape(Mage::registry('news_data')->getTitle());  
  37.         } else {  
  38.             return 'Add Item';  
  39.         }  
  40.     }  
  41.   
  42.     public function _prepareLayout() {  //add js css 需要添加此方法,其他可以删除  
  43.         $this->getLayout()->getBlock('head')  
  44.             ->addJs('extjs/ext-tree.js')  
  45.             ->addJs('extjs/ext-tree-checkbox.js')  
  46.             ->addItem('js_css''extjs/resources/css/ext-all.css');  
  47.   
  48.         return parent::_prepareLayout();  
  49.     }  
  50. }  

app\code\local\Voodoo\News\Block\Adminhtml\News\Edit下创建Form.php和Tabs.php:

Java代码   收藏代码
  1. <?php  
  2. class Voodoo_News_Block_Adminhtml_News_Edit_Form extends Mage_Adminhtml_Block_Widget_Form  
  3. {  
  4.     protected function _prepareForm()  
  5.     {  
  6.         $form = new Varien_Data_Form(array(  
  7.             'id'        => 'edit_form',  
  8.             'action'    => $this->getUrl('*/*/save', array('id' =>$this->getRequest()->getParam('id'))),  
  9.             'method'    => 'post',  
  10.             'enctype'   => 'multipart/form-data'  
  11.         ));  
  12.         $form->setUseContainer(true);  
  13.         $this->setForm($form);  
  14.         return parent::_prepareForm();  
  15.     }  
  16. }  

 下面的是tab选项卡带form,可以不要。将$fieldset的内容放到上面去

Java代码   收藏代码
  1. <?php  
  2. class Voodoo_News_Block_Adminhtml_News_Edit_Tabs extends Mage_Adminhtml_Block_Widget_Tabs  
  3. {  
  4.     public function __construct()  
  5.     {  
  6.         parent::__construct();  
  7.         $this->setId('news_tabs');  
  8.         $this->setDestElementId('edit_form');  
  9.         $this->setTitle('News Information');  
  10.     }  
  11.   
  12.     protected function _beforeToHtml()  
  13.     {  
  14.         $this->addTab('form_section', array(  
  15.             'label' => 'News Information',  
  16.             'title' => 'News Information',  
  17.             'content' => $this->getLayout()->createBlock('news/adminhtml_news_edit_tab_form')->toHtml(),  
  18.         ));  
  19.         return parent::_beforeToHtml();  
  20.     }  
  21. }  

 最后在app\code\local\Voodoo\News\Block\Adminhtml\News\Edit\Tab下建立Form.php

Java代码   收藏代码
  1. <?php  
  2. class Voodoo_News_Block_Adminhtml_News_Edit_Tab_Form extends Mage_Adminhtml_Block_Widget_Form {  
  3.   
  4.     /*public function __construct() { 
  5.         parent::__construct(); 
  6.         $this->setTemplate('news/news/tab/form.phtml'); //用setTemplate时不需要用_prepareForm 
  7.     }*/  
  8.     protected function _prepareForm() {  
  9.         $form = new Varien_Data_Form();  
  10.   
  11.         $fieldset = $form->addFieldset('news_form', array('legend' => 'Item information'));  
  12.         $fieldset->addField('title''text', array('label' => 'Title''class' => 'required-entry''required' => true'name' => 'title'));  
  13.   
  14.         $model = Mage::registry('form_data');  
  15.         $form->setValues($model->getData());  
  16.         $this->setForm($form);  
  17.         return parent::_prepareForm();  
  18.     }  
  19. }  

这样就完成了模块的创建。block是Magento的重要部分,这里我们创建了7个新闻模块功能,我们写了一些方法,并且将数据传递到布局。

这样我们便完成了新闻模块的开发,这是后台截图:

相信留心的人已经在看Mage_Widget模块了,对的就是从这里学到的。像这种例子还可以参考Mage_Centinel。目前我只能向大家讲些框架的理论,具体里面的业务逻辑,还要靠自己多看、多理解。学习Magento绝对是个体力活,希望大家能够少走些弯路。

相关文章
|
4月前
|
搜索推荐 Java 关系型数据库
基于SSM的博客系统【带后台管理】
基于SSM的博客系统【带后台管理】
|
6月前
|
JSON 前端开发 搜索推荐
Laravel系列开源Dcat admin礼盒商城后台管理项目
Laravel系列开源Dcat admin礼盒商城后台管理项目
|
6月前
|
资源调度 Java 数据库连接
31.2k!这是我见过最强的后台管理系统 !
本期项目概览: ruoyi-vue-pro:RuoYi-Vue 全新 Pro 版本 AGEIPort:数据导入导出解决方案 PowerJob:分布式调度与计算 mybatis-crypto:mybatis 字段加解密组件 novel:小说精品屋 ruoyi-vue-pro:RuoYi-Vue 全新 Pro 版本
|
9月前
如何在WordPress上配置WooCommerce
如果您尝试将WooCommerce与WordPress一起使用,那么在设置它时需要了解一些事项。如果您正在寻找一种简单的方法来设置您的在线商店并且仍然拥有博客功能,这是一个好主意。以下是您可以使用这两个平台开始建立此在线商店的一些最佳方法,而无需雇用某人为您处理所有事情。
|
12月前
|
监控 NoSQL JavaScript
31.4k!这是我见过最强的后台管理系统 !!
31.4k!这是我见过最强的后台管理系统 !!
|
安全 前端开发 搜索推荐
Joomla建站教程——你应该知道的关于Joomla的误解
像 Joomla 这样的开源内容管理系统在过去十余年推动了网络的发展,并负责数百万在线网站。Joomla 是第二大 CMS,具有坚如磐石的代码库和非常有用的支持社区。尽管 Joomla 是最受欢迎的 CMS 之一,但它仍被许多荒谬的误解所包围。如果您刚刚开始使用 Joomla,您可能会迷失在网络上的信息池和错误信息中。
Joomla建站教程——你应该知道的关于Joomla的误解
|
前端开发 数据库连接 数据库
ThinkPhp5开发实战2:后台管理登录设计
系列文章目录 第一章 ThinkPhp5开发实战1:搭建环境配置TP5框架(持续更新收藏关注) 文章目录系列文章目录前言一、选取合适的前端模板二、资源引用渲染前端1.导入框架引入资源文件2.渲染前端登陆界面三、构造数据库登陆表字段1.设计数据库登录表四、配置数据库连接、添加登录控制器1.TP5连接数据库2.登录控制器3.添加验证码check五、登录演示总结 前言 本文主讲:ThinkPhp5开发实战系列续集:设计登录界面,完成登录操作 对于没有配置开发环境或者TP5框架的同学,请参考文章 [第一章 T
ThinkPhp5开发实战2:后台管理登录设计
|
数据库
Magento介绍及建站流程
Magento建站简易流程第一步,注册网址域名,现在很多注册机构可以网上注册,先查询域名有没有被人注册,没有的话可以进行注册,然后缴费。注意一点就是注册的年限到期前必须续费; 第二步,购买虚拟主机和把域名DNS解析到所购买的网站空间,修改A HOST,使得域名能指向网站空间地址; 第三步,通过虚拟...
1873 0