在本节中,我们将介绍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)