在本节中,我们将介绍MVC中的M,也就是模型层。让我们的组件完全按照MVC的模式来运行。

其实不用MVC,组件也可以正常运行,使用MVC只是让我们的程序结构更加清新,增加程序的可读性和可修改性,MVC并不改变程序的逻辑。这点需要记住。

在前面已经介绍了MVC中M (model)是管理数据的。一般情况是在M中完成对数据库的操作的,比喻说数据的提取 或者运算 保存等。

因为是在Joomla的MVC框架下工作的,所以我们在使用Model的时候也需要遵循一定的规范。

model类的名称需要按照这个格式来写:组件的名称+ Model +实体的名称(GuestbookModelGuestbook)

model类的实现文件为:组件根目录下的models文件夹下,文件的名称为实体的名称 com_guestbook/models/guestbook.php

所有的model类必须派生自虚基类JModel.

依据上面所说,我们在组件根目录下建立文件夹models 。在models下新建文件guestbook.php。

guestbook.php中的文件如下:

 
  defined('_JEXEC') or die ('Restricted Access');

//导入JModel类的实现文件
jimport('joomla.application.component.model');

class GuestbookModelGuestbook extends JModel
{
	/**
	 * 储存留言数据到数据表中
	 *
	 * @access  publice
	 * @return boolean  True onsuccess
	 */
	 function store()
	 {
	    //得到tabel对象
		$table = & $this->getTable();
		//获得POST的数据
		$postdata = JRequest::get('POST');
		
		//由于我们在视图中的对变量的命名和数据库字段的名称不一致,所以我们需要做一些转换
		//也就是说,如果变量名称相同,那么我们将会少很多代码
		$data['message_id'] = 0;
		$data['message_subject'] = $postdata['subject'];
		$data['message_content'] = $postdata['content'];
		$data['message_author'] = $postdata['author'];
		$data['message_author_email'] = $postdata['email'];
		
		//添加一些默认的数据字段
		date_default_timezone_set("Asia/Shanghai");
		$time = date("Y-m-d H:m:s");
		$publish = 1;
		$user_id = -1;

		$data['message_time'] 		= $time;
		$data['message_publish'] 	= $publish;
		$data['message_user_id']	= $user_id;
		
		//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;
		}
		
		return true;
	 }
}

这个类主要做的事情就是保存数据到数据库中,然后返回保存的状态,代码和前一节中提到的差不多。有三点需要说明一下:

1,$table = $this->getTable();

getTable() 方法是JModel类的一个方法,他接受三个参数 $name 表的名称,默认为空,可选的。$prefix 可选 ,默认为‘Table’。$options  数组类型,可选。当我们按照正确的命名方法来书写组件,不需要传递任何参数,Joomla系统会自动找到对应的表。查看getTable的源码可以发现:

 
public function getTable($name='', $prefix='Table', $options = array())
{
        if (empty($name)) {
                $name = $this->getName();
        }
 
        if ($table = &$this->_createTable($name, $prefix, $options))  {
                return $table;
        }
 
        JError::raiseError(0, 'Table ' . $name . ' not supported. File not found.');
 
        return null;
}

它实际上是使用模型类的名称作为第一个参数,用Table作为第二参数,也就是默认情况下他会找到TableGuestbook这个类。而这正是我们所需要的类。

2,$postdata = JRequest::get('POST');

从表单中获取数据,使用JRequest类非常容易,上面代码的意思是说,将获取POST下方法提交的所有变量以关系数组的形式返回。

3,$table->store()

在上一节中没有介绍。store()方法将对象中的数据存储到数据库中。如果主键的id为0,它将创建一个新的记录(INSERT).否则就更新现有的记录(UPDATE).


完成了模型类了,现在修改控制器文件。修改postmesage()方法:

 
 function postmessage()
	{
		
		$model = $this->getModel('guestbook');
		
		if($model->store())
		{
			$msg = JText::_("恭喜,留言成功提交");	
		}
		else
		{
			$msg= JText::_( "留言提交失败!");
		}
		
		$link = 'index.php?option=com_guestbook';
		//重定向
		$this->setRedirect($link,$msg);
	}

先看一下执行结果的截图:

留言成功提交。并且还显示了一个提示信息。感觉比以前好多了。而且控制器文件显得简洁了许多。

上 面的代码逻辑很简单,获取模型。然后调用模型类提供的save方法。就完成了。$this->getModel()方法接受3个参数,和 getTable类似,参数都是可选的。JText::_()方法是Joomla实现多语言的一种机制,参数为一个字符串,在显示这个字符串之前 joomla会先检查是否存在对应的翻译,如果存在就输出翻译后的字符串,否则就输出本身。$this->setRedirect();重定向。接 受两个参数,一个是重定向的URL,一个是显示的消息。

到此,本节结束。在下一节中,我们将写一个查看所有留言的页面,敬请期待!

评论 (0)

  • 最新在前
  • 最佳在前