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