教程栏目

joomla中文网出品的官方教程

在上一节中,我们成功的建立了几个工具栏,在这一节中我们将写代码,让这些工具按钮真正的起作用。

 

在动手之前想一下点击发布按钮的逻辑。

选中你要发布的是哪一条或哪几条记录,点击发布按钮,将请求提交到处理文件。处理的文件通过获取传送过来的选中的记录的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)

  • 最新在前
  • 最佳在前

第1章 Joomla入门教程

第3章 C计划

第5章 E计划

第6章 H计划

第7章 G计划

第9章 运行环境

第11章 主从与集群

第12章 模块开发

第13章 插件开发

第14章 j2.x组件开发教程

第15章 页面定制教程

第16章 页面构造器

第17章 joomla升级

第18章 其他系统迁移

第19章 流量翻倍计划