在上一节中,我们成功的建立了几个工具栏,在这一节中我们将写代码,让这些工具按钮真正的起作用。
在动手之前想一下点击发布按钮的逻辑。
选中你要发布的是哪一条或哪几条记录,点击发布按钮,将请求提交到处理文件。处理的文件通过获取传送过来的选中的记录的id,来确定将数据库中的哪一条记录的发布状态设置为发布。处理完成之后返回。
有了一个大体的方向,那么来看一下joomla是怎样处理的。
在joomla中要让系统执行任务,有两种方式,一种是点击按钮,一种是点击链接。点击按钮就像我们现在要处理的工具栏。他的实现主要是依靠隐藏字段来做的。比喻在上一节中写到的表单。其中就有四个隐藏的字段。
<input type="hidden" name="option" value="com_guestbook"/>
<input type="hidden" name="task" value=""/>
<input type="hidden" name="boxchecked" value="0" />
<input type="hidden" name="controller" value="guestbook"/>
这几个字段的名称都是确定的。option,代表着组件。task,代表着需要组件执行的任务。boxchecked代表选中记录的数量.controller代表着需要使用的控制器。这些变量都是系统自维护的。什么叫自维护?稍后看代码之后你就清楚。
为了让问题比较清新,我先给一个写一段没有实际效果的代码:
修改控制器文件controller.php,增加下面的代码:
function publish() { $model = $this->getModel("MessageCtr"); $model->publishMessage(); }
为了方便管理,我们再新建一个模型文件,叫做messagectr.php文件(理论上,我们可以在一个messagelist模型文件中处理的)
defined('_JEXEC') or die('Restricted Access'); jimport('joomla.application.component.model'); // GuestBOOk 组件的 消息控制模型 message controller class GuestbookModelMessageCtr extends JModel { //发布message function publishMessage() { $data = JRequest::get('post'); print_r($data); return true; } }
上面的逻辑就是当用户点击发布按钮的时候,控制器执行publish函数,这个函数得到messagectr模型类,调用这个类的publishMessage方法来做到。我们在publishMessage函数中获得表单post的数据,然后打印出来,仅此而已。
点击publish按钮的执行结果:
现在结果一目了然了,我们需要的东西都在这个数组中。option现在被赋值为com_guestbook task=publish boxcheced = 4 controller=guestbook.上面所说的自维护的意思就是系统会帮我们设定相应的值。我们在表单中并没有设定具体的值,但现在却有了,这就是自维护了。boxcheck元素代表有多少行被选中。cid数组就代表了选中行的id.
2013-11-02日更正:option变量不是自维护的。需要我们自己指定。如果在表单中不进行指定,那么表单不能够正确提交。已经证实,task 变量和boxchecked变量是自维护的。
下面的工作就简单了,需要什么信息直接从那拿就行了。
//后台的messagectr的模型类 defined('_JEXEC') or die('Restricted Access'); jimport('joomla.application.component.model'); // GuestBOOk 组件的 消息控制模型 message controller class GuestbookModelMessageCtr extends JModel { //发布message function publishMessage() { $cids = JRequest::getVar('cid',array(0),'post','array'); //将数组变为字符串的形式,以","分割 $idstr = implode(",",$cids); $db = &JFactory::getDBO(); $query = $db->getQuery(true); $query->update($db->nameQuote('#__guestbook'))->set($db->nameQuote('message_publish')." = 1 ")->where($db->nameQuote('message_id')."in (".$idstr.")"); $db->setQuery((string)$query); //$db->query()方法成功返回 查询的结果 失败返回false if(!$db->query()) { return false; } return true; } //取消发布留言 function unPublishMessage() { $cids = JRequest::getVar('cid',array(0),'post','array'); $idstr = implode(",",$cids); $db = & JFactory::getDBO(); $query = $db->getQuery(true); $query->update($db->nameQuote('#__guestbook'))->set($db->nameQuote('message_publish')." = 0")->where($db->nameQuote('message_id')." in (".$idstr.")"); $db->setQuery((string)$query); if(!$db->query()) { return false; } return true; } //删除留言 function deleteMessage() { $cids = JRequest::getVar('cid',array(0),'post','array'); $idstr = implode(",",$cids); $db = & JFactory::getDBO(); $query = $db->getQuery(true); $query->delete($db->nameQuote('#__guestbook'))->where($db->nameQuote('message_id')." in (".$idstr.")"); $db->setQuery((string)$query); if(!$db->query()) { return false; } return true; } }
controller.php文件的代码:
defined('_JEXEC') or die('Restricted access'); jimport('joomla.application.component.controller'); class GuestBookController extends JController { function display($cachable = false,$urlparams = false) { // set default view if not set $input = JFactory::getApplication()->input; $input ->set('view',$input->getCmd('view','messagelist')); //call parent behavior parent::display($cachable); } function publish() { $model = $this->getModel("MessageCtr"); if($model->publishMessage()) { $text="留言成功发布!"; } else { $text="留言发布失败!"; } $link = 'index.php?option=com_guestbook'; $this->setRedirect($link,$text); } function unpublish() { $model = $this->getModel("MessageCtr"); if($model->unPublishMessage()) { $text="留言成功停止发布!"; } else { $text="留言停止发布失败!"; } $link = 'index.php?option=com_guestbook'; $this->setRedirect($link,$text); } function remove() { $model = $this->getModel("MessageCtr"); if($model->deleteMessage()) { $text="留言成功删除!"; } else { $text="留言删除失败!"; } $link = 'index.php?option=com_guestbook'; $this->setRedirect($link,$text); } }
上面的的代码都是由控制器确定执行的任务,然后实例化相应的模型类,调用模型类的方法来解决问题。最后调用setRedirect进行重定向。
现在可以通过后台来控制留言的发布于删除了。下一张中,将完成编辑和新建留言页面。
评论 (0)