1. 程式人生 > >magento教程:新建一個新聞管理外掛(一)

magento教程:新建一個新聞管理外掛(一)

外掛概述

我們將以新聞管理外掛來舉例說明開發外掛中的一些實踐和限制。

這個外掛的主要功能是讓商家能夠在後臺管理新聞並且在前臺能看到新聞。

如果你想跳過此例,你可以到此篇內容底部去看看附錄中的建議。

程式碼配置

選擇我們的程式碼池

Notice

1、如果你的外掛打算給社群用,那麼就應該寫在Community資料夾中。

2、為了提高可讀性和使模版和模組程式碼之間更為清晰,模版應該放在一個獨立的且以你模組名稱空間和模組名命名的資料夾。

   例如:在這個外掛中,我們將為前端模版建立資料夾magentostudy來包含我們存放外掛模版的news資料夾。而magentostudy放在 frontend/baset/default/template/下。

3、基於類似理由,你的佈局檔案也應該以你的模組名稱空間和模組名命名。

   例如:在這個外掛中 ,我們的前端佈局檔案將被命名成magentostudy{{_news.xml}},並且放在frontend/base/default/layout.

4、建議本地佈局檔案命名不要包含它們的名稱空間。

   例如:和核心模組Mage_Catalog有關的佈局只是命名成catalog.xml,而不是mage_catalog.xml.

下一步,我們需要對我們外掛的名稱空間和名字命名。我們將以magentostudy為我們的名稱空間,並且News作為外掛名。

建立我們的程式碼結構

現在我們來選擇一個程式碼池,名稱空間和外掛名字來建立我們程式碼的最基本的目錄結構。

你的外掛有什麼目錄這取決於你的外掛功能。

例如:你的外掛不需要控制器,那麼你可以不必建立controllers目錄。

建立我們的配置檔案

下一步,我們需要讓magento知道我們的模組存在並且開啟了。我們也需要配置模組內容。

為此,我們要建立兩個配置檔案,應用宣告檔案和模組宣告檔案。

1、應用宣告檔案:

   在app/etc/modules/目錄下新建我們的應用宣告檔案,並且以名稱空間和模組名命名為Magentostudy_news.xml.

   這個配置檔案告訴magento,我們的模組存放在哪一個程式碼池、模組是否開啟、外掛需要依賴哪個模組。

2、模組宣告檔案:

   App/code/<程式碼池

