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) 提取第二行的数据,依此类推.
附个写好的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>
关于作者