上一节完成了编辑页面,但这个编辑页面的实现存在很多问题。最主要的一个问题就是我们直接在视图中进行了数据库的相关操作。在本节中,将引入模型文件,来解决数据层和视图层的完全分离。
了解模型,并且知道视图和模型之间的调用方法
joomla的MVC框架的设计目标就是完成视图,模型和控制器的分离。控制器负责页面的流转调度,视图负责页面的布局输出,模型负责数据库的相关操作。
模型的类命名规则如下:
组件的名称(zmaxbook) + Model + 视图的名称(Items)
在视图中,系统默认会与之关联一个同名的模型文件。如:视图为item,那模型的文件名称也为item.且模型文件的存储位置在组件根目录的models文件夹下面。更多关于MVC架构的讨论,可以参考:组件的MVC执行流程 将数据层从视图中抽出来有助于我们更好的进行代码管理和复用。
添加新的模型的方法步骤如下:
STEP 1 :在models文件夹下新建一个文件,这个文件的名称为你的模型名称。
因为我们的视图是item视图,视图会自动关联一个与之同名的模型,也就是item模型。因此需要新建的模型就是item控制器,新建的文件为item.php
STEP 2:编辑item.php这个文件,定义我们的模型器类。
按照约定,模型的类格式应该如下:
class zmaxbookModelItem extends JModelLegacy
整个模型文件的代码如下:
<?php /** * description:ZMAXBOOK组件 图书模型 * author:min.zhang * Url:http://www.zmax99.com * copyright:南宁市程序人软件科技有限责任公司保留所有权利 * date:2021-05-25 * version:v2.0.0 * @license GNU General Public License version 3, or later */ defined('_JEXEC') or die; /** * 图书的管理模型类. * * @since 2.0 */ class zmaxbookModelItem extends JModelLegacy { public function getItem() { //STEP 1:获得需要编辑记录的ID $app = JFactory::getApplication(); $id = $app->input->get("id",'0','INT'); //STEP 2:查询数据库,得到编辑记录的详情 $db = JFactory::getDBO(); $query = $db->getQuery(true); $query->select("*")->from("#__zmaxbook_item")->where("id=".$db->quote($id)); $db->setQuery($query); $item = $db->loadObject(); return $item; } }
在上面就定义好了一个item模型,在这个模型中实现了一个getItem()方法。注意:这个方法的名称是任意的,只要以get开头即可。在这个getItem方法中,实际上就是将编辑页面中获得当前正在编辑的数据的方法移动到了这里。
joomlaMVC架构会自动为视图关联一个同名的模型,并且在视图中实现了一个get方法,这个方法支持一个参数。通过这个get方法,就可以调用模型的相关数据。
现在需要修改视图,增加对模型的调用。代码如下:
class zmaxbookViewItem extends JViewLegacy { public function display($tpl = null) { $this->item = $this->get("Item"); //从模型获得数据 JToolbarHelper::title('书本管理 - 编辑书本', 'edit'); JToolBarHelper::save('item.save');//保存按钮 parent::display($tpl); } }
重点关注
$this->item = $this->get("Item"); //从模型获得数据
这行代码的作用是从模型中拿到数据。 按照约定,Item视图默认会绑定一个Item模型(模型和视图的名称是一致的)。调用 $this->get('Item'); 实际上就是调用Item模型的getItem方法。通过这个方式,我们就成功的将模型的数据注入到视图中了。
接下来,就是修改布局文件default.php的代码,让他直接使用视图中获得数据而不用写代码查询数据库,修改后的default.php代码如下:
<?php /** * description:ZMAXBOOK组件 Item视图 布局文件 * author:min.zhang * Url:http://www.zmax99.com * copyright:南宁市程序人软件科技有限责任公司保留所有权利 * date:2021-05-25 * version:v2.0.0 * @license GNU General Public License version 3, or later */ defined('_JEXEC') or die; $item = $this->item; //使用视图中的数据,而不是通过查询数据库获得 ?> <form name="adminForm" id="adminForm" class="form-horizontal" action="index.php" method="post" enctype="multipart/form-data"> <!-- 编辑表单 --> <div class="control-group"> <div class="control-label"><label >标题</label></div> <div class="controls"><input name="title" type="text" value="<?php echo $item->title;?>" /></div> </div> <div class="control-group"> <div class="control-label"><label >作者</label></div> <div class="controls"><input name="author" type="text" value="<?php echo $item->author;?>"/></div> </div> <div class="control-group"> <div class="control-label"><label >价格</label></div> <div class="controls"><input name="price" type="text" value="<?php echo $item->price;?>"/></div> </div> <div class="control-group"> <div class="control-label"><label >ID</label></div> <div class="controls"><input name="id" type="text" value="<?php echo $item->id;?>" /></div> </div> <input type="hidden" name="option" value="com_zmaxbook" /> <input type="hidden" name="task" value="" /> </form>
至此,就完成了整个视图代码的改进。现在,来看整个代码的结构就干净了很多。视图,模型,布局各司其职。
实现模型后的完整版本代码下载:[下载文件:]com_zmaxbookv2.0.4_2021-05-25_for_j3x.zip
评论 (0)