版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、Magento 新闻模块开发教程 (一) 创建骨架目录 今天突然想自己写一个新闻模块,于是去参考Packt的开发书籍,和本教程大同小异,分享给大家,宗旨还是大家能共同进步!本教程分为9章,那么我们现在开始!Magento 模块应当遵循 Magento的MVC结构,包括block,controllers,etc,helper,model,sql,视图层放在design的对应目录下,分为layout和template。当然在写模块之前,你必须创建模块的xml启动文件,这个我会在后续的章节中提到。不管你用的是eclipse,netbeans还是zend studio,都应该有如下的骨架目录,我们把他
2、放在app/code/local下面:这样我们便完成了对骨架目录的创建,下一章我们会创建一个xml的模块启动文件来激活这个模块。Magento 新闻模块开发教程 (二) 激活你的模块 现在我们应该告诉Magento来激活这个模块。1. 在app / etc / modules中的应用程序创建一个新的XML文件,命名为INTERFACE_MODULE目录中。就我而言,这是Danfore_News.xml2. 写入以下代码,这样,我们的模块便激活了。 <?xml version="1.0"?> <config> <modules> <D
3、anfore_News> <active>true</active> <codePool>local</codePool> </Danfore_News> </modules> </config> Magento的配置很大程度上取决于xml文件。对于新建立的模块,我们必须告诉magento新的包,这里是Danfore,并且告诉magento新的代码库放在local下面,active节点设置为true表示激活启用。Magento 新闻模块开发教程 (三) 创建前后端控制器 之前创建了骨架目录并且激活了新模块
4、,现在要为模块创建前台和后台的控制器。1. 首先在app/code/local/Danfore/News/controllers/ 中创建一个名为IndexController.php的前端控制器:class Danfore_News_IndexController extends Mage_Core_Controller_Front_Action public function indexAction() $resource = Mage:getSingleton('core/resource'); $read = $resource->getConnection(
5、39;core_read'); $newsTable = $resource->getTableName('news'); $select = $read->select()->from($newsTable, array('news_id', 'title', 'filename','content', 'status')->where('status', 1)->order('created_time DESC'); $new
6、s = $read->fetchAll($select); Mage:register('list', $news); $this->loadLayout(); $this->renderLayout(); public function viewAction() $news_id = $this->getRequest()->getParam('id'); if ($news_id != null && $news_id != '') $news = Mage:getModel('news/
7、news')->load($news_id)->getData(); else $news = null; /* * If no param we load a the last created item */ if ($news = null) $resource = Mage:getSingleton('core/resource'); $read = $resource->getConnection('core_read'); $newsTable = $resource->getTableName('news
8、9;); $select = $read->select()->from($newsTable, array('news_id', 'filename', 'title','content', 'status', 'update_time')->where('status', 1)->order('created_time DESC'); $news = $read->fetchRow($select); Mage:register(
9、39;news', $news); $this->loadLayout(); $this->renderLayout(); 这个controller是前端控制器,主要负责加载和显示文章列表和内容,index 控制器负责现实文章列表,当用户点击指定文章时,跳转到view动作,显示指定文章的详细信息,magento中访问数据库需要创建一个core_resource对象,这个对象可以用来执行sql语句。接下来创建一个后台控制器NewsController.php,放在app/code/local/Danfore/News/controllers/Adminhtml/目录下:cla
10、ss Danfore_News_Adminhtml_NewsController extends Mage_Adminhtml_Controller_action protected function _initAction() $this->loadLayout()->_setActiveMenu('news/items')->_addBreadcrumb(Mage:helper('adminhtml')->_('Items Manager'), Mage:helper('adminhtml')->
11、_('Item Manager'); return $this; public function indexAction() $this->_initAction(); $this->_addContent($this->getLayout()->createBlock('news/adminhtml_news'); $this->renderLayout(); public function editAction() $id = $this->getRequest()->getParam('id');
12、$model = Mage:getModel('news/news')->load($id); if ($model->getId() | $id = 0) $data = Mage:getSingleton('adminhtml/session')->getFormData(true); if (!empty($data) $model->setData($data); Mage:register('news_data', $model); $this->loadLayout(); $this->_setAc
13、tiveMenu('news/items'); $this->_addBreadcrumb(Mage:helper('adminhtml')->_('Item Manager'), Mage:helper('adminhtml')->_('News Item Manager'); $this->_addBreadcrumb(Mage:helper('adminhtml')->_('Item News'), Mage:helper('adminht
14、ml')->_('Item News'); $this->getLayout()->getBlock('head')->setCanLoadExtJs(true); $this->_addContent($this->getLayout()->createBlock('news/adminhtml_news_edit')->_addLeft($this->getLayout()->createBlock('news/adminhtml_news_edit_tabs'
15、;); $this->renderLayout(); else Mage:getSingleton('adminhtml/session')->addError(Mage:helper('news')->_('Item does not exist'); $this->_redirect('*/*/'); public function newAction() $this->_forward('edit'); public function saveAction() if ($data
16、 = $this->getRequest()->getPost() if (isset($_FILES'filename''name') && $_FILES'filename''name' != '') try /* Starting upload */ $uploader = new Varien_File_Uploader('filename'); / Any extention would work $uploader->setAllowedExtensio
17、ns(array('jpg', 'jpeg','gif', 'png'); $uploader->setAllowRenameFiles(false); $uploader->setFilesDispersion(false); / We set media as the upload dir $path = Mage:getBaseDir('media') . DS . 'news' . DS; $uploader->save($path, $_FILES'filenam
18、e''name'); catch (Exception $e) /this way the name is saved in DB $data'filename' = $_FILES'filename''name' $model = Mage:getModel('news/news'); $model->setData($data)->setId($this->getRequest()->getParam('id'); try if ($model->getCr
19、eatedTime = NULL | $model->getUpdateTime() = NULL) $model->setCreatedTime(now()->setUpdateTime(now(); else $model->setUpdateTime(now(); $model->save(); Mage:getSingleton('adminhtml/session')->addSuccess(Mage:helper('news')->_('Item was successfully saved'
20、); Mage:getSingleton('adminhtml/session')->setFormData(false); if ($this->getRequest()->getParam('back') $this->_redirect('*/*/edit', array('id' => $model->getId(); return; $this->_redirect('*/*/'); return; catch (Exception $e) Mage:getSin
21、gleton('adminhtml/session')->addError($e->getMessage(); Mage:getSingleton('adminhtml/session')->setFormData($data); $this->_redirect('*/*/edit', array('id' => $this->getRequest()->getParam('id'); return; Mage:getSingleton('adminhtml/se
22、ssion')->addError(Mage:helper('news')->_('Unable to find item to save'); $this->_redirect('*/*/'); public function deleteAction() if ($this->getRequest()->getParam('id') > 0) try $model = Mage:getModel('news/news'); $model->setId($this
23、->getRequest()->getParam('id')->delete(); Mage:getSingleton('adminhtml/session')->addSuccess(Mage:helper('adminhtml')->_('Item was successfully deleted'); $this->_redirect('*/*/'); catch (Exception $e) Mage:getSingleton('adminhtml/session
24、')->addError($e->getMessage(); $this->_redirect('*/*/edit', array('id' => $this->getRequest()->getParam('id'); $this->_redirect('*/*/'); public function massDeleteAction() $newsIds = $this->getRequest()->getParam('news'); if (!is
25、_array($newsIds) Mage:getSingleton('adminhtml/session')->addError(Mage:helper('adminhtml')->_('Please select item(s)'); else try foreach ($newsIds as $newsId) $news = Mage:getModel('news/news')->load($newsId); $news->delete(); Mage:getSingleton('adminh
26、tml/session')->addSuccess(Mage:helper('adminhtml')->_('Total of %d record(s) were successfully deleted',count($newsIds); catch (Exception $e) Mage:getSingleton('adminhtml/session')->addError($e->getMessage(); $this->_redirect('*/*/index'); public fu
27、nction massStatusAction() $newsIds = $this->getRequest()->getParam('news'); if (!is_array($newsIds) Mage:getSingleton('adminhtml/session')->addError($this->_('Please select item(s)'); else try foreach ($newsIds as $newsId) $news = Mage:getSingleton('news/news&
28、#39;)->load($newsId)->setStatus($this->getRequest()->getParam('status')->setIsMassupdate(true)->save(); $this->_getSession()->addSuccess($this->_('Total of %d record(s) were successfully updated', count($newsIds); catch (Exception $e) $this->_getSession(
29、)->addError($e->getMessage(); $this->_redirect('*/*/index'); public function exportCsvAction() $fileName = 'news.csv' $content = $this->getLayout()->createBlock('news/adminhtml')->getCsv(); $this->_sendUploadResponse($fileName, $content); public function
30、exportXmlAction() $fileName = 'news.xml' $content = $this->getLayout()->createBlock('news/adminhtml_news_grid')->getXml(); $this->_sendUploadResponse($fileName, $content); protected function _sendUploadResponse($fileName, $content,$contentType='application/octet-strea
31、m') $response = $this->getResponse(); $response->setHeader('HTTP/1.1 200 OK', ''); $response->setHeader('Pragma', 'public', true); $response->setHeader('Cache-Control', 'must-revalidate, postcheck=0, pre-check=0', true); $response->s
32、etHeader('Content-Disposition', 'attachment;filename=' . $fileName); $response->setHeader('Last-Modified', date('r'); $response->setHeader('Accept-Ranges', 'bytes'); $response->setHeader('Content-Length', strlen($content); $response-&g
33、t;setHeader('Content-type', $contentType); $response->setBody($content); $response->sendResponse(); die; 这个控制器主要负责后台的一些动作,比如增删查改。在_initAction()里面,我们做了三件事:加载布局,在后台设置活动菜单,还有添加面包屑的文本Index action则创建一个news/adminhtml_news block和加载对应布局。其他action则不一一熬述。调用edit操作时,用户点击编辑链接在新闻列表下新闻项目管理一节。相关新闻的编号是从
34、ID参数和传递的消息模型中抓取,以获取具体的新闻。如果给定的新闻I产生的结果,它传递的新闻形式的数据来填充与形式给定的数据。新闻编辑表单提交后,数据的saveaction传递与更新的消息ID。还有一些其他的任务,已实现这个方法,如装载布局,建立活动的菜单,加入面包屑的文本等等。newAction()用于跳转到edit动作saveActon()则用于与模型层交互,保存输入的信息deleteAction()用于删除指定的文章massDeleteAction()则是批量删除massStatusAction()为批量状态修改exportCsvAction()用于到处cvs文件exportXmlActi
35、on()则用于导入xml文件_sendUploadResponse则是当导出xml文件时设置http报头Magento的控制器其实和zend framework的控制器工作原理一样,控制器必须在MVC模式下工作,它操纵模型,决定哪些视图来显示用户的要求和其他因素的基础上传递数据,查看每个用户响应,或完全关闭控制并跳转到另一个控制器。他总是保持一个控制器尽量瘦小,业务逻辑则尽量交给model来处理,skinny controller and fat model !Magento 新闻模块开发教程 (四) 创建模块的xml配置文件 上一章我们好不容易创建好控制器,这里我们继续为magento创建模
36、块配置文件,在app/code/local/Danfore/News/etc下,我这里是app/code/local/Danfore/News/etc下创建一个config.xml文件: <?xml version="1.0"?> <config> <modules> <Danfore_News> <version>0.1.0</version> </Danfore_News> </modules> <frontend> <routers> <new
37、s> <use>standard</use> <args> <module>Danfore_News</module> <frontName>news</frontName> </args> </news> </routers> <layout> <updates> <news> <file>news.xml</file> </news> </updates> </layout&g
38、t; </frontend> <admin> <routers> <news> <use>admin</use> <args> <module>Danfore_News</module> <frontName>news</frontName> </args> </news> </routers> </admin> <adminhtml> <menu> <news module="
39、;news"> <title>News</title> <sort_order>71</sort_order> <children> <items module="news"> <title>Manage Items</title> <sort_order>0</sort_order> <action>news/adminhtml_news</action> </items> </children&
40、gt; </news> </menu> <acl> <resources> <all> <title>Allow Everything</title> </all> <admin> <children> <Danfore_News> <title>News Module</title> <sort_order>10</sort_order> </Danfore_News> </children>
41、; </admin> </resources> </acl> <layout> <updates> <news> <file>news.xml</file> </news> </updates> </layout> </adminhtml> <global> <models> <news> <class>Danfore_News_Model</class> <resourceModel&
42、gt;news_mysql4</resourceModel> </news> <news_mysql4> <class>Danfore_News_Model_Mysql4</class> <entities> <news> <table>news</table> </news> </entities> </news_mysql4> </models> <resources> <news_setup> <setu
43、p> <module>Danfore_News</module> </setup> <connection> <use>core_setup</use> </connection> </news_setup> <news_write> <connection> <use>core_write</use> </connection> </news_write> <news_read> <connection
44、> <use>core_read</use> </connection> </news_read> </resources> <blocks> <news> <class>Danfore_News_Block</class> </news> </blocks> <helpers> <news> <class>Danfore_News_Helper</class> </news> </helpe
45、rs> </global> </config> 这个文件包含了我们的新闻模块的不同组成部分,既为前端和后台信息。如果我们观察该配置文件的结构,会发现有五个组件,1. (module)模块:它包含版本信息2. (frontend)前端:这包含路由器和布局信息3. (admin)管理员:这是路由器的设置和管理部分的参数4. (adminhtml)后台界面:这是菜单,ACL和布局管理5。(global)全局:它包含配置的model, resources, blocks, and helpers等具体可以参见官方config.xml的文档,Magento 新闻模块开发教程
46、 (五) 创建辅助类 在MVC应用程序中,模型处理业务逻辑和数据返回到控制器,控制器最终传递数据给视图。如果我们需要一个相当复杂的需求逻辑需要重复或我们不希望它放置在一个视图文件,Helper组件将有助于处理复杂的情况。在大多数情况下,一个辅助类帮助组织一个像样的数据逻辑,可以用他来反复处理。在我们这章中,我们将为我们的新闻模块创建一个空Helper文件,也是Magento辅助类的经常需要处理的情况:1 访问模型2 执行复杂的或重复的显示逻辑3 操作和格式化模型数据4 传递视图脚本之间的数据那么这里,我们会在appcodelocalDanforeNewsHelper下面创建一个辅助类Data.
47、php <?php class Danfore_News_Helper_Data extends Mage_Core_Helper_Abstract 这个文件是我们的新闻模块的一部分。如果我们愿意,我们可以添加一些方法。这里是空的,因为我们的新闻模块没有任何复杂的逻辑。但是你应该知道什么是Magento的辅助类,并且在什么时候它能派上用场!Magento 新闻模块开发教程 (六) 创建模型 创建好辅助类后,接下来为我们的新闻模块创建相关的模型。在MVC结构中,Model (模型)用于处理业务逻辑,在Magento中,模型用于更新数据库记录,和web 服务器交互等等。模型是MVC结构中非常
48、重要的部分,Magento的模型扩展自Zend_Db_Table_Abstract 类,这个类可以连接Varien对象,然后访问数据库。这里我们会为新闻模块创建对应的模型。在appcodelocalDanforeNewsModel下面,创建一个名为News.php的文件: <?php class Danfore_News_Model_News extends Mage_Core_Model_Abstract public function _construct() parent:_construct(); $this->_init('news/news'); ?&g
49、t; 在appcodelocalDanforeNewsModelMysql4下创建多一个News.php文件: <?php class Danfore_News_Model_Mysql4_News extends Mage_Core_Model_Mysql4_Abstract public function _construct() / Note that the news_id refers to the key field in your database table. $this->_init('news/news', 'news_id'); ?> 然后再appcodelocalDanforeNewsModelMy
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 智慧停车巡管员培训
- 2025中国绿色建筑标准实施及行业发展前景报告
- 2025中国移动式商业空间运营模式创新研究报告
- 中国香文化讲师高级培训教材及课程资料库
- 2025中国疫苗生产车间生物气溶胶截留过滤器验证标准报告
- 2025中国电子商务市场趋势与商业模式创新研究报告
- 小记者文字培训课程
- 客房服务面试高频资料
- 公司年终绩效考核标准与执行细则
- 装饰工程预算管理
- 寺院义工班管理制度
- 国开2023秋《思想道德与法治》专题测验试题1-17参考答案
- 中药煎煮方法ppt
- 职业健康知识培训培训培训课件
- 2023年浙江省宁波余姚市事业单位招聘(93人)(共500题含答案解析)高频考点题库参考模拟练习试卷
- 《数字景观进展》
- 2023版押品考试题库必考点含答案
- 类固醇糖尿病优质课件
- 煤矿安全设施设计验收申报材料汇编
- 公司律师管理办法
- 房地产公司中期诊断报告
评论
0/150
提交评论