通过清心醉

Magento开发实例:编写自己的模型(Model)并简单的提取数据

Magento 开发实例三(模型Model)

暂时将项目名称由Qxz改为Mage,数据库配置还挺麻烦的.

对任何一个MVC框架来说,模型(Model)层的实现都是占据了很大一部分。对于Magento来说,模型占据了一个更加重要的位置,因为它常常包含了一部分商业逻辑代码。这些代码在其他的MVC框架中往往出现在控制器或者帮助函数中。

Magento自带的Zend框架提供了SQL抽象层,但是在大多数情况下我们将通过Magento自带的模型和我们自己的模型来进行数据访问。他和视图层(View)一样,Magento的模型层是一个高度灵活,高度抽象的甚至让人有点令人费解。

 

Magento模型分为两类:

第一类是基本的ActiveRecord类型,一张表一个对象的模型。

第二类是Entity Attribute Value(EAV)模型。

 

Magento自己定义了一个数据类型叫做模型集合(Model Collection)。顾名思义,模型集合就是一个对象里面包含了很多模型对象。Magento的创造者Varien团队实现了PHP类库的标准接口,“IteratorAggregate”,“Countable”。这样模型集合就能调用这些方法,这也是模型集合和数组的区别。

Magento的模型并不直接访问数据库。每一个模型都有一个资源模型(Resource Model),每一个资源模型拥有两个适配器(Adapter),一个读,一个写。这样的话逻辑模型和数据库访问就分开了,所以从理论上讲更改底层数据库只需要重写适配器就可以了,所有上层代码都不需要更改。

 

我们来为Mymodule模块创建多个Blog控制器

class Mage_Mymodule_BlogController extends Mage_Core_Controller_Front_Action
{
public function indexAction() #默认方法
{
$blog = Mage::getModel(‘mymodule/blog’); #获取模板实例
$params = $this->getRequest()->getParams();
#获取页面的/id/1
$blog->load($params[‘id’]);
$data=$blog->getData(); #获取表内的全部数据
var_dump($data); #输出
}
}

#现在我们如果执行,还不能进行输出

#我们先增加个表/字段

CREATE TABLE still_blog(id int primary key auto_increment,name varchar(128),phone int(16));

INSERT INTO still_blog(name,phone)VALUES(‘chenkuizong’,’13823819185′);

这里我们创建了一张名为“blog”的表,并填充了一条数据。

#由于考虑表前缀still_blog的关系,请修改下,如果没有表前缀直接使用blog

创建模型

要设置一个模型一共有四个步骤

启用模型、启用资源模型、在资源模型中添加实体Entity(对于简单的模型来说,实体就是数据表的名字)、为资源模型设置读、写适配器。

在进行这些步骤之前,我们先来看假设这些步骤已经做完了,我们怎么用一个模型。在Magento中,我们用以下的方式来实例化一个模型。

 

$model = Mage::getModel(‘mymodule/blog’);

Mage::getModel有两个参数。分别为模块名字/操作的数据表段。

和Mage::getHelper()的原理类似,这里Magento也是通过全局配置去查找模型的类名。模型的类名和我前面讲过的块类名一样,都是分组类名。

我们来为Blog配置的模型config.xml,打开当前模块的config.xml,在</config>前面加入global/models节点:

<global>
<models>
<mymodule>
<class>Mage_Mymodule_Model</class>
<resourceModel>mymodule_resource</resourceModel>
</mymodule>
</models>
</global>

标签就是组名,也应该和模块名一致。标签的内容是基本类名,所有Mymodule模块的模型都用这个基本类名,命名方式如下

项目名称_模块名称_Model == Mage_Mymodule_Model

Blog控制器代码中:$blog= Mage::getModel(‘mymodule/blog’);

可以看出会尝试实例化Mage_Mymodule_Model_Blog

所以在模型中创建该文件并且创建这个类

app/code/local/Mage/Mymodule/Model/Blog.php

 

class Mage_Mymodule_Model_Blog extends Mage_Core_Model_Abstract

{

protected function _construct()

{

$this->_init(‘mymodule/blog’);

}

}

所有的模型都必须继承“Mage_Core_Model_Abstract”类。这个抽象类强制你实现一个方法“_construct”(注意:这个不是PHP的构造行数“__construct”)。这个方法应该调用父类已经定义好的“_init”方法,参数是资源模型的URI,也就是我们要告诉模型使用哪个资源模型。

好了,我们设置好了模型,下面我们要为模型设置资源模型。资源模型才是真正和数据库对话的组件。在模型的配置中,有一段这样的代码

<resourceModel>mymodule_resource</resourceModel>

的值将被用来实例化资源模型。我们不需要显式的调用资源模型,但是当一个模型需要访问数据库的时候,Magento会自动实例化一个资源模型来使用。

Mage::getResourceModel(‘mymodule/blog’);

这里“mymodule/blog”就是我们给模型的“_init”传入的参数。 “Mage::getResourceModel”方法将以“mymodule/blog”为URI在全局配置中找到标签的值,在这里是“mymodule_resource”。

然后Magento会用URI“mymodule_resource/blog”去实例化资源模型类。实例化的过程和我们前面讲的模型的实例化是一样的,所以我们也需要在config.xml中添加资源模型的声明

在config.xml里的</models></global>节点里加入:

<mymodule_resource>
<class>Mage_Mymodule_Model_Resource</class>
<entities>
<blog>
<table>blog</table>
</blog>
</entities>
</mymodule_resource>

然后为模型添加一个资源类文件,添加如下文件

/app/code/local/Mage/Mymodule/Model/Resource/Blog.php

class Mage_Mymodule_Model_Resource_Blog extends Mage_Core_Model_Resource_Db_Abstract
{
protected function _construct()
{
$this->_init(‘mymodule/blog’,’id’);
}
}

#这里“_init”方法的第一个参数这个资源模型将要使用的数据表的URI,第二个参数是数据表中的列名。这个列的内容必须唯一,往往是数据表的主键。

这时候如果我们直接访问127.0.0.1/mymodule/blog/index

显示的是:array(0) { } 空值

我们再来看控制器:

$blog = Mage::getModel(‘mymodule/blog’); #获取模板实例
$params = $this->getRequest()->getParams();
#获取页面的/id/1
$blog->load($params[‘id’]);
$data=$blog->getData(); #获取表内的全部数据
var_dump($data); #输出

我们需要有两个参数

127.0.0.1/mymodule/blog/index/id/1

Url里加多个id/1 就行了.

如果我们/id/2 那么就会根据主键(一般都是用id) 提取第二行的数据,依此类推.

magento_model

 

magento_model1

 

附个写好的config.xml配置,作者一开始写的时候因为配置写错N次,导致无法提取数据,文章所说的也只一一增加,会让人混淆加错位置:

<?xml version=”1.0″?>
<config>
<modules>
<Mage_Mymodule>
<version>0.1.0</version>
</Mage_Mymodule>
</modules>

<frontend>
<routers>
<mymodule>
<use>standard</use>
<args>
<module>Mage_Mymodule</module>
<frontName>mymodule</frontName>
</args>
</mymodule>
</routers>
</frontend>

<global>
<models>
<mymodule>
<class>Mage_Mymodule_Model</class>
<resourceModel>mymodule_resource</resourceModel>
</mymodule>
<mymodule_resource>
<class>Mage_Mymodule_Model_Resource</class>
<entities>
<blog>
<table>blog</table>
</blog>
</entities>
</mymodule_resource>
</models>
</global>
</config>

关于作者

清心醉 administrator

发表评论

请输入验证码: