一個簡單的Magento1.9模塊示例

不少時候,不知道Magento模塊到底該怎麼寫,好比ThinkPHP,YII框架,它是直接將控制器Controller中的所取得相關數據直接傳遞到視圖層View,而Magento雖然也是MVC三層,可是在中間多了佈局對象Layout與區塊Block之間的關係,記錄下在學習Magento過程當中的一些片斷,以便共同窗習。
本次要作的就是,撰寫一個magento模塊,讓該模塊跑完整個magento的流程。即經過config.xml配置文件,找到相應控制器xxxxController,再到相應方法xxxxAction,從控制器中實例化Model,查詢數據庫,實例化Mysql4資源對象,經過佈局layout下的xxx.xml配置,找到相應的Block文件,在block中查收數據,最後在template模板文件,調用Block中獲得的數據,顯示到前臺頁面。
1.新建目錄結構php

app
 |-code
 |-----local
 |----------Test
 |--------------News
 |------------------Block
 |------------------controllers
 |------------------etc
                     |----config.xml
 |------------------Helper
 |------------------Model

2.爲magento加載該模塊,在etc/modules下添加配置文件Test_News.xmlcss

<?xml version="1.0" encoding="UTF-8"?>
<config>
    <modules>
        <Test_News>
            <active>true</active>
            <codePool>local</codePool><!-- 代碼池 -->
        </Test_News>
    </modules>
</config>

3.查看magento是否加載到該模塊:
圖片描述
4.編寫配置文件etc/config.xmlhtml

<?xml version="1.0" encoding="UTF-8"?>
<config>
    <modules>
        <Test_News>
            <version>0.1.0</version>
        </Test_News>
    </modules>
    <!-- add Frontend -->
    <frontend>
        <routers>
<!-- 分配路由 -->
            <news><!-- 組名也便是模塊名稱 -->
                <use>standard</use>
                <args>
                    <module>Test_News</module>
                    <frontName>news</frontName>
                </args>
            </news>
        </routers>
    </frontend>
</config>

5.寫控制器controllers/IndexController.phpmysql

<?php
class Test_News_IndexController extends Mage_Core_Controller_Front_Action
{
    public function indexAction()
    {
        echo "hello world";
    }
}

經過url訪問,local.magento.com/news/index/indexsql

能夠看到:hello world。數據庫

6.接下來,咱們的目的是要從數據庫中查詢出數據,這裏,咱們能夠先不經過magento自帶的sql文件寫入,能夠本身先在數據庫建個測試表,填充兩條記錄來進行測試。數組

