教程栏目

joomla中文网出品的官方教程

上一节完成了编辑页面,但这个编辑页面的实现存在很多问题。最主要的一个问题就是我们直接在视图中进行了数据库的相关操作。在本节中,将引入模型文件,来解决数据层和视图层的完全分离。

1,本节目标


了解模型,并且知道视图和模型之间的调用方法

2,模型的作用


joomla的MVC框架的设计目标就是完成视图,模型和控制器的分离。控制器负责页面的流转调度,视图负责页面的布局输出,模型负责数据库的相关操作。

模型的类命名规则如下:

组件的名称(zmaxbook)  + Model  + 视图的名称(Items)

在视图中,系统默认会与之关联一个同名的模型文件。如:视图为item,那模型的文件名称也为item.且模型文件的存储位置在组件根目录的models文件夹下面。更多关于MVC架构的讨论,可以参考:组件的MVC执行流程  将数据层从视图中抽出来有助于我们更好的进行代码管理和复用。

3,添加item模型


添加新的模型的方法步骤如下:

STEP 1 :在models文件夹下新建一个文件,这个文件的名称为你的模型名称

因为我们的视图是item视图,视图会自动关联一个与之同名的模型,也就是item模型。因此需要新建的模型就是item控制器,新建的文件为item.php

STEP 2:编辑item.php这个文件,定义我们的模型器类。

按照约定,模型的类格式应该如下:

class zmaxbookModelItem extends JModelLegacy

整个模型文件的代码如下:

<?php
/**
 *	description:ZMAXBOOK组件 图书模型
 *  author:min.zhang
 *	Url:http://www.zmax99.com
 *  copyright:南宁市程序人软件科技有限责任公司保留所有权利
 *  date:2021-05-25
 *  version:v2.0.0
 *  @license GNU General Public License version 3, or later
 */

defined('_JEXEC') or die;

/**
 * 图书的管理模型类.
 *
 * @since  2.0
 */
class zmaxbookModelItem extends JModelLegacy
{
	public function getItem()
	{
		//STEP 1:获得需要编辑记录的ID
		$app = JFactory::getApplication();
		$id = $app->input->get("id",'0','INT');

		//STEP 2:查询数据库,得到编辑记录的详情
		$db = JFactory::getDBO();
		$query = $db->getQuery(true);
		$query->select("*")->from("#__zmaxbook_item")->where("id=".$db->quote($id));
		$db->setQuery($query);
		$item = $db->loadObject();
		
		return $item;
		
	}
}

在上面就定义好了一个item模型,在这个模型中实现了一个getItem()方法。注意:这个方法的名称是任意的,只要以get开头即可。在这个getItem方法中,实际上就是将编辑页面中获得当前正在编辑的数据的方法移动到了这里。

4,在视图中调用模型的数据


joomlaMVC架构会自动为视图关联一个同名的模型,并且在视图中实现了一个get方法,这个方法支持一个参数。通过这个get方法,就可以调用模型的相关数据。

现在需要修改视图,增加对模型的调用。代码如下:

class zmaxbookViewItem extends JViewLegacy
{
	public function display($tpl = null)
	{
		$this->item = $this->get("Item"); //从模型获得数据
		JToolbarHelper::title('书本管理 - 编辑书本', 'edit');
		JToolBarHelper::save('item.save');//保存按钮
		parent::display($tpl);
	}
}

重点关注  

$this->item = $this->get("Item"); //从模型获得数据

这行代码的作用是从模型中拿到数据。 按照约定,Item视图默认会绑定一个Item模型(模型和视图的名称是一致的)。调用 $this->get('Item'); 实际上就是调用Item模型的getItem方法。通过这个方式,我们就成功的将模型的数据注入到视图中了。 

接下来,就是修改布局文件default.php的代码,让他直接使用视图中获得数据而不用写代码查询数据库,修改后的default.php代码如下:

<?php
/**
 *	description:ZMAXBOOK组件 Item视图 布局文件
 *  author:min.zhang
 *	Url:http://www.zmax99.com
 *  copyright:南宁市程序人软件科技有限责任公司保留所有权利
 *  date:2021-05-25
 *  version:v2.0.0
 *  @license GNU General Public License version 3, or later
 */

defined('_JEXEC') or die;
$item = $this->item; //使用视图中的数据,而不是通过查询数据库获得
?>
<form name="adminForm"  id="adminForm" class="form-horizontal" action="index.php" method="post" enctype="multipart/form-data">
	<!-- 编辑表单 -->
	<div class="control-group">
		<div class="control-label"><label >标题</label></div>
		<div class="controls"><input name="title" type="text" value="<?php echo $item->title;?>" /></div>
	</div>
	<div class="control-group">
		<div class="control-label"><label >作者</label></div>
		<div class="controls"><input name="author" type="text" value="<?php echo $item->author;?>"/></div>
	</div>
	<div class="control-group">
		<div class="control-label"><label >价格</label></div>
		<div class="controls"><input name="price" type="text"  value="<?php echo $item->price;?>"/></div>
	</div>
	<div class="control-group">
		<div class="control-label"><label >ID</label></div>
		<div class="controls"><input name="id" type="text" value="<?php echo $item->id;?>" /></div>
	</div>
	
	<input type="hidden" name="option" value="com_zmaxbook" />
	<input type="hidden" name="task" value="" />
</form>

 至此,就完成了整个视图代码的改进。现在,来看整个代码的结构就干净了很多。视图,模型,布局各司其职。

4,v2.0.4版本


 实现模型后的完整版本代码下载:[下载文件:]com_zmaxbookv2.0.4_2021-05-25_for_j3x.zip

作者: 樱木花道

Joomla程序员,从J1.5到J4.x始终都在做Joomla相关开发定制工作,有超过10年行业经验,国内Joomla扩展开发商ZMAX团队的核心成员

作者网站:ZMAX程序人

评论 (0)

  • 最新在前
  • 最佳在前

第1章 Joomla入门教程

第3章 C计划

第5章 E计划

第6章 H计划

第7章 G计划

第9章 运行环境

第11章 主从与集群

第12章 模块开发

第13章 插件开发

第14章 j2.x组件开发教程

第15章 页面定制教程

第16章 页面构造器

第17章 joomla升级

第18章 其他系统迁移

第19章 流量翻倍计划