Magento1.9 module demo

一个简单的Magento1.9模块示例: 参考案例 https://segmentfault.com/a/1190000004366062

很多时候,不知道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.新建目录结构

2.为magento加载该模块,在etc/modules下添加配置文件Test_News.xml

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

3.在后台System-Configuration-Advanced 查看magento是否加载到该模块:

4.编写配置文件etc/config.xml
















<news><!-- 组名也即是模块名称 --> <use>standard</use> <args> <module>Test_News</module> <frontName>news</frontName> </args> </news>
</routers>
</frontend>




5.写控制器controllers/IndexController.php

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

通过url访问,local.magento.com/news/index/index

可以看到: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');

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,添加如下代码:

这里解释下含义:
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

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.再次刷新页面,到此为止,一个简单的模块就跑通了,备注,开发过程中,最好在后台将缓存关掉。

Leave a comment

您的电子邮箱地址不会被公开。 必填项已用 * 标注