打印本页
%07 %327 %2014 %14:%十一 %PM

Joomla2.5MVC剖析

作者
给本项目评分
(3 得票数)

Joomla整个系统,有core,component,module,plugin组成,而component是唯一拥有数据结构特征的部分,所以Joomla把它设计为MVC结构,让数据结构表现更加清晰。并且component是Joomla扩展开发中最发展的部分。

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这些函数。

  1. save:数据存储时的操作
  2. getItem用户提取item数据用于form
  3. getForm得到表单对象,一般做法是返回loadForm结构,loadForm会读取生产jfrom数据,即form目录下的xml文件
  4. loadFormDate用于生产JForm的默认值,用于Edit Form的数据

使用JModelAdmin只需要重写getItems,loadFormDate于getForm.

注意:form必须要带token<?php echo JHtml::_('form.token')?> 主要是防止CSRF攻击。

另外,介绍几个Joomla新增的派生类

JModelList

在大多数CMS中,分页和排序已经是标配了。开发人员不必浪费时间在分页与排序上面,JModelList都已经实现这两项功能。

  1. getItems:得到列表数据,一般Model都用它来得到列表
  2. getListQuery:抽象方法,这是JModelList独有的方法,供getItems查询数据,order的查询语句必须卸载此方法内,limit于pager就不用写。
  3. populateState:在getState时被调用,用于处理前端提交数据,实现用户交互。JModelList已经对它扩展了排序排序和分页,如果需要更多的交互,可以重载它。

如果在使用Model前没有调用getState,将无法接受用户提交的state.

JModelForm

优化model的form能力

  1. laodForm:加载form.(这里的form是Joomla2.5de jform,一种用XML定义的form的技术,所以这个xml文件必须先建好)
  2. getForm:抽象方法。得到一个form实例,通常是通过调用loadForm来获得form实例,再对他进行加工。
  3. loadFormData:抽象方法。给Edit Form提供数据,可以直接使用getItem的数据。

JModelAdmin

功能很丰富的用户管理数据的model,继承自JModelForm。

 

本文摘抄自网络,原文地址:http://www.cnblogs.com/catcat811/archive/2012/07/22/2590738.html

阅读 8096 次数 最后修改于 %07 %371 %2014 %15:%十一 %PM