joomla源代码探析续(二十八) 如何扩展JTable类
JTable类是Active Record设计模式(web应用中应用最为广泛,最为简单的数据库相关的设计模式,笔者)的实现。JTable在joomla与数据库交互过程中广泛的使用。要使用JTable,首先要创建一个JTable的子类。下面是我们的一个例子:
<?php
defined('_JEXEC') or die();
class TableRecipes extends JTable
{
var $id = null;
var $ingredients = null;
var $instructions = null;
var $serves = null;
var $difficulty = null;
var $prep_time = null;
var $cook_time = null;
var $published = 0;
function __construct(&$db)
{
parent::__construct( '#__recipes', 'id', $db );
}
}
JTable的子类命名前缀是Table,然后就是首字母大写的表名,类中的成员变量对应着数据库中的字段名,默认值与表中的字段默认值应该相同。加入字段默认是NOT NULL,那就不能采用 'null'作为成员变量的默认值。
最后是类的构造器,构造器的参数是当前数据库的引用,子类的构造器调用JTable的构造器,父类的构造器有三个输入参数,第一个参数是表名,第二个是主键,第三个是当前数据库的链接。加入以上的类应用在Recipes组件上,那么代码应该放在/administrator/components/com_recipes/tables/recipes.php.文件中。
如何使用JTable扩展
为了使用JTable扩展,要首先在组件的代码中引入,下面一行是引入代码:
JTable::addIncludePath(JPATH_ADMINISTRATOR.DS.'components'.DS.'com_recipes'.DS.'tables');
用下面的代码,可以获得JTable 扩展类的对象。
$row =& JTable::getInstance('recipes', 'Table');
请注意全小写的类名作为第一个参数,而 'Table'作为第二个参数,getInstance函数返回JTable的引用。
在model类(组件的JModel扩展)中可以可以采用以下代码获得JTable扩展的实例。
$row =& $this->getTable('recipes');
添加和更新数据记录
通常情况下,用户在客户端通过html form提交数据,而JRequest可以协助获得这些数据,用JRequest::get('post')可以获得 HTTP POST 方式提交的数组,获得的数组可以传递给bind函数。bind函数将post中对应内容自动绑定到相应名称的成员变量,请看下面的例子:
if (!$row->bind( JRequest::get( 'post' ) )) {
return JError::raiseWarning( 500, $row->getError() );
}
注意上面代码中的JError::raiseWarning,JError::raiseWarning在bind方法出错的时候停止执行,getError()可以得到JTable对象bind出错的返回信息。如果绑定成功,接下来调用store()函数。
if (!$row->store()) {
JError::raiseError(500, $row->getError() );
}
如果JTable对象的任何成员变量为空,这些变量被默认忽略,这样可以更新指定字段,如果需要每个字段都有值,可以在store()函数中加上参数'true',bind函数不检查数据类型,如果你要保证数据完整性,请在保存数据前程序代码中检查一下。
JTable读取数据
如果要用JTable加载表中指定一行,传递主键给load成员函数。以下是代码:
$row->load( $id );
JTable删除数据
下面是代码是删除例子,删除指定的数据,要用delete函数。
$row->delete( $id );
如果要一次删除多行数据,你需要手动写query语句。