在上一节,我们已经使用了JModelForm实现了通过XML文件来定义表单元素。在这一节中将使用JModelAdmin类来实现数据的自动管理。自动实现保存,删除,更新等等操作。
了解如何使用JModelAdmin类来实现数据的自动管理
虽然上一版我们使用了XML文件输出了编辑页面,但如果你点击工具栏上的保存按钮,你会发现虽然提示保存成功,但数据库中插入的记录却是空的。如图:
导致这个原因很简单,因为我们使用了JModelForm来输出表单元素,在输出的时候表单元素的名称已经有所改变。而我们模型的保存方法并没有改变,所以导致获取不到数据。通过审查元素可以看到新的表单元素的名称如图:
可以看见现在的表单元素的名称变成了jform[title],jform[author],jform[id],jform[price].找到了原因,修改save方法对应的地方就可以成功的保存了。在这里我不再演示。
由于保存,编辑,新建这些操作都非常的通用,当我们使用XML来构建表单元素后,joomla是可以帮助我们自动的实现保存,编辑,删除这些通用方法的,我们需要做的就是继承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方法,这些是不能删除的,否则会报错。
如果此时我们再次打开编辑,会提示错误,数据表 item 不支持. 找不到文件。如图:
出现这个问题,是因为我们没有实现table文件。在JoomlaMVC中,虽然M控制模型,负责和数据库的交互,但在实际的实现中,真正负责处理数据库相关的接口是由JTable类来实现的。在JModelLegacy这个类中默认提供了getTable方法,用来指示如何让数据库表和模型进行关联。
如何来实现对item数据表的支持呢?操作非常的简单。
4.1 在tables目录下创建item.php文件。
因此,我们需要在\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)