在本节中我们将解决一个很重要的问题,那就是如何同数据库进行交互。
在Joomla中提到数据库,就不得不说JTable类。Joomla为了方便开发者使用数据库,提供了一个非常强大的虚基类JTable.在这个类中实现了很多操作数据表记录的方法。我们只需要让自己的类继承JTable,就可以轻松实现很多数据库的操作。
当然,为了让我们的类正常工作,需要遵守一定的命名规范:
- JTable的子类必须位于组件后台更目录的tables文件夹中。现在我们的组件为guestbook.所以为了使用JTable,我们需要在administrator/components/com_guestbook/ 下新建一个文件夹tables文件夹。
- 派生类的类名为Table+数据表的名称.文件的名称为数据表的名称。所以我们需要在tabls文件夹下新建一个叫做guestbook.php的文件。并且在这个文件中实现一个类。这个类派生自JTable类名为TableGuestBook。
- 在 派生类中,我们需要定义一些公共的属性。这些属性是直接和数据表的字段相关的,所以他们的名称必须和数据表字段的名称精确匹配。因此,在 TableGuestBook类中,我们需要定义 message_id ,message_subject ,message_content,message_author,message_author_email,message_time,message_publish,message_user_id 这些公众属性。
- 在派生类中实现构造函数。构造函数的形式是固定的 接受一个数据库对象的引用参数,直接调用父类的构造函数,传递需要操作的数据表的名称 和数据表的主键。对于我们的guestbook。就需要写下面的构造函数:
function __construct(&$db)
{
parent::_construct('#__guestbook','message_id',$db);
}
- 重载check()方法,这个方法是用来校验3中的属性值的有效性的,成功返回boolean TRUE.如果校验失败,我们可以在这个方法中调用setError()方法加入一个消息到系统的消息队列中,好告诉使用者为什么校验失败。
一个典型的check函数如下:
function check() { if(!$this->message_subject) { $this->setError(JText::_('主题不能不能为空!')); return false; } return true; }
做完了这些,我们基本上就可以使用派生的JTableGuestBook类了。基本的调用方法如下:
JTable::addIncludePath(JPATH_COMPONET_ADMINISTRATOR.DS.'tables');
$table = JTable::getInstance('guestbook','Table');
理论知识先讲到这为止。开始写代码了。
按照上面的理论,我们需要在administrator/componets/com_guestbook文件夹下新建一个文件夹 tablse.并且新建一个文件guestbook.php。(如果你还不清楚为什么要这么做,那么请阅读再一次阅读上面的部分)
administrator/componets/com_guestbook/tables/guestbook.php代码如下:
class TableGuestBook extends JTable { //请注意变量名称一定要和数据库表的字段名称精确匹配 var $message_id = null; var $message_subject = null; var $message_content = null; var $message_author = null; var $message_author_email = null; var $message_time = null; var $message_publish = null; var $message_user_id = null; function __construct(& $db) { //参数为数据表的名称 和 表中的主键 parent::__construct('#__guestbook' ,'message_id' ,$db); } //此函数什么也没做 function check() { // $this--->setError(JText::_('Some Error Message')); return true; } }
实现了TableGuestBook这个数据表类,我们下面在控制器中使用这个类来储存数据。
修改components\com_guestbook\controller.php文件中的postmessage()如下:
function postmessage() { $subject = JRequest::getVar('subject'); $content = JRequest::getVar('content'); $author = JRequest::getVar('author'); $email = JRequest::getVar('email'); date_default_timezone_set("Asia/Shanghai"); $time = date("Y-m-d H:m:s"); $publish = 1; $user_id = -1; //准备好数据 $data = array(); $data['message_id'] = 0; $data['message_subject'] = $subject; $data['message_content'] = $content ; $data['message_author'] = $author ; $data['message_author_email']=$email; $data['message_time'] = $time; $data['message_publish'] = $publish; $data['message_user_id'] = $user_id; //加载TableGuestbook类的实现文件 JTable::addIncludePath( JPATH_COMPONENT_ADMINISTRATOR .DS .'tables'); //获得实例 $table = JTable::getInstance('guestbook' , 'Table'); //Bind 绑定数据 if(!$table->bind($data)) { $this->setError($this->_db->getErrorMsg()); return false; } // 检查数据的有效性 if(!$table->check()) { $this->setError($this->_db->getErrorMsg()); return false; } //储存数据 if(!$table->store()) { $this->setError($this->_db->getErrorMsg()); return false; } echo "恭喜,留言成功提交
"; return true; }
再次在前台输入留言,截图如下:
提交后执行结果:
查看数据库结果:
以上结果说明,我们正确的将留言存储到数据库中去了。
关于代码的解释,上面的注释已经写得很清楚了,没必要在啰嗦了。在下一节中我们将对上面代码进行精简。并且引人模型层的概念。敬请期待!
评论 (0)