JoomlaMVC基类
Joomla提供了MVC的基类:JView JModel JController ,JTable。一个完整的Joomla MVC,必须从这四个类或者派生类继承,而Joomla2.5有更丰富的派生类,来满足Joomla2.5更多的新特征。
- JView
视图,包括模板与数据输出逻辑。view.html.php就是JView的一个实现。它的功能是从Model中得到数据,并且输出到模板中。
- JController
控制器,一个组件可以有多个控制器,每一个控制器都会有多个task.你想要joomla为你做什么,那么久给他一个task.比喻task=edit task=save
- JTable
数据表,它直接与数据库打交道,把数据库抽象为一个JTable对象,它给Model提供可操作的数据。并且可以对操作进行预处理。例如在写入表是title不能为空的判定。一般情况下,它只于Model交互。其他部分最好不要直接使用JTable.
- JModel
模型,为系统提供更加抽象的数据管理,他的存在,可以使开发人员不必关系数据库操作。
MVC类命名规则
默认情况下,主控制器AController ->子控制器AControllerB变量(AModelB TableB ,AViewB)由于TableB这个名称容易与其他组件名称冲突,所以一般会在AModelB中给他指定前缀,他TableB改为ATableB.
MVC之间的关系是自动建立的,不需要额外的声明。例如在AViewB中使用getModel,系统会自动获取AModelB,在AModelB使用getTable,会自动获取TableB.
MVC之间的关系
table是数据结构,它是数据库上存储数据的结构原型。它只能代表一个表。Joomla的每个表都必须拥有对应的JTable继承,它给model提供表的细节。只要JTable继承类建好,一般只有在model中会操作它,其他地方不必操作JTable实例。
在JModel中要得到一个JTable
$table = $this->getTable("Users",'UsersTable');
如果有必要夸组件访问table,可以使用以下方法加载其它table的路径
JTable::addIncludePath(JPATH_ADMINISTRATOR.DS."tables");
model是数据模型,有了它,用户不必了解数据存储的细节,只告诉model你要怎么操作数据,例如你要得到一个users列表或者删除一个user.告诉他,她会完成你想要的操作。一般要得到某个组件的数据,你先要找到它的JModel继承类,直接与它交互。
Controller与Model有直接关系,所以JController中得到一个JModel有捷径。
$model = $this->getModel("Active" ,"UsersModel");
在model中,可能需要使用其他组件的model,例如content与category,model内部得到其他model的方法
JModel::addincludePath(JPATH_ADMINISTRATOR.DS.'components'.DS.'com_content'.DS.'models');
$model=JModel::getInstance('Articles' ,'ContentModel' ,array('ignore_request'=>true));
由于PHP很简单灵活,所以很多PHPer都不注重开发规范。这样长期下去的结果是项目质量的下降。例如在Joomla中想操作数据库,大多数人会直接写SQL读取写入。这在Joomla1.5中关系不是很大,但在2.5中就不行。Joomla2.5中关联表很多,比喻说ACL功能,UserGroup,都有大量的关联表,单纯的写入一个表。系统可能识别不了。在MVC的体系中,Model是专门写数据库打交道的部分,所有的SQL都应该写在Model,要使用数据时,就调用Model的方法。
调用model的例子:
$model=JModle::getInstance('Article' ,'ContentModel' ,array('ignore_request'=>true));
$model->setState('filter.state' ,1);
$model->setState('list.ordering','publish_up');
$items=$model->getItems();
如果ignore_request就不会调用populateState,即不会从前端提供得到state。
State
跟model进行交互,最标准的方法是使用state.他是一种内置的数据结构。
$model=$this->getModel('Active' ,'UserModel');
$model->setState("limit",5);
$model->getItems();
拥有管理功能的控制器
JControllerForm主要用于编辑页面
JControllerAdmin主要用于管理列表页面
JModelAdmin是JModelForm的派生类,对于实现一个完善的管理功能,可以只使用JModelAdmin.如果使用JModelForm至少需要重新save getItem LoadFormDate getForm这些函数。
- save:数据存储时的操作
- getItem用户提取item数据用于form
- getForm得到表单对象,一般做法是返回loadForm结构,loadForm会读取生产jfrom数据,即form目录下的xml文件
- loadFormDate用于生产JForm的默认值,用于Edit Form的数据
使用JModelAdmin只需要重写getItems,loadFormDate于getForm.
注意:form必须要带token<?php echo JHtml::_('form.token')?> 主要是防止CSRF攻击。
另外,介绍几个Joomla新增的派生类
JModelList
在大多数CMS中,分页和排序已经是标配了。开发人员不必浪费时间在分页与排序上面,JModelList都已经实现这两项功能。
- getItems:得到列表数据,一般Model都用它来得到列表
- getListQuery:抽象方法,这是JModelList独有的方法,供getItems查询数据,order的查询语句必须卸载此方法内,limit于pager就不用写。
- populateState:在getState时被调用,用于处理前端提交数据,实现用户交互。JModelList已经对它扩展了排序排序和分页,如果需要更多的交互,可以重载它。
如果在使用Model前没有调用getState,将无法接受用户提交的state.
JModelForm
优化model的form能力
- laodForm:加载form.(这里的form是Joomla2.5de jform,一种用XML定义的form的技术,所以这个xml文件必须先建好)
- getForm:抽象方法。得到一个form实例,通常是通过调用loadForm来获得form实例,再对他进行加工。
- loadFormData:抽象方法。给Edit Form提供数据,可以直接使用getItem的数据。
JModelAdmin
功能很丰富的用户管理数据的model,继承自JModelForm。
本文摘抄自网络,原文地址:http://www.cnblogs.com/catcat811/archive/2012/07/22/2590738.html