教程栏目

joomla中文网出品的官方教程

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

在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; }


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

 

提交后执行结果:

查看数据库结果:

 

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

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

 

 

评论 (0)

  • 最新在前
  • 最佳在前

第1章 Joomla入门教程

第3章 C计划

第5章 E计划

第6章 H计划

第7章 G计划

第9章 运行环境

第11章 主从与集群

第12章 模块开发

第13章 插件开发

第14章 j2.x组件开发教程

第15章 页面定制教程

第16章 页面构造器

第17章 joomla升级

第18章 其他系统迁移

第19章 流量翻倍计划