在这一节我们将改进控制器,使用JControllerForm类来完成保存,编辑,新建等常用功能。
了解JControllerForm类的使用
上一节已经初步的介绍了Joomla能够提供的控制器基类有3个。其中JControllerLegacy是另外两个的基类。因此,实际上我们就是在决定如何从JControllerForm 和 JControllerAdmin中做选择。
一般情况下,当在编辑页面,针对一个表单的时候。此时应该使用的控制器应该是JControllerForm。因为此时它已经帮我们自动的实现了保存,编辑,新建等通用功能。
当在对数据列表进行操作,需要对一些系列的数据进行管理的时候,此时应该使用JControlerAdmin控制器,因为它实现了删除,发布,排序,签入等通用功能。
请注意,JContollerAdmin控制器并没有继承自JControllerForm类,因此,JControllerAdmin类并没有实现针对单个记录的自动数据管理操作。
在item控制器中,我们之前已经实现了添加,保存,删除等方法。现在我们将控制器继承JControllerForm类,因为JControllerForm类已经实现了这些通用的功能,因此,此时item.php就变得非常的简洁。具体的代码如下:
<?php /** * description:ZMAXBOOK组件 Item控制器文件 * author:min.zhang * Url:http://www.zmax99.com * copyright:南宁市程序人软件科技有限责任公司保留所有权利 * date:2021-06-08 * version:v2.0.3 * @license GNU General Public License version 3, or later */ defined('_JEXEC') or die; class zmaxbookControllerItem extends JControllerForm { }
改进后的item控制器非常的简单,只需要继承JControllerForm类,其他的代码一行也不用写。这样我们就完成了对item控制器的改进
使用改进后的控制器,打开一条记录,点击保存按钮。此时系统会提示保存失败 “安全令牌不匹配。基于安全原因,已中止请求。请重试...”。截图如下:
出现这个警告是因为Joomla的控制器在处理每一个表单之前都会进行安全令牌的校验,这是一种安全机制。解决的方法就是在编辑的表单下面增加如下的代码:
<?php echo JHtml::_('form.token'); //表单的安全令牌 ?>
这行代码的作用就是在表单中生成一个隐藏的安全令牌字符串。其实质是输出一串随机的字符串
整个的default.php代码如下:
<form name="adminForm" id="adminForm" class="form-horizontal" action="index.php" method="post" enctype="multipart/form-data"> <!-- 编辑表单 --> <div class="form-horizontal"> <?php foreach ($this->form->getFieldsets() as $fieldset) : ?> <div class="row-fluid"> <?php echo $this->form->renderFieldset($fieldset->name);?> </div> <?php endforeach; ?> </div> <?php echo JHtml::_('form.token'); //表单的安全令牌 ?> <input type="hidden" name="option" value="com_zmaxbook" /> <input type="hidden" name="task" value="" /> </form>
页面输出的HTML代码如图:
再次点击保存,发现系统确实保存成功了,但系统执行的不是更新,而是插入。保存后的截图如下:
出现上面的问题是由于JControllerForm的save方法判断应该插入还是更新是通过主键(id)是否存在而决定的。当id=0或者不存在的时候执行插入,否则执行更新。知道了这个,解决就比较简单的。
修改default.php,在表单中传递id参数。代码如下:
<?php echo JHtml::_('form.token'); //表单的安全令牌 ?> <input type="hidden" name="option" value="com_zmaxbook" /> <input type="hidden" name="task" value="" /> <input type="hidden" name="id" value="<?php echo $this->item->id;?>" /> </form>
这样问题就完美的解决了。
评论 (0)