教程栏目

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升级