在本节中,我们将会思考joomla应该怎样接收前台提交的数据,以及解决相关的问题。但是在解决问题之前,有必要再谈一下MVC.刚好在Joomla官网上看到一篇介绍MVC的文章,觉得非常的好,就在这里介绍一下这篇文章了。
在本节中,我们将会思考joomla应该怎样接收前台提交的数据,以及解决相关的问题。但是在解决问题之前,有必要再谈一下MVC.刚好在Joomla官网上看到一篇介绍MVC的文章,觉得非常的好,就在这里介绍一下这篇文章了。
进入Joomla平台
进入Joomla平台
当我们在URL中输入index.php的时候,就进入了网站的入口。Joomla的设计主要是返回并输出组件处理的结果,也就是真正在后面完成人任务的 是组件。当我们请求下面的链接index.php?option=com_<name>(在Joomla中的所有URL都是这种形式,之所以 我们看到的是http://www.zmax99.com/menu-cn-module-develop/item/65-article-cn- module-develop-part05这种形式是因为,我们开启了搜索引擎友好的选项,可以在后台关闭这种选项)的时候。Joomla就会在查找 Componets/com_<name>/<name>.php这个文件,并且加载这个文件。举例来说,如果你的组件叫 com_guestbook.那么在Components目录下一定会有一个com_guestbook文件夹,并且在这个文件下面会有一个 guestbook.php的文件。在这个文件中我们可以决定使用旧的顺序开发模式还是使用新的MVC模式。我喜欢叫这个文件为组件的入口点文件。
MVC 模式的实现,主要依赖两个方面:文件和类。Joomla系统会自动寻找按照一定规则命名的文件,然后实例化这个文件中的类。如果没有找到文件或者 类,joomla就会执行失败。所以在joomla中命名是十分重要的。按照命名规范来给文件和类命名将会避免需要不必要的麻烦。
controller.php文件
controller.php文件
组件最开执行的组件根目录下的一个控制器文件。这个控制器文件的命名按理来说随便的。但是通常情况下我们将它叫做controller.php。所以在入口点文件中我们通常会看到下面的代码:
require_once(JPATH_COMPONENT.'/controller.php');
通过上面的代码,我们可以放心,controller.php文件可以在组件的任何一个地方,只要我们在require_once函数中写对这个路径就可以了。不过一般情况下都是放在组件的更目录下,直接用一个JPATH_COMPONENT该多方便。
加载了controller.php文件,为了使用MVC,我们需要包含一下Joomla的controller库。一般的代码如下:
jimport('joomla.application.component.controller');
完成了上面的两个工作,我们还需要定义一个控制器类,这个类需要从JControllerLegacy类派生。理论上这个类的类名是任意的,但是我强烈要求按照下面的命名格式来命名(组件的命名+Controller)。这样会省去好多的麻烦。
class <name>Controller extends JControllerLegacy
{
}
到处我们写了两个文件一个是入口点文件,一个是控制器文件。由index.php文件来加载入口点文件,由入口点文件来加载控制器文件。
下一步要做的就是创建一个对象,并且让这个对象开始工作。一般的你需要在你的入口点文件中加入下面的代码:
//通过控制器的名字(前缀)来实例化控制器对象 $controller = JControllerLegacy::getInstance(''); //执行请求的任务 $controller ->execute(JFactory::getApplication()->input->getCmd('task')); //如果需要可以在下面执行重定向 $controller->redirect();
完成了这些,joomla系统就会自动加载相关的文件和类,所以一定要注意文件的命名。因为joomla的自动加载都是按照一定的命名规则来加载文件的。如果文件名命名不正确,就会出现奇怪的错误。
获得数据
获得数据
思考一个文件,joomla应该从什么地方获得数据并且处理和显示数据。答案是从Get请求和POST请求。刚才我们并没有在 URL(index.php?option=com_guestbook)中指明task变量,那么在入口点文件中到底执行什么任务呢?在joomla中 无论是有没有提出一个请求,Joomla都会用它默认的任务(display任务)来完成一个请求。(这里我有一些疑问?????)由于我们并没有指定任务。所以系统会自动自动display任务
class Controller extends JControllerLegacy { function display() { echo 'displaying'; } }
也就是说如果你在URL中指定task=jump。那么控制器会执行控制器类中的jump函数。
class Controller extends JControllerLegacy { function jump() { echo 'jumping'; } }
视图
视图
为了触发MVC中的V(视图工作),我们需要去实现JControlelrLegacy类的__construct()方法。最简单的实现方法如下,只需要简单的调用父类的构造函数就可以了。
jimport(joomla.application.component.controller); class Controller extends JControllerLegacy { publice function __contruct($config=array()) { parent::__construct($config); } }
什么是视图?
视图就是一个数据子集。和SQL的视图概念有点像(如果你知道SQL的视图的话)。你可以传递不同的数据到不同的视图中,显示出不同的页面。你可以有多个 视图。在joomla组件的根目录下joomla用views目录来存放视图文件。一般情况下,在views目录下我们只放视图文件。一个典型的视图文件 结构如下:
<name> 根目录文件夹
controller.php
<componet_name>.php
'veiws'文件夹
view1 第一个视图文件夹
view2 第二个视图文件夹
等等
在视图文件夹下必须有一个文件叫view.html.php(不一定是html)。你可以在你的请求中包含一个view变量,向MVC指定要加载的变量。如果你的视图文件夹下没有默认视图,那么你必须要执行这个变量,否则系统报错。
http://www.zmax99.com/index.php?option=com_guestbookJ&view=<myview>[&task=<mytask>]
上 面已经说过了,task部分是可以不要的。如果你忽略了task变量,那么默认执行的任务就是display.上面的请求告诉joomla应该导 入<www.zmax99.com>/componets/com_guestbook/views/myview /view.html.php文件。如果这个文件不存在,joomla就会出错。通过改变view的值,你可以显示不同的视图。
每一个视图 的请求你都指定了你需要的视图的格式。默认的格式是html.还有几种其他的格式。比喻说pdf rss 等等。你可以用format=<myformat>来指定你请求的格式。如果format变量没有设置,那么就会使用默认的 format=html.
html格式就是告诉joomla需要将当前使用的模版模块都加载进来,然后返回一个完整的页面。
正如前面提到的,你可以使用其他的格式,使得joomla仅仅返回数据而不包含模版。你甚至可以使用ajax格式去传递Ajax请求到前台。(我也不懂自己在说什么)
我 们需要写一些代码到view.<format>.php文件中。有了视图文件,现在我们还需要建立视图类。建立一个视图类,需要让我们自己的 类从JViewLegacy类派生。并且要严格按照命名规则来书写。因此,你的类名必须和组件的名称相关。格式如下:组件的名称+View+视图的名称。 举例来说,现在我们的组件的名称为guestbook。视图的名称为postMessage(option=com_guestbook& view=postMessage)那么视图类的名称为:
// php对类名的大小写不敏感 class GuestbookViewDetail extends JViewLegacy { function display($tpl = null) { echo "www.zmax99.com"; } }
布局
布局(layout)是视图展示数据的一种方式。使用布局,你可以非常方便的将相同的数据进行多方面的展示。 比喻文章的博客布局 列表布局。和以前一样。如果你没有指定layout变量。那么系统会自动加载default.php这个布局。为了使用布局。你需要在视图文件夹下创建一 个文件夹叫‘tmpl’.并且创建文件<mylayout>.php。如果你用默认的布局。那么这个文件就会是default.php。
可以通过layout变量来指定布局。也可注入。(不清楚什么意思)
为了使用布局。你在视图类中必须调用parent::display()方法。然后传递布局模版的名称作为参数。
代码如下:
class View extends JViewLegacy { function display($tpl= null) { //准备数据 $msg = //注入数据 $this->assignRef('变量的名称',$msg); //调用布局文件。如果$tpl=null joomla就会寻找default.php文件 $tpl='myTemplate'; parent::display($tpl); } }
写的乱七八糟的,以后再修改。
评论 (0)