CREATE TABLE `blog_posts` ( 
    `blogpost_id` int(11) NOT NULL AUTO_INCREMENT, 
    `title` text, 
    `post` text, 
    `date` datetime DEFAULT NULL, 
    `timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, 
    PRIMARY KEY  (`blogpost_id`) 
);
INSERT INTO `blog_posts` VALUES (1,'My New Title','This is a blog post','2009-07-01 00:00:00','2009-07-02 23:12:30');
INSERT INTO `blog_posts` VALUES (2,'My Second Time','This is a blog post22','2019-11-01 00:10:03','2012-07-02 23:12:30');

7.建立模型,須要啓用模型,啓用資源模型,在資源模型中添加實體,再爲資源模型設置讀、寫適配器。
依次創建好Model下的文件。
這裏在配置文件config.xml中添加以下代碼:緩存

<global>
        <models>
            <news><!-- 組名也便是模塊名稱 -->
                <class>Test_News_Model</class><!-- 基本類名,這個模塊全部內容都繼承這個類名 -->
                <resourceModel>news_mysql4</resourceModel>

                <!--當一個模型須要訪問數據庫時,就會實例化一個資源模型來使用,這裏決定用哪一個資源模型,資源模型纔是真正和數據庫對話的組件-->
            </news>
            <news_mysql4>
                <class>Test_News_Model_Mysql4</class><!-- 標籤的值是全部資源模型類的基本類名,命名格式如上述所示 -->
                <entities>
                    <news>
                        <table>blog_posts</table><!-- 這裏決定操做數據庫哪一張表 -->
                    </news>
                </entities>
            </news_mysql4>
        </models>
        <!-- 這裏設置了資源模型使用的數據表的URL「news/news」,magento會把「news」做爲組名,「news」做爲實體名,一個實體對應一張數據表,咱們的數據表是「blog_posts」,因此<table>標籤裏面的內容是"blog_posts" -->
       <!--add resource  -->
         <resources>
            <news_setup>
                <setup>
                    <module>Test_News</module>
                </setup>
                <connection>
                    <use>core_setup</use>
                </connection>
            </news_setup>
            <news_write>
                <connection>
                    <use>core_write</use>
                </connection>
            </news_write>
            <news_read>
                <connection>
                    <use>core_read</use>
                </connection>
            </news_read>
        </resources>
    </global>

Model文件夾的目錄結構以下app

Model
 |----News.php
 |----Mysql4
        |----News.php
        |----News
              |---Collection.php

爲何要這麼建立,參見《深刻理解Magento 第二章》
咱們來填充下各個文件裏面的代碼:
/Model/News.php框架

<?php
class Test_News_Model_News extends Mage_Core_Model_Abstract
{
    public function _construct()
    {
        parent::_construct();
        $this->_init('news/news');
    }
}

/Model/Mysql4/News.php

<?php
class Test_News_Model_News extends Mage_Core_Model_Abstract
{
    public function _construct()
    {
        parent::_construct();
        $this->_init('news/news','blogpost_id');
    }
}

/Model/Mysql4/News/Collection.php

<?php
class Test_News_Model_Mysql4_News_Collection extends Mage_Core_Model_Mysql4_Collection_Abstract
{
    public function _construct()
    {
        parent::_construct();
        $this->_init('news/news');
    }
}

8.建立好Model後,繼續添加Helper和Block,在配置文件config.xml中添加

<global>
    <blocks>
            <news>
                <class>Test_News_Block</class>
            </news>
        </blocks>
        <helpers>
            <news>
                <class>Test_News_Helper</class>
            </news>
        </helpers>
</global>

/Helper/Data.php

<?php
class Test_News_Helper_Data extends Mage_Core_Helper_Abstract
{
}

9.這裏,咱們其實已經能夠查詢到數據庫中的內容了,來測試下,在控制中添加以下代碼:

public function indexAction(){
         $read = Mage::getSingleton("core/resource")->getConnection('core_read');
         $sql = "select * from `blog_posts`";
         $result = $read->fetchAll($sql);
         print_r($result);
}

獲得一個二維數組。
圖片描述
可是,咱們的目的不是從控制器中返回,而是從模板頁面,因此,註釋掉控制器中的方法,咱們在Block中添加上述代碼。
/Block/News.php

<?php
 class Test_News_Block_News extends Mage_Core_Block_Template
 {
     public function blogposts() 
     {
         $read = Mage::getSingleton("core/resource")->getConnection('core_read');
         $sql = "select * from `blog_posts`";
         $result = $read->fetchAll($sql);
         return $result;
         //print_r($result);
    } 
}

10.這裏遇到的問題是,獲得了數據,可是如何才能將數據傳遞到Template的phtml頁面,TP有$this->assign(),$this->display()來傳遞,magento是如何傳遞的呢?是否想過這個問題?我也在這裏卡了好久,一直在說Magento的配置文件很強大,以前一直沒有體現,這裏的解決方式,仍是magento的配置文件。
在design/frontend/rwd/default/layout文件夾下,新建local.xml,添加以下代碼:

<?xml version="1.0" encoding="UTF-8"?>
<layout version="0.1.0">
    <!-- IndexController ouptput config -->
    <news_index_index>
        <reference name="root">
            <block type="news/news" name="root" output="toHtml" template="news/blog_posts.phtml"></block>
        </reference>
    </news_index_index>
</layout>

這裏解釋下含義:
news_index_index:表示news模塊下的IndexController下的indexAction;
<reference>表示引入模塊,name=「root」表示替換掉默認的以name=「root」的模塊;
<block>表示新建一個模塊,
type="news/news",表示從news模塊下,找block下的news.php文件,
template="news/blog_posts.phtml",表示在Template文件夾下,找到news/blog_posts.phtml文件。
11.在template文件夾下新建blog_posts.phtml

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title>Untitled</title>
    <style type="text/css">
        body {
            background-color:pink;
        }
    </style>
</head>
<body>
<h3>blog_posts Table</h3>
<?php var_dump($result=$this->blogposts());?>//調用block中的blogposts方法
</body>
</html>

12.這裏須要修改上面的indexAction控制器中的內容,內容以下:

class Test_News_IndexController extends Mage_Core_Controller_Front_Action
{
    public function indexAction()
    {
        //echo "hello world";
//        $read = Mage::getSingleton("core/resource")->getConnection('core_read');
//        $sql = "select * from `blog_posts`";
//        $result = $read->fetchAll($sql);
//        print_r($result);
        $this->loadLayout();
        $this->renderLayout();
    }
}

13.再次刷新頁面,到此爲止,一個簡單的模塊就跑通了,備註,開發過程當中,最好在後臺將緩存關掉。
圖片描述

相關文章
相關標籤/搜索