资讯专栏INFORMATION COLUMN

一个简单的Magento1.9模块示例

Pikachu / 1268人阅读

摘要:本次要做的就是,撰写一个模块,让该模块跑完整个的流程。创建模型,需要启用模型,启用资源模型,在资源模型中添加实体,再为资源模型设置读写适配器。

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

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

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



    
        
            true
            local
        
    

3.查看magento是否加载到该模块:

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



    
        
            0.1.0
        
    
    
    
        

            
                standard
                
                    Test_News
                    news
                
            
        
    

5.写控制器controllers/IndexController.php


通过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");

7.创建模型,需要启用模型,启用资源模型,在资源模型中添加实体,再为资源模型设置读、写适配器。
依次建立好Model下的文件。
这里在配置文件config.xml中添加如下代码:


        
            
                Test_News_Model
                news_mysql4

                
            
            
                Test_News_Model_Mysql4
                
                    
                        blog_posts
Test_News core_setup core_write core_read

Model文件夹的目录结构如下

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

为什么要这么创建,参见《深入理解Magento 第二章》
我们来填充下各个文件里面的代码:
/Model/News.php

_init("news/news");
    }
}

/Model/Mysql4/News.php

_init("news/news","blogpost_id");
    }
}

/Model/Mysql4/News/Collection.php

_init("news/news");
    }
}

8.创建好Model后,继续添加Helper和Block,在配置文件config.xml中添加


    
            
                Test_News_Block
            
        
        
            
                Test_News_Helper
            
        

/Helper/Data.php


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

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;
表示引入模块,name=“root”表示替换掉默认的以name=“root”的模块;
表示新建一个模块,
type="news/news",表示从news模块下,找block下的news.php文件,
template="news/blog_posts.phtml",表示在Template文件夹下,找到news/blog_posts.phtml文件。
11.在template文件夹下新建blog_posts.phtml




    Untitled
    


blog_posts Table

blogposts());?>//调用block中的blogposts方法

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

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/21336.html

相关文章

  • Magento1如何打开调试模式,来显示前台路径提示信息?

    摘要:的版本中如何开启调试模式呢在前面,写了一篇有关如何开启调试模式来显示前台的路径信息,便于在学习的时候,能快速的找到各个对应的文件。但是,现在这个项目用的,在的版本中如何开启调试模式呢两种方法供参考方法一通过后台控制台来操作,选择也选择。 magento1.x的版本中如何开启调试模式呢? 在前面,写了一篇有关Magento2.0如何开启调试模式来显示前台的路径信息,便于在学习magent...

    hlcfan 评论0 收藏0
  • RequireJS:一款优秀AMD模块加载器

    摘要:概述是一款遵循规范协议的模块加载器,不但能在浏览器端充分利用,同样能在其他的运行时环境,比如和。使用像这样的模块加载器能提高代码的质量和开发速度。一般放在页面的入口出,用来加载其他的模块。 RequireJS概述 RequireJS是一款遵循AMD规范协议的JavaScript模块加载器, 不但能在浏览器端充分利用,同样能在其他的JavaScript运行时环境, 比如Rhino和No...

    syoya 评论0 收藏0
  • js 简易模块加载器 示例分析

    摘要:简易模块加载器示例点来了接下来我们先来看一段建议模块加载器的示例代码以上是加载器的实现,再来看看如何使用吧你好啊要去杭州玩了章炜今天天气不错噢在以上代码中,我们定义了三个模块,分别名为。 前端模块化 关注前端技术发展的各位亲们,肯定对模块化开发这个名词不陌生。随着前端工程越来越复杂,代码越来越多,模块化成了必不可免的趋势。 各种标准 由于javascript本身并没有制定相关标准(当然...

    miqt 评论0 收藏0
  • React 官网示例实现 + 五子棋 + 简单文章发表 demo

    摘要:五子棋游戏博客官网示例实现源码之前一直在用,前几天看了下的官方文档,写了个加强对的理解,欢迎指正。五子棋游戏该模块实现了五子棋和井字游戏两个游戏。五子棋游戏只记录了最近步的数据,步以前的数据不会记录,故悔棋只可悔步以内的棋。 五子棋游戏 + 博客 demo + React官网示例实现 github 源码:https://github.com/moshang-xc/react-demo ...

    Astrian 评论0 收藏0

发表评论

0条评论

Pikachu

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<