在本节中我们将解决一个很重要的问题,那就是如何同数据库进行交互。

在Joomla中提到数据库,就不得不说JTable类。Joomla为了方便开发者使用数据库,提供了一个非常强大的虚基类JTable.在这个类中实现了很多操作数据表记录的方法。我们只需要让自己的类继承JTable,就可以轻松实现很多数据库的操作。

当然,为了让我们的类正常工作,需要遵守一定的命名规范:

  1. JTable的子类必须位于组件后台更目录的tables文件夹中。现在我们的组件为guestbook.所以为了使用JTable,我们需要在administrator/components/com_guestbook/ 下新建一个文件夹tables文件夹。
  2. 派生类的类名为Table+数据表的名称.文件的名称为数据表的名称。所以我们需要在tabls文件夹下新建一个叫做guestbook.php的文件。并且在这个文件中实现一个类。这个类派生自JTable类名为TableGuestBook。
  3. 在 派生类中,我们需要定义一些公共的属性。这些属性是直接和数据表的字段相关的,所以他们的名称必须和数据表字段的名称精确匹配。因此,在 TableGuestBook类中,我们需要定义  message_id ,message_subject ,message_content,message_author,message_author_email,message_time,message_publish,message_user_id 这些公众属性。
  4. 在派生类中实现构造函数。构造函数的形式是固定的 接受一个数据库对象的引用参数,直接调用父类的构造函数,传递需要操作的数据表的名称 和数据表的主键。对于我们的guestbook。就需要写下面的构造函数:

function __construct(&$db)

{

     parent::_construct('#__guestbook','message_id',$db);

}

  1. 重载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; }


再次在前台输入留言,截图如下:

 

提交后执行结果:

查看数据库结果:

 

 以上结果说明,我们正确的将留言存储到数据库中去了。

关于代码的解释,上面的注释已经写得很清楚了,没必要在啰嗦了。在下一节中我们将对上面代码进行精简。并且引人模型层的概念。敬请期待!

 

 

作者: clx

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

作者网站:

评论 (0)

  • 最新在前
  • 最佳在前