在上一节中,我们成功的建立了几个工具栏,在这一节中我们将写代码,让这些工具按钮真正的起作用。
在动手之前想一下点击发布按钮的逻辑。
选中你要发布的是哪一条或哪几条记录,点击发布按钮,将请求提交到处理文件。处理的文件通过获取传送过来的选中的记录的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)