magento新聞模塊開發(fā)_第1頁
magento新聞模塊開發(fā)_第2頁
magento新聞模塊開發(fā)_第3頁
magento新聞模塊開發(fā)_第4頁
magento新聞模塊開發(fā)_第5頁
已閱讀5頁,還剩17頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)

文檔簡介

1、Magento 新聞模塊開發(fā)教程 (一) 創(chuàng)建骨架目錄 今天突然想自己寫一個新聞模塊,于是去參考Packt的開發(fā)書籍,和本教程大同小異,分享給大家,宗旨還是大家能共同進步!本教程分為9章,那么我們現(xiàn)在開始!Magento 模塊應(yīng)當(dāng)遵循 Magento的MVC結(jié)構(gòu),包括block,controllers,etc,helper,model,sql,視圖層放在design的對應(yīng)目錄下,分為layout和template。當(dāng)然在寫模塊之前,你必須創(chuàng)建模塊的xml啟動文件,這個我會在后續(xù)的章節(jié)中提到。不管你用的是eclipse,netbeans還是zend studio,都應(yīng)該有如下的骨架目錄,我們把他

2、放在app/code/local下面:這樣我們便完成了對骨架目錄的創(chuàng)建,下一章我們會創(chuàng)建一個xml的模塊啟動文件來激活這個模塊。Magento 新聞模塊開發(fā)教程 (二) 激活你的模塊 現(xiàn)在我們應(yīng)該告訴Magento來激活這個模塊。1. 在app / etc / modules中的應(yīng)用程序創(chuàng)建一個新的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節(jié)點設(shè)置為true表示激活啟用。Magento 新聞模塊開發(fā)教程 (三) 創(chuàng)建前后端控制器 之前創(chuàng)建了骨架目錄并且激活了新模塊

4、,現(xiàn)在要為模塊創(chuàng)建前臺和后臺的控制器。1. 首先在app/code/local/Danfore/News/controllers/ 中創(chuàng)建一個名為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是前端控制器,主要負責(zé)加載和顯示文章列表和內(nèi)容,index 控制器負責(zé)現(xiàn)實文章列表,當(dāng)用戶點擊指定文章時,跳轉(zhuǎn)到view動作,顯示指定文章的詳細信息,magento中訪問數(shù)據(jù)庫需要創(chuàng)建一個core_resource對象,這個對象可以用來執(zhí)行sql語句。接下來創(chuàng)建一個后臺控制器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; 這個控制器主要負責(zé)后臺的一些動作,比如增刪查改。在_initAction()里面,我們做了三件事:加載布局,在后臺設(shè)置活動菜單,還有添加面包屑的文本Index action則創(chuàng)建一個news/adminhtml_news block和加載對應(yīng)布局。其他action則不一一熬述。調(diào)用edit操作時,用戶點擊編輯鏈接在新聞列表下新聞項目管理一節(jié)。相關(guān)新聞的編號是從

34、ID參數(shù)和傳遞的消息模型中抓取,以獲取具體的新聞。如果給定的新聞I產(chǎn)生的結(jié)果,它傳遞的新聞形式的數(shù)據(jù)來填充與形式給定的數(shù)據(jù)。新聞編輯表單提交后,數(shù)據(jù)的saveaction傳遞與更新的消息ID。還有一些其他的任務(wù),已實現(xiàn)這個方法,如裝載布局,建立活動的菜單,加入面包屑的文本等等。newAction()用于跳轉(zhuǎn)到edit動作saveActon()則用于與模型層交互,保存輸入的信息deleteAction()用于刪除指定的文章massDeleteAction()則是批量刪除massStatusAction()為批量狀態(tài)修改exportCsvAction()用于到處cvs文件exportXmlActi

35、on()則用于導(dǎo)入xml文件_sendUploadResponse則是當(dāng)導(dǎo)出xml文件時設(shè)置http報頭Magento的控制器其實和zend framework的控制器工作原理一樣,控制器必須在MVC模式下工作,它操縱模型,決定哪些視圖來顯示用戶的要求和其他因素的基礎(chǔ)上傳遞數(shù)據(jù),查看每個用戶響應(yīng),或完全關(guān)閉控制并跳轉(zhuǎn)到另一個控制器。他總是保持一個控制器盡量瘦小,業(yè)務(wù)邏輯則盡量交給model來處理,skinny controller and fat model !Magento 新聞模塊開發(fā)教程 (四) 創(chuàng)建模塊的xml配置文件 上一章我們好不容易創(chuàng)建好控制器,這里我們繼續(xù)為magento創(chuàng)建模

36、塊配置文件,在app/code/local/Danfore/News/etc下,我這里是app/code/local/Danfore/News/etc下創(chuàng)建一個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> 這個文件包含了我們的新聞模塊的不同組成部分,既為前端和后臺信息。如果我們觀察該配置文件的結(jié)構(gòu),會發(fā)現(xiàn)有五個組件,1. (module)模塊:它包含版本信息2. (frontend)前端:這包含路由器和布局信息3. (admin)管理員:這是路由器的設(shè)置和管理部分的參數(shù)4. (adminhtml)后臺界面:這是菜單,ACL和布局管理5。(global)全局:它包含配置的model, resources, blocks, and helpers等具體可以參見官方config.xml的文檔,Magento 新聞模塊開發(fā)教程

46、 (五) 創(chuàng)建輔助類 在MVC應(yīng)用程序中,模型處理業(yè)務(wù)邏輯和數(shù)據(jù)返回到控制器,控制器最終傳遞數(shù)據(jù)給視圖。如果我們需要一個相當(dāng)復(fù)雜的需求邏輯需要重復(fù)或我們不希望它放置在一個視圖文件,Helper組件將有助于處理復(fù)雜的情況。在大多數(shù)情況下,一個輔助類幫助組織一個像樣的數(shù)據(jù)邏輯,可以用他來反復(fù)處理。在我們這章中,我們將為我們的新聞模塊創(chuàng)建一個空Helper文件,也是Magento輔助類的經(jīng)常需要處理的情況:1 訪問模型2 執(zhí)行復(fù)雜的或重復(fù)的顯示邏輯3 操作和格式化模型數(shù)據(jù)4 傳遞視圖腳本之間的數(shù)據(jù)那么這里,我們會在appcodelocalDanforeNewsHelper下面創(chuàng)建一個輔助類Data.

47、php <?php class Danfore_News_Helper_Data extends Mage_Core_Helper_Abstract 這個文件是我們的新聞模塊的一部分。如果我們愿意,我們可以添加一些方法。這里是空的,因為我們的新聞模塊沒有任何復(fù)雜的邏輯。但是你應(yīng)該知道什么是Magento的輔助類,并且在什么時候它能派上用場!Magento 新聞模塊開發(fā)教程 (六) 創(chuàng)建模型 創(chuàng)建好輔助類后,接下來為我們的新聞模塊創(chuàng)建相關(guān)的模型。在MVC結(jié)構(gòu)中,Model (模型)用于處理業(yè)務(wù)邏輯,在Magento中,模型用于更新數(shù)據(jù)庫記錄,和web 服務(wù)器交互等等。模型是MVC結(jié)構(gòu)中非常

48、重要的部分,Magento的模型擴展自Zend_Db_Table_Abstract 類,這個類可以連接Varien對象,然后訪問數(shù)據(jù)庫。這里我們會為新聞模塊創(chuàng)建對應(yīng)的模型。在appcodelocalDanforeNewsModel下面,創(chuàng)建一個名為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下創(chuàng)建多一個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. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論