joomla2.5推出已经非常久了,但是我们可以找到的资料可以说是没有的,这里是中文资料,英文还是有的。在2.5上边开发模块和1.5可以说基本是没有区别的,就不说了很简单。但是组件开发变化还是非常大的,从2.5开始,我们可以看到组件基本上都是引入了MVC模式来开发的,但是如果开发一个小功能的组建了,谁都知道建立那些xml文件也不是什么轻松的事情,一般我们还是用DW快些,更有一些内部的表单生成,这些都能辅助快速,但是对于我不喜欢记忆那么多的方法的人,还是选择传统的方式,毕竟这些方式对于任何系统都是可用的,而且速度更快。今天就专门说说在2.5中不使用xml来生成表单,和2.5中如何写出一个完整的组件.
这个组件功能有这些,通过一个数据表,存储一些信息,比如qq,email,电话,简介,和三张照片信息.另外还要修改网站标题,用于seo的描述和关键字.先来分析,我们发现前面和后面可以用一个tab切换来搞定,这也是joomla组件多数实现的方式,网站的全局配置组件就是这种模式.好了,下面分步骤一步一步来完成这个组件.
1.开发组件准备,建一个数据表,里面存储相关字段,不具体说了,这个不会可以直接闪人了.注意一下,照片我们仅仅存入照片名称以及带扩展名,路径不存入.接着模拟数据建立一条信息,接着在extensions里面建一个组件菜单,不然后台没有,还有备份配置文件configuration.php,因为后边做第二个问题要改写这个,所以防止出错,弄的系统进不了.
2.建立基本组件开发框架.按照执行方式来说,配置文件是:组建.xml,里面组么写,找个对照着写,注意不要忘记某个文件了,不然打包安装出错.组件名后边就用test了.test.php就是组件主文件这个组件就是com_test.test.php内容
defined('_JEXEC') or die; jimport('joomla.application.component.controller'); $controller = JController::getInstance('Test'); $controller->execute(JRequest::getCmd('task')); $controller->redirect();
所有组件标准的写法,只要换Test名称即可.
defined('_JEXEC') or die; jimport('joomla.application.component.controller'); class TestController extends JController { public function display($cachable = false, $urlparams = false) { require_once JPATH_COMPONENT.'/helpers/test.php'; TestHelper::addSubmenu(JRequest::getCmd('view', 'test')); $view = JRequest::getCmd('view', 'test'); JRequest::setVar('view', $view); parent::display(); return $this; } }
这是主控制器,controller.php文件里面主要就是添加了tab菜单,用来做上边两个功能,helpers/test.php就是切换功能的助手方法类:也有统一写法只要改改就可以
class TesttHelper { /** * Configure the Linkbar. */ public static function addSubmenu($vName = '') { JSubMenuHelper::addEntry( JText::_('网站信息设置'), 'index.php?option=com_test&view=test', $vName == 'test' ); JSubMenuHelper::addEntry( JText::_('网站SEO设置'), 'index.php?option=com_test&view=seo', $vName == 'seo' ); } }
你还可以切换更多菜单,从这里就可以看出,我们实际上定义了test和seo两个视图V,明白这点也很重要.
3.重点来了,子控制器,controllers/test.php这个和外面那个同理,不过在这个文件夹下面我们可以根据自己需要建立更多的控制器,不过一般小功能都是建立一个,在这个里面有我们重要的TASK,就是执行操作.对于mvc模式,习惯性把数据处理放到模型里,不过简单的要写模型,还有表类啥的,感觉麻烦,我们就用php语言本身和sql来操作好了,这个在新的2.5并不提倡,但是我想说的是,对于这种使用一次的组件能快就行了,而且这样不见得就不好,对于一个不太了解joomla这种系统的人修改也还是方便的.当然大些涉及到增删改查的用标准更好,省去写方法.在这个控制器我们就需要两种方法,一个用来保存表信息,一个用来保存网站配置,对于提交过来的数据就在这两个方法里面处理.在这里并没有用到模型和相关表单类.接着就是视图了,viwe.html.php里面有一个添加方法,用来告诉提交后数据处理,新的joomla采用控制器名.方法名,这里就是 JToolBarHelper::save('test.save');另一个视图就是 JToolBarHelper::save('test.seo');这样就有右上角保存按钮了,更多按钮查阅相关资料,以后讲.最后就是模版文件default.php,里面主要是表单,因为我们使用传统的方法,所有这个表单你可以用DW来做再贴过来.
注意表单提交的action到这里index.php?option=com_test&tmpl=component&task=test.save,tmpl是用来只返回组建本身,对于修改信息,我们完全可以在这里写查询,虽然完全违背mvc,但这样不会错.
4.最后想说一下处理表单提交的数据,注意表单写成f[name],f[qq]这种名称,我们就可以直接接收数据f,然后来处理,在这用传统$_POST或者JRequest::getVar('f', array(), 'post', 'array');都是可以的,注意前者验证,这是一个数据,对于使用传统的sql来添加或者修改,我们可以使用数组值来处理,对于图片这个是不能接收到的,$_FILES还是比较好的,可以分开接收,数组接收也可以通过循环来上传,插入数据也要循环,个人觉得循环套着也不怎么好用,单独处理也行,随便吧,
5.对于改写配置,我们首先把那个配置文件里面的类读取成对象,然后转换成数组,再修改数组值,然后把数组转换成类的形式以文件写入覆盖原文件,这样就完成了配置,这也是处理常见配置文件的办法,具体代码就不说了,JArrayHelper::fromObject($config);可以把对象转换成数组,$obj = new JRegistry($dataConf);可以把数组还原对象,该对象有一个方法可以生成php代码$str = $c->toString('PHP', array('class' => 'JConfig', 'closingtag' => false));JFile::write($file, $str)这个方法就是写入文件第一个参数是文件完整包括文件名的路径.就这样可以改写joomla配置信息.
后记,以上方法在2.5中官方里面是不推荐的,官方几乎都是标准mvc模式,随便看看文件结构就知道,还有很多设计的新的管理类,如果你的组件不涉及管理表,没有分页,或者是增删改查之一用法,那我这种非官方方法也是不错的,这个在1.5很普遍,类多了选择多了,反而使人不好选择,简单故我在,选择合适自己的方法,代码只是工具,要完成的功能才是最重要.下次会讲标准MVC模式开发,总的来说,2.5中对象使用最普遍,有些,其实个人一直还是喜欢过程,因为,一般我是遇不到多么浩瀚项目,咱只是小小码农而已.
一个月才写一篇,觉得堕落了,一直也在研究2.5,还有thinkphp,还有就是研究足彩,3串1好呢还是2串1好呢?
附图一张 功能的一角