进入专题模式查看 >>

在这一节我们将改进控制器,使用JControllerForm类来完成保存,编辑,新建等常用功能。

1,本节目标


了解JControllerForm类的使用

2,如何选择合适的控制器基类


上一节已经初步的介绍了Joomla能够提供的控制器基类有3个。其中JControllerLegacy是另外两个的基类。因此,实际上我们就是在决定如何从JControllerForm 和 JControllerAdmin中做选择。

一般情况下,当在编辑页面,针对一个表单的时候。此时应该使用的控制器应该是JControllerForm。因为此时它已经帮我们自动的实现了保存,编辑,新建等通用功能。

当在对数据列表进行操作,需要对一些系列的数据进行管理的时候,此时应该使用JControlerAdmin控制器,因为它实现了删除,发布,排序,签入等通用功能。

请注意,JContollerAdmin控制器并没有继承自JControllerForm类,因此,JControllerAdmin类并没有实现针对单个记录的自动数据管理操作。

3,改进item控制器


 在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控制器的改进

4,表单的安全令牌


使用改进后的控制器,打开一条记录,点击保存按钮。此时系统会提示保存失败 “安全令牌不匹配。基于安全原因,已中止请求。请重试...”。截图如下:

joomla安全令牌.png

出现这个警告是因为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代码如图:

安全令牌的输出.png

再次点击保存,发现系统确实保存成功了,但系统执行的不是更新,而是插入。保存后的截图如下:

joomla每点击一次保存都多出一条新的记录.png

5,编辑页面需要传递id


出现上面的问题是由于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>

这样问题就完美的解决了。 

6,v2.0.7版本


com_zmaxbookv2.0.7_2021-06-08_for_j3x.zip

评论 (0)

  • 最新在前
  • 最佳在前