>/<名稱空間>/<模組名>/etc/目錄下建立我們的config.xml配置檔案(此檔案必須命名為config.xml.

   指定blocksmodelshelpersroutes、及我們外掛需要包含的配置。

應用宣告檔案

剩下的是我們需要決定哪一個模組我們需要依賴到。我們沒有打算重寫核心模組,但是我們需要把我們的模組加在後臺。根據這個,外掛將依賴核心模組Mage_adminhtml

Notice

1、經常檢查你的外掛的依賴關係,因為確實或者錯誤的依賴項將導致你的外掛產生致命錯誤。

2、只有必要的依賴關係才應該被指定,因為這影響這核心模組的載入順序。不必要的依賴不應該被指定。

<?xml version="1.0"?>
<!
--
/**
* Module initial config
*
* @author Magento
*/
--
>
<config>
<span style="font-family:宋體;">   </span><modules>
         <Magentostudy_News>
              <active>true</active>
              <codePool>community</codePool>
              <depends>
                   <Mage_adminhtml/>
             </depends>
         </Magentostudy_News>
<span style="font-family:宋體;">   </span></modules>
</config>


3、模組配置檔案

現在我們來設定初始化配置檔案,設定外掛需要用到的一些節點(modelsclasseshelpers及其他)。

外掛將在前臺新增兩個頁面,一個就是列表頁,一個是詳細頁。

外掛將能改變資料庫來儲存資料並且在後臺能夠管理新聞。

基於需求,我們需要在配置檔案中定義幾項目。在以後,討論到外掛的實現時,我們將逐步完善每個部分。

下面看到的程式碼片段就是我們即將用到的。

<?xml version="1.0"?>
<config>
    <modules>
        <Magentostudy_News>
            <version>1.0.0.0.1
            </version>
        </Magentostudy_News>
    </modules>
    <global>
        <models>
            <magentostudy_news>
                <class>Magentostudy_News_Model</class>
                <resourceModel>news_resource</resourceModel>
            </magentostudy_news>
            <news_resource>
                <class>Magentostudy_News_Model_Resource</class>

                <entities>
                    <news>
                        <table>magentostudy_news</table>
                    </news>
                </entities>
            </news_resource>
        </models>
        <helpers>
            <magentostudy_news>
                <class>Magentostudy_News_Helper</class>
            </magentostudy_news>
        </helpers>
        <blocks>
            <magentostudy_news>
                <class>Magentostudy_News_Block</class>
            </magentostudy_news>
        </blocks>
        <resources>
            <magentostudy_news_setup>
                <setup>
                    <module>Magentostudy_News</module>
                    <class>Mage_Core_Model_Resource_Setup</class>
                </setup>
            </magentostudy_news_setup>
        </resources>
        <events>
            <before_news_item_display>
                <observers>
                    <magentostudy_news>
                        <class>magentostudy_news/observer</class>
                        <method>beforeNewsDisplayed</method>
                    </magentostudy_news>
                </observers>
            </before_news_item_display>
        </events>
    </global>
    <frontend>
        <routers>
            <magentostudy_news>
                <use>standard</use>
                <args>
                    <module>Magentostudy_News</module>
                    <frontName>news</frontName>
                </args>
            </magentostudy_news>
        </routers>
        <layout>
            <updates>
                <magentostudy_news>
                    <file>magentostudy_news.xml</file>
                </magentostudy_news>
            </updates>
        </layout>
    </frontend>
    <Admin>
        <routers>
            <adminhtml>
                <args>
                    <modules>
                        <Magentostudy_News before="Mage_adminhtml">Magentostudy_News_adminhtml</Magentostudy_News>
                    </modules>
                </args>
            </adminhtml>
        </routers>
    </Admin>
    <adminhtml>
        <layout>
            <updates>
                <magentostudy_news>
                    <file>magentostudy_news.xml</file>
                </magentostudy_news>
            </updates>
        </layout>
    </adminhtml>
    <default>
        <news>
            <view>
                <enabled>1</enabled>
                <items_per_page>20</items_per_page>
                <days_difference>3</days_difference>
            </view>
        </news>
    </default>
</config>

檢查模組是否配置成功

在這裡,我們配置好了我們的配置檔案,如果我們操作正確的話,magento就應該能看到我們的模組。

我們可以在後臺檢查一下。

進入後臺系統system > 配置configuration > 高階Advanced > 禁用模組 disable modules找到我們的模組(magentostudy_news.xml.

Notice

你有可能因為快取看不到效果,可以用以下兩個方法來解決此問題:

1、在你做出任何改變後清空快取(system>cache management)。

2、在開發外掛時禁用快取。

模版設定


我們已經建立了我們的程式碼結構目錄及外掛配置,在此基礎上,我們還要建立檢視結構。

雖然magento遵循MVC設計的基本理念,但是view元件卻完全不同於zend標準。

Viewmagento中被分成了blockslayoutstemplates,而不是一個單獨的檔案來接受控制器邏輯或者模型資料。

我們已經準備好了blocks的架構,下一步我們需要準備templateslayouts的架構。我們把這些放在design目錄裡。

由於在magento中能夠使用不同的主題和magento的回退機制,所有的外掛的前臺主題檔案都應該放在base/default包裡,

後臺的則放在default/default/對應的後臺目錄。這能使外掛即使在後臺選擇不同的主題時也能正確獨立的執行。



Notice

外掛的模版和佈局檔案應該放在什麼包裡取決於他們是否使用於前端或者後臺。

1、前端模版和佈局檔案應該放在frontend/base/default

2、後臺的模版和佈局檔案應該放在/default/default package.

3、為了提高程式碼的可讀性並且使模版和模組間的關係更為清晰,模版應該放在一個單獨的以模組名稱空間和模組名為名字的目錄裡。

   例如:在我們這個外掛中,我們建立了magentostudy目錄來包含存在外掛模版的news資料夾。而magentostudy資料夾則存放在

   Frontend/base/default/template/目錄下。

4、基於類似理由,layouts也應該以模組的名稱空間和模組名來命名。

   例如:我們當前外掛的佈局檔案的名字是magentostudy_news.xml,並且存放在frontend/base/default/layout/

5、本地佈局的名字不包含名稱空間。

   例如:核心模組Mage_Catalog的佈局檔案只是被命名成catalog.xml,並不是mage_catalog.xml

建立我們的模版和佈局架構

因為我們的模組會牽動到前臺和後臺,所以我們都要為此建立檔案和目錄。正如早前提高的,你可以只建外掛必須用到的目錄。

例如:你有一個用於後臺的佈局檔案,但是沒有模版,你就可以不用為此建立一個存放模版的目錄。

幫助檔案

除了模版和佈局檔案,一個外掛可能還需要一些額外的檔案像imagesjavascriptcss files、或者其他的擴充套件類庫。

Javascriptcss

你可以用來存放javascript檔案的地方有兩個,專案的js目錄或者對應的面板目錄。

專案的js目錄存放的一般是對多個模組有很大作用的程式碼檔案。

例如:一些類庫,如果只是一個外掛指定的javascript,那就應該放在面板的對應目錄。

Notice

1、如果你用全域性的js目錄,那麼你的javascript檔案就應該存放在一個新建的並且根據模組名或者將用到類庫的js命名。

   例如:任何我們當前擴充套件用到的javascript檔案都放在js/magentostudy_news,類似的,任何定製的外部類庫都將放在/js/對應的類庫名/下。

2、使用全域性方法,你可以將你的後臺js檔案放在相同的目錄/js/magentostudy_news/

3、如果你使用面板目錄,那麼你的前端js檔案就應該放在skin/frontend/base/default/js/<namespace_name>,在我們的案例中,           skin/frontend/base/default/js/magentostudy_news/

4、使用面板的方法,後臺的js檔案就應該放在skin/adminhtml/default/default/js/<namespace_name>

   在我們的案例中是skin/adminhtml/default/default/js/magentostudy_news/


Notcie

1、前端cssskin/frontend/base/default/css/,在我們的案例中

   Skin/frontend/base/css/magentostudy_news.css

2、後臺cssskin/adminhtml/default/default/css,在我們的案例中

   Skin/adminhtml/default/default/css/magentostudy_news.css

Notcie:

1、圖片和其他一些媒體檔案應該放在媒體目錄。

2、外部的類庫應該放在類庫目錄並且以類庫的名字命名。

3、外部類庫應該開源。