进入专题模式查看 >>

在上一节,我们已经使用了JModelForm实现了通过XML文件来定义表单元素。在这一节中将使用JModelAdmin类来实现数据的自动管理。自动实现保存,删除,更新等等操作。

1,本节目标


了解如何使用JModelAdmin类来实现数据的自动管理

2,上一版的问题


虽然上一版我们使用了XML文件输出了编辑页面,但如果你点击工具栏上的保存按钮,你会发现虽然提示保存成功,但数据库中插入的记录却是空的。如图:

Joomla插入空的记录.png

导致这个原因很简单,因为我们使用了JModelForm来输出表单元素,在输出的时候表单元素的名称已经有所改变。而我们模型的保存方法并没有改变,所以导致获取不到数据。通过审查元素可以看到新的表单元素的名称如图:

JoomlaJForm表单元素的名称.png

可以看见现在的表单元素的名称变成了jform[title],jform[author],jform[id],jform[price].找到了原因,修改save方法对应的地方就可以成功的保存了。在这里我不再演示。

由于保存,编辑,新建这些操作都非常的通用,当我们使用XML来构建表单元素后,joomla是可以帮助我们自动的实现保存,编辑,删除这些通用方法的,我们需要做的就是继承JModelAdmin类,不需要写任何的额外代码。

3,使用JModelAdmin类


JModelAdmin类继承自JModelForm,且在此基础上提供了对数据的基本管理功能。为了让我们的代码使用这些功能,只需要将基础类继承JModelAdmin即可。 

修改models/item.php文件,将zmaxbookModelItem的基类修改为JModelAdmin.代码如下:

//class zmaxbookModelItem extends JModelForm
class zmaxbookModelItem extends JModelAdmin  //修改基类,继承自JModelAdmin

在JModelAdmin这个类中,实现了save,delete,publish,getItem等等常用的方法(更多细节,可以自行查看源码)。因此,现在我们的模型实现文件将变得非常的简洁。

/**
 * 图书的管理模型类.
 *
 * @since  2.0
 */
class zmaxbookModelItem extends JModelAdmin
{
	public function getForm( $data = array() , $loadData = true)
	{
		$form = $this->loadForm('com_zmaxbook.item' ,'item' ,array('control' =>'jform' ,'load_data' => $loadData ));
		if(!$form)
		{
			return false;
		}
		return $form;
	}
	
	public function loadFormData()
	{
		return $this->getItem();
	}
} 

整个的模型中只实现了getForm 和 getFormData两个方法,先前实现的的delete,save,getItem方法都删除了,直接使用JModelAdmin提供的方法。再次说明一下,JModelAdmin类继承了JModelForm类,因此,所有JModelForm需要的方法我们也都需要一一实现,比如getForm方法,这些是不能删除的,否则会报错。

4,实现TableItem类


如果此时我们再次打开编辑,会提示错误,数据表 item 不支持. 找不到文件。如图:

Joomla数据表不支持.png

出现这个问题,是因为我们没有实现table文件。在JoomlaMVC中,虽然M控制模型,负责和数据库的交互,但在实际的实现中,真正负责处理数据库相关的接口是由JTable类来实现的。在JModelLegacy这个类中默认提供了getTable方法,用来指示如何让数据库表和模型进行关联

如何来实现对item数据表的支持呢?操作非常的简单。

 4.1  在tables目录下创建item.php文件。

  • 按照约定优于设计原则,joomla系统约定所有的table实现文件放在组件的后台安装目录下的tables文件夹下面。
  • 按照约定优于设计原则,joomla系统约定模型关联的table类的名称和模型的名称相同。(在本例中模型的名称为item)

因此,我们需要在\administrator\components\com_zmaxbook\tables下新建了一个item.php文件

 4.2  定义table类的实现

按照约定优于设计原则,joomla系统约定table类的名称格式为 table的名称Table 且继承自JTable。所以item.php的最终代码如下:

/**
 *	description:ZMAX图书管理系统  图书表
 *  author:min.zhang
 *	Url:http://www.zmax99.com
 *  copyright:南宁市程序人软件科技有限责任公司保留所有权利
 *  date:2021-06-07
 * @license GNU General Public License version 3, or later
 */
defined('_JEXEC') or die; 
class TableItem extends JTable
{
	public function __construct(&$db)
	{
		parent::__construct('#__zmaxbook_item' ,'id' ,$db);
	}
}

TableItem的实现非常的简单。一般情况下,我们只需要实现构造函数,构造函数需要提供两个参数,一个是本模型需要操作的数据库表的名称(#__zmaxbook_item),另外一个是这个表的主键(id).当JTable类知道了这个两个信息后,它就可以自动计算出这个数据表的所有字段,且依据主键来更新或者删除记录。

至此,我们就实现了itemtable的支持,再次刷新,页面能够正常的打开。

评论 (0)

  • 最新在前
  • 最佳在前