JDocument类
在搜索引擎搜索我的网站就会发现一些,因为没有注意meta和title 所有的开源项目相关的页面title和meta都一样,对用户很不友好,根本无法分清那个链接是说什么内容的,因此这里就需要JDocuement类来解决问题
用法很简单,首先取得document对象 $document =& JFactory::getDocument();
然后:
$document->setTitle(*****);
$document->setDescription(*****); //添加 meta
$document->addStyleSheet(*****) //添加CSS文件
$document->addScript(*****) //添加js脚本
$document->setLanguage(***) //设置语言文件
其他还有一些 setModifiedDate 等,其他基本就不常用了,记住这些就行啦!
JFactory类
正如其名,这是一个工厂类,应该是简单工厂模式的标准实现。这个类几个重要的函数分别返回几个重要的实例。
1、getACL 调用_createACL 返回 joomla.user.authorization 的实例,数据来源
2、getApplication 调用 joomla.application.application 的实例获取函数JApplication::getInstance,也就是我们在index.php中提到的$mainframework
3、getConfig 调用 _createConfig 返回 joomla.registry.registry 实例,返回配置参数
4、getDBO 调用 _createDBO,返回数据连接JDatabase的实例,这个是以后扩展模块要经常用到的
5、getDocument 调用 _createDocument 根据请求的格式,返回JDocumentRaw或者JDocumentHtml实例
6、返回 Juser 实例
7、getLanguage 调用 _createLanguage 返回 joomla.i18n.language的实例,以后在多语言环境经常用到。
其他的比如getMailer,getCache 等就不在写了
Jdatabase类
这是数据库connector类,封装了与数据库操作的一系列操作。目前有两个子类,JDatabaseMysql,JDatabaseMysqli,这个类为以后扩展到其他数据库留出了接口。
关于一些具体函数没有什么特殊的,基本对应mysql的函数的一些特征,对于这个类应用基本都是首先 setquery ,然后load
或者直接执行 executequery ,主要还是不要混淆load开头的几个函数的具体功能:
1、loadObject 以对象的形式返回结果集的第一行数据
2、loadObjectList 对应上一个函数,返回一个对象的集合
3、loadResult 返回第一行的第一个字段或者NULL
4、loadResultArray 返回某一字段的数据到一个数组中
5、loadRow 返回第一行数据,应该是数组形式
6、loadRowList 对应上一个函数,返回行数据的集合
还有一个函数很重要就是 setUTF ,这个函数决定了数据库能显示中文。
Juser类
user 类处理所有程序中与用户交互的相关事情。
这个类的构造函数调用load函数,输入的参数是用户id,可以初始化用户的相关信息,这些信息包括 aid ,gid,usertype,username,name,id等等,这些信息在扩展中经常用到。
同时,在程序中,用刚刚说过的getUser,取得当前登录用户实例。具体用法如下:
$user =& JFactory::getUser();
$userId = (int) $user->get('id');
根据gid 可以判断用户的相关的组以及组权限。
了解了Juser类,还需要了解一下 JUserHelper类,这个类包括了与用户活动相关的几个函数,比如获得随机密码以及取得加密密码等。
同样 getUserId 根据用户名取得用户ID 也是经常用到的。
JPath JFile JFolder 类
这几个类都是filesystem包中的重要类,具体的使用看我在模块快速生成器中的代码,函数意义都非常明确:
if(JFolder::exists($targetpath)) JFolder::delete($targetpath);
JFolder::create($targetpath);
JFolder::create($targetpath.DS.'tmpl');
以上是目录使用的例子
$sfile=$sourcepath.DS.'index.html';
$tfile=$targetpath.DS.'index.html';
JFile::copy($sfile,$tfile);
$files[]=$tfile;
文件拷贝
$sfile=$sourcepath.DS.'helper.php';
$data=JFile::read($sfile);
$tfile = $targetpath.'/helper.php';
JFile::write($tfile,$data);
$files[]=$tfile;
unset($data);
文件读取和写入
JHtml 类
定义:libraries/src/HTML/HTMLHelper.php
JHtml 没有几个函数,但是在组成页面已经模板书写过程中经常用到,比如:
JHTML::_('date', $this->item->date, JText::_('DATE_FORMAT_LC5'))
以及在后台管理中常用到的
来看看这几个函数:
calendar 显示一个日历插件
date 显示格式化日期
iframe 插入一个iframe
image 插入一个图片
link 插入一个超链
以上是常用的函数,函数的以用方式就如例子。
JToolBarHelper JToolBar 类
这个两个类是后台管理过程经常用到的,比如:
JToolBarHelper::title( JText::_( '{{component}} Manager' ), 'generic.png' );
JToolBarHelper::deleteList();
JToolBarHelper::editListX();
JToolBarHelper::addNewX();
这几句就添加了三个按钮,添加,删除,修改
其实还有几个常用的
preview //预览
publish //发布
cancel //取消
比较常用的就这几个了,主要是在后台管理toolbar上的按钮。相关按钮的动作对应后台管理的task,相应的对做要在controller中生命。
JText类
定义:libraries/src/Language/Text.php
Joomla 最常用的类之一,使用方式JTEXT::_('JJJJJ')
JJJJJ对应语言文件中的相应字符串。
为了实现多语言这个是常用的。当然如果你以utf-8字符集存储php文件,对于中文就不用考虑那么多了,不过不够规范喓。
要是只是自己用,也无所谓啦,开发要快点。
呵呵!推荐还是用吧!
JRequest类
这是另一个Joomla扩展中最常用的类,这个类封装了客户端提交的请求相关的信息,通过这个类你可以得到用户提交的相关信息和数据,有几个重要的函数:
首先是get($hash),我们看看部分源码就知道,get得到什么了
switch ($hash)
{
case 'GET' :
$input = $_GET;
break;
case 'POST' :
$input = $_POST;
break;
case 'FILES' :
$input = $_FILES;
break;
case 'COOKIE' :
$input = $_COOKIE;
break;
case 'ENV' :
$input = &$_ENV;
break;
case 'SERVER' :
$input = &$_SERVER;
break;
default:
$input = $_REQUEST;
break;
}
我们通过get('post') 等取得用户提交的数据数组。
还有getVar ,取得某一request变量
getURI ,返回请求的URI
setVar和set 则对应着getVar 和get
在程序中使用的方式是:JRequest::getVar('','');
组件是如何被调用并渲染的
Joomla代码中, 组件是如何被调用并渲染的呢?
在描述 /index.php的时候,我们看到根据option参数,$mainframework->dispatch(),就进入了组件的调用并渲染的过程,我们来看看JSite 的dispatch都做了什么工作。
dispatch 最关键的是这几句话:
$document->setTitle( $params->get('page_title') ); //设置标题
$document->setDescription( $params->get('page_description') ); //设置meta
$contents = JComponentHelper::renderComponent($component);
$document->setBuffer( $contents, 'component');
可以看到最为关键的是 JComponentHelper::renderComponent($component);
再看看这一行程序完成了那些工作
$task = JRequest::getString( 'task' );
// Build the component path
$name = preg_replace('/[^A-Z0-9_\.-]/i', '', $name);
$file = substr( $name, 4 );
// Define component path
define( 'JPATH_COMPONENT', JPATH_BASE.DS.'components'.DS.$name);
define( 'JPATH_COMPONENT_SITE', JPATH_SITE.DS.'components'.DS.$name);
define( 'JPATH_COMPONENT_ADMINISTRATOR', JPATH_ADMINISTRATOR.DS.'components'.DS.$name);
// get component path
if ( $mainframe->isAdmin() && file_exists(JPATH_COMPONENT.DS.'admin.'.$file.'.php') ) {
$path = JPATH_COMPONENT.DS.'admin.'.$file.'.php';
} else {
$path = JPATH_COMPONENT.DS.$file.'.php';
}
这部分实际上确定了那个compoent下的组件文件被引入,并取得了task,中间一部分兼容代码就不看了
我们来看关键代码:
ob_start();
require_once $path;
$contents = ob_get_contents();
ob_end_clean();
这部分代码就是包含了组件的开始文件,而这个文件,我们在组件开发的时候用到的。这个文件引入了controller 文件,并根据task决定进入那个分支。
再深入下去就是组件的整个生成过程,以后再看了。
JTable是什么
JTable是什么?肯定不是对应html中的table ,在做com_helloworld的时候,没有仔细理解,后来一位同事问我Jmodel,JTable,JDatabase有什么区别?一时语塞
JTable是数据库中数据表在程序中的表达,不知道这句话怎么说,其实JTable更对应着表中的一行,以及相应的操作。Joomla中的JTable**对应中数据库中 **表,我们在使用的时候要针对我们自己所使用的表扩展自己的JTable.我们需要关注的是JTable的函数checkin,checkout ,着两个函数对更新的数据进行合法性检查,我个人觉得对于数据完整性的检查应该放在Jtable的check中。
Jtable 比较常用的函数,看名字就明白了,记住几个吧:
delete,store,bind,load,setError等,具体还是需要用的时候看看源代码吧。
JModel是什么
我们经常提到MVC模式,JModel在Joomla的MVC组件中是重要的一个环节,JModel是MVC中的数据视图层,我们需要明白的是JModel不同于JTable,数据视图是由一个或者几个table构成,或者多条数据记录构成的数据集合,以及数据集合的相关操作,对于JModel我们不必了解太多的具体函数,在组件开发过程中,通常都要继承JModel,在子类中完成数据集合的生成以及相关的操作,保存,删除。
我个人倾向对于几个表之间的数据完整性,要在JModel中验证,而对于单一表的数据完整性要通过JTable check函数完成。
同事对于那些有逻辑操作的验证则最好在MVC的 controller层完成。
接下来,我们要看看MVC中的 View 和 Control
Jview
MVC模式中,重要的一环,JView 和 tmpl目录中的模板,共同决定了,页面html的代码,Jview是在Jmodel和template之间的桥梁。我们扩展做自己的组件,都需要扩展Jview的子类。这个类其实需要看看它的变量和函数也就理解:
跟数据相关的部分:
_defaultModel 默认的model ,可以通过 setModel 进行设置。同时function &get 可以从指定的model调用函数返回相应的数据
_models 存贮model的数组,getModel,可以从中返回指定的Model
assign assignref,数据赋值函数,这两个函数的任务是赋值变量给模板。
跟模板相关部分:
loadTemplate,setLayout,setLayoutExt 看名字就知道了
还有一个函数:display ,大部分的view子类都要继承这个。
JController
同样 JController 是MVC中重要的起点,正式这个类决定的动作的下一步流向,我们来看看表格提交数据的典型的controller的代码:
function edit()
{
JRequest::setVar( 'view', 'hello' );
JRequest::setVar( 'layout', 'form' );
JRequest::setVar('hidemainmenu', 1);
parent::display();
}
/**
* save a record (and redirect to main page)
* @return void
*/
function save()
{
$model = $this->getModel('hello');
if ($model->store($post)) {
$msg = JText::_( 'Greeting Saved!' );
} else {
$msg = JText::_( 'Error Saving Greeting' );
}
// Check the table in so it can be edited.... we are done with it anyway
$link = 'index.php?option=com_hello';
$this->setRedirect($link, $msg);
}
/**
* remove record(s)
* @return void
*/
function remove()
{
$model = $this->getModel('hello');
if(!$model->delete()) {
$msg = JText::_( 'Error: One or More Greetings Could not be Deleted' );
} else {
$msg = JText::_( 'Greeting(s) Deleted' );
}
$this->setRedirect( 'index.php?option=com_hello', $msg );
}
/**
* cancel editing a record
* @return void
*/
function cancel()
{
$msg = JText::_( 'Operation Cancelled' );
$this->setRedirect( 'index.php?option=com_hello', $msg );
}
实际上 controller 跟提交的task参数,调用controller中的不同的函数,当然默认会调用display ,我觉得还需要记住的就是
getModel ,和setRedirect ,其余函数用到再看就可以了。