joomla安装了load-linux module load-in-article插件但是文章页无法添加菜单模块

CRM客户关系管理系统, 在线CRM - Salesforce 中国
作为一家创新型公司,我们开发了全球首屈一指的 CRM 平台,员工完全可以通过互联网访问该平台。无需购买、设置或管理任何基础架构,您只需登录即可开始工作。 现在,我们的全新 Lightning 平台为您提供了最快速、最完整的解决方案,让您能够以客户为中心开展一切工作。
使用全球首屈一指的 CRM 解决方案,更智能、更快速地开展销售。
为每位客户提供支持。 不限时间。 不限地点。
市场营销的未来就是一对一客户旅程。
重新构想客户、合作伙伴和员工互动。
快速构建应用程序。 以更快的速度开展业务。
客户关系管理 (CRM) 旨在管理您企业最重要的目标 - 使您的客户感到满意。 高度有效的客户关系管理系统将涵盖和增强与您客户互动的所有方面,从
:让现有的客户关系变得更加稳固,新客户关系进展更加快速 - 所有这些都是业务成功的核心要求。 作为全球CRM行业的领导者,Salesforce 在客户关系管理领域的专业知识是无可匹敌的。 我们的技术和客户管理软件经过专门设计,旨在为您的企业提供更高的简易性、集成度、效率和可见性。 作为云计算提供商,我们通过
(平台即服务)提供 CRM
,让您能够在执行多项任务的同时跟踪您的客户项目和预算 - 这也是当今经济环境下的一个必要条件。 为什么不开始使用 30 天的
更快速。 更实惠。 更简单。 更出色。 Salesforce将让您的业务更上一层楼。 Salesforce 的客户关系管理软件可即时简化您的业务流程并实现自动化。 通过创建“基础架构即服务”,您的企业能够让销售、市场营销和支持团队协同工作,并查看更宽泛的重要销售和客户数据,从而将他们解放出来,集中精力赢得新客户,更好地服务现有客户。
借助我们有效的客户关系管理解决方案,您的销售代表和市场营销团队能够专注于填充销售漏斗和创造收入,而无需手动跟踪销售线索。 Salesforce 的客户关系管理软件让您的团队可通过多种渠道进行营销,并查看所有与客户相关的信息和活动,从而显示哪些方案有效、哪些方案无效,并且更频繁、更快地将销售线索转化为客户。
用于活动管理的客户关系管理解决方案。
通过显示客户交易和有关客户联系人的重要信息,帮助您的企业自信地回应客户咨询,更高效地管理后续跟进。
用于服务和支持的客户关系管理解决方案。
CRM 可促使您提供卓越的客户体验:让您能够整理来自不同渠道的客诉请求,更高效地分配给团队和代理,找到客户问题的最佳解决方案,推动客诉解决,引导客户使用基于 Web 的解决方案,并且快速发现您的服务中存在哪些不足之处。
Salesforce 的 CRM 解决方案提供了大量的工具和选项,旨在帮助您的企业创造卓越业绩,包括:合作伙伴/渠道管理、网络社区、点击式自定义功能、无缝的 CRM 集成等等。
近几年来,传统的 CRM 软件已逐渐被 Web CRM(又称为 在线CRM&、&托管型CRM&和&按需CRM)超越。 如今,越来越多的公司倾向于采用 Web(特别是 salesforce.com)来管理 CRM 等业务应用程序。
其中原因何在?因为若要在这些动荡时期掌控公司,把握每个、每个和每次比以往显得更为重要。安装和维护软件无需注入一大笔前期投资。使用 salesforce.com 的即付即用模式,取得成功所需支付的成本大大降低。
在线CRM 承诺快速实现价值。 无需一大笔前期资本投资,这为 CRM 的成功提供了一条捷径。与大多数 CRM 软件相比,托管型CRM所节省的这一部分资金可以更快速地实现 ROI。
基于 Web 的 CRM 支持快速部署。传统客户端/服务器 CRM 软件的实施需要 12 个月或更长时间,与此相比,托管型 CRM 的实施通常只需数周或数月时间。
托管型 CRM 使自定义操作变得更轻松。使用 Salesforce CRM 等在线 CRM 解决方案,基本的自定义操作将变得十分轻松容易,因此,企业用户只需通过点击式界面即可在短短数分钟之内进行更改。
按需 CRM 具有无限可调整性。Salesforce.com 采用多租户方式,因此不存在单个软件实例,且您无需花费高昂的成本和等待数月或数周时间,即可快速调整实施。
在线CRM 没有令人头痛的升级问题。由于您几乎可即时部署 CRM 的新功能,因此您始终可以利用基于 Web 的托管型 CRM 系统获得最新版本,升级不再令人头痛。完成 Salesforce CRM 升级的过程就如同您最喜爱的消费站点(例如,基于 Web 的电子邮件或网站)进行升级一样,您的所有“产品”都在随时待命并在升级之后立即投入工作。
内建 CRM 软件。 对于内建 CRM 软件而言,过时的客户端/服务器模式需要您对 IT 基础结构(其中包括网络和服务器)进行投资才可运行该软件。此外,当供应商增强功能时,您还需雇佣 IT 专业人员团队来安装、部署和维护软件。
在线CRM 解决方案。无论是“基于 在线CRM”、“托管型CRM”、“按需 CRM”、“软件即服务器 () CRM”,还是“CRM”,所有这些术语都是指同一事物,即通过 Intetnet 提供 CRM 的一种新模式。使用这种由 salesforce.com 提供的备受欢迎的CRM系统,您无需购买、安装、维护或升级任何软件或硬件,从而节约企业管理成本。
云计算是 IT 领域中的佼佼者。但是,它的准确含义是指什么?它对 CRM 而言又意味着什么?
传统的客户端/服务器软件已经走到尽头,特别是对 IT 组织来说,他们希望尽量最小化对此类软件的投入。CRM 软件的方式使软件市场从购买所有权转向租用模型,免除了软件购买、部署和维护的困扰和费用。
云计算是另一种通过 Internet 交付更具吸引力的业务软件的模式。使用在线CRM 解决方案之后,由于您仅需支付,而无需支持许可费用,因此可以显著降低企业管理成本。多租户平台采用一个共同的基础结构以及集中维护的代码库(也称为云计算),使实现上述模式成为可能。
协同办公软件包括CRM 软件,它利用网络、计算机、信息化,而提供给多人沟 通、、协同一起办公的一块CRM软件,给办公人员提供方 便、快捷、降低成本,提高效率的一款在线CRM软件。 实际上是协同应用软件的开发平台和运行支撑平台,同时为协同 应用提供协同工具和协同引擎服务。
Salesforce CRM 有助于建立更好的客户关系,从而帮助您节省资金并增加利润。
销售管理与销售自动化系统提供商机管理、销售跟踪、销售预测等功能,避免软件难题。
云平台为在线CRM提供强大支持的技术,也是构建和部署其他企业应用程序的最快方式。
SFA(销售能力自动化)是CRM客户关系管理系统的一个业务组件,是企业销售管理的基本工具。
云计算让企业通过网络以按需、易扩展的方式获得服务,免除软件购买、部署和维护的困扰和费用,降低成本。
客户服务和支持解决方案可以加强呼叫中心管理和客户自助服务等。
通过云计算应用程序及云平台,无需进行复杂设置或安装软件及硬件,即可快速启用。
Salesforce CRM 为售后服务管理提供解决方案,降低成本,确保在所有接触点上提供一致的售后服务管理。
CRM 即客户关系管理,有助于降低成本、增加利润并提高客户忠诚度。立即了解。
通过与内部工作人员安全实时地保持联系,共享信息,帮助企业提高协同办公的效率。
在业务活动中建立网络社交环境并进行业务转型以适应新的网络社交现实环境。
Salesforce 企业管理软件是能够帮助企业管理者们提高工作效率,为企业节省成本,没有复杂的流程设计,没有复杂的表单,简单易用。Joomla 框架的程序执行流程及目录结构分析
预估稿费:400RMB
投稿方式:发送邮件至linwei#360.cn,或登陆网页版在线投稿
0x00 文件目录介绍
administrator/
# 管理后台目录
# 该文件夹存放一些基于Joomla框架开发的一些实用的脚本
# 文件缓存目录
# 该文件夹存放一些终端使用的命令,用于操作当前的站点
components/
# Joomla组件目录
# 网站内容使用的媒体文件目录,后台有对此文件夹进行管理的功能
# 运行Joomla需要包含的基础文件
# 语言目录,多语言的翻译都存放在这里
# 应该是控制布局的,没有注意过是哪个版本加上的,也没研究过,等有时间了研究一下再写
libraries/
# Joomla使用的库文件
# 日志目录,一些异常处理都会存放在这个文件夹里,例如后台登录时输入错误的用户名和密码
# Joomla使用到的媒体文件,主要是页面渲染会用到的,存放的内容跟images目录有区别,而且后台是没有对其进行管理的功能的
# Joomla模块目录
# Joomla插件目录
templates/
# Joomla站点模板目录
# 临时目录,如安装组件或模块时残留的解压文件等
configuration.php
# Joomla配置文件
htaccess.txt
# 帮助我们生成.htaccess
# Joomla单入口文件
LICENSE.txt
# 不多叙述
README.txt
# 不多叙述
robots.txt
# 搜索引擎爬行使用的文件
web.config.txt
# 据说是IIS使用的文件
0x01 Joomla的MVC
在Joomla中并不像国内的一些cms一样,主要功能的实现放在组件中,下面就说一说Joomla中的四个非常重要的东西:组件、模块、控制器、视图。
在Joomla中,组件可以说是最大的功能模块。一个组件分为两部分:前台和后台。后台主要用于对对应内容的管理,前台主要用于前台页面的呈现和响应各种操作。其文件目录分别对应于joomla/administrator/components和joomla/components。组件有自己的命名规则,文件夹名须命名为com_组件名,组件的访问也是单文件入口,入口文件为com_组件名/组件名.php。如components/com_content/content.php。
其中option=com_content&view=article&id=7,它会先调用content.php,再由router.php路由到article视图,再调用相应的Model层取出ID=7的分类信息,渲染之后呈现在模板中的jdoc:include type=”component位置上。
与组件(Component)不同的是,模块(Module)是不能通过URL直接访问的,而是通过后台对模块的设置,根据菜单ID(URL中的Itemid)来判断当前页面应该加载哪些模块。所以它主要用于显示内容,而一些表单提交后的处理动作一般是放在组件中去处理的。因此,模块通常都是比较简单的程序,文件结构也很清晰易懂,如modules/mod_login模块中的文件结构如下:
modlogin.xml # 模块配置及安装使用的文件
mod_login.php # 模块入口文件,以mod模块名.php命名,可以看作Controller层
helper.php # 辅助文件,通常数据操作会放在这里,可以看作Model层
tmpl/ # 模板文件夹,View层
| default.php # 默认模板
| default_logout.php # 退出登录模板
2.1 模块调用的另外一个参数
在模板的首页文件中,我们会看到调用模块时有如下代码
jdoc:include type="modules" name="position-7" style="well"
这里多了一个style参数,这个其实是一个显示前的预处理动作,在当前模板文件夹中的html/modules.php中定义,打开这个文件我们就能看到有一个modChrome_well的函数,程序不是很复杂,只是在显示前对html做了下预处理。
2.2 模块的另外一种调用方法
有时候会需要在程序里调用一个模块来显示,可以用以下程序来调用
该程序会显示所有设置在position位置上的模块,当然也会根据菜单ID来判断是否加载
$modules = & JModuleHelper::getModules('position');
foreach($modules as $module){
echo JModuleHelper::renderModule($module, array('style' = 'well'))
个人理解,模板就相当于输出的一种格式。也就是在后端已经调用了相关的数据,准备在前端以什么样的格式输出。
在Joomla中,一个页面只能有一个主要内容(组件:component),其他均属于模块。如图:
如果从代码来分析的话,打开index.php(组件下的index.php),除了简单的HTML和php外,还可以看到以下几类语句:
jdoc:include type="head"
jdoc:include type="modules" name="position-1" style="none"
jdoc:include type="message"
jdoc:include type="component"
这些是Joomla引入内容的方式,Joomla模板引擎会解析这些语句,抓取对应的内容渲染到模板中,组成一个页面。type指明要包含的内容的类型:
# 页面头文件(包括css/javascript/meta标签),注意这里不是指网站内容的头部
# 提示消息
从代码中也可以看出,页面里只有一个component,同时有许多个modules。事实上message也是一个module,只是是一个比较特殊的module。
以http://127.0.0.1:9999/index.php?option=com_content&view=article&id=7:article-en-gb&catid=10&lang=en&Itemid=116为例从URL来分析模板内容的话,可以清晰的看出:在Joomla的URL中,重要的信息通常包含两部分:组件信息、菜单ID:
option=com_content
# 该页面内要使用的组件,后台对应到Components中,文件使用JOOMLAROOT components中的文件
view=article
# 组件内要使用的view
# view对应的ID
Itemid=116
# 该页面对应的菜单ID
所以上面URL的意思就是告诉Joomla:当前页面是要显示一个文章分类页面,分类ID是7,对应的菜单ID是116。
最后附一张图,帮助理解:
0x02 整体大致运行流程
1. 框架核心代码的初始化
/includes/defines.php定义各个功能模块的目录
/includes/framework.php整个框架调度的核心代码与cms运行的核心代码,框架初始化的入口。
/libraries/import.legacy.php开启自动加载类,并向注册队列注册cms核心类。
调用了JLoader中的setup方法;spl_autoload_register使其进行类的初始定义。
spl_autoload_register()是PHP自带的系统函数,其主要完成的功能就是注册给定的函数作为__autoload的实现。即将函数注册到SPL__autoload函数队列中。如果该队列尚未激活,则激活它们。
/libraries/loader.php定义了JLoader实现类的注册,加载,相关文件的包含等操作。
其中load方法从注册队列中寻找需要被自动加载的类,并包含该注册队列的值。
_autoload方法从注册队列中的prefixes的J中选取需要加载的类目录的前缀。[0]=&/joomla/libraries/joomla,[1]=&/joomla/libraries/legacy
_load方法完成了绝对路径的拼接,及相关文件的包含
/cms.php将PHP Composer生成的加载器autoload_static.php、/autoload_namespaces.php、/autoload_psr4.php、/autoload_classmap.php中的内容全部导入一个$loader的数组,之后将该数组中的前缀及所有类,注册到注册队列中,以方便使用。而这些类,都是针对于cms本身的操作的。接着开始设置异常处理以及一个消息处理器(日志)。最后,将一些注册类的名字规范为autoloader的规则。
configuration.php配置项
之后设置报错的格式
最终的注册队列:
2. 设置分析器,记下使用方法并在分析器后加标记对应代码
对应代码:
JDEBUG ? JProfiler::getInstance('Application')-&setStart($startTime, $startMem)-&mark('afterLoad') :
3. 实例化应用程序
对应代码:
$app = JFactory::getApplication('site');
在这边可能会有疑问,为什么会直接实例化一个之前没有引入的类(同样也没有包含相应的文件)。
还记得我们之前看到过的自动加载类么,在这里,我们首先发现没有在classmap中寻找到,之后在/libraries目录,以/libraries/cms/目录为查找目录,在该目录查找是否存在factory.php文件,若找到,则将该文件包含进来。
在factory.php中,会首先检查我们是否已经创建了一个JApplicationCms对象,如果未创建该对象,则创建该对象。最后创建为JApplicationSite,并将这个对象实例化(对象位于/libraries/cms/application/site.php)。
在该文件中,首先注册了application(这边是site)的名称与ID,之后执行父构造函数和“祖父“构造函数。
为了清晰的说明Joomla web应用的实例化过程,我们列一个树状图来看
|-web.php “祖父”
|--cms.php 父
|---site.php 子
完成了应用的最基础功能,包括:
返回对全局JApplicationWeb对象的引用,仅在不存在的情况下创建它
初始化应用程序
运行应用程序
对模板的渲染(文档缓冲区推入模板的过程占位符,从文档中检索数据并将其推入应用程序响应缓冲区。)
检查浏览器的接受编码,并尽可能的将发送给客户端的数据进行压缩。
将应用程序响应发送给客户端
URL的重定向
应用程序配置对象的加载
设置/获取响应的可缓存状态
设置响应头的获取、发送与设置等基本功能
首先在web.php中实例化了JInput对象。并将config指向JoomlaRegistryRegistry。接着,创建了一个应用程序程序的网络客户端,用于进行网络请求的操作。同时将已经指向的config导入,设置执行时间,初始化请求对象,并配置系统的URIs。
在cms.php中实例化了调度器,主要完成对于组件及模块的调度。并对session进行设置和初始化。
完成了以上所有的配置后,将已经配置完毕的应用对象返回到/joomla/libraries/joomla/factory.php中。完成应用对象的初始化。
4. 执行应用
调用web.php中的execute()方法完成应用的执行。
0x03 说一下我们的关心的路由问题
那么,我们的路由在框架中到底是怎样解析的呢?
其实在跟实例化应用的时候,当执行/joomla/libraries/joomla/application/web.php构造函数时,我们就可以看到Joomla对于URI的处理了:
$this-&loadSystemUris();
跟进看一下loadSystemUris方法,不难看到这一句:
跟进detectRequestUri,发现首先判断了URI是否是http还是https,之后看到这句:
if (!empty($_SERVER['PHP_SELF']) && !empty($_SERVER['REQUEST_URI']))
// The URI is built from the HTTP_HOST and REQUEST_URI environment variables in an Apache environment.
$uri = $scheme . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
就是在这里将$_SERVER['REQUEST_URI']中的相对路径与$scheme . $_SERVER['HTTP_HOST']拼接成了完整的URI:
完成了完整路径获取后,开始修改对象的属性,将新获得的request.uri添加进入配置列表中:
下一步,就是遍历配置列表,查看是否已经设置了显示URI,在配置列表中键值为site_uri。显然我们现在并没有设置该选项:
之后完成的操作就是要设置该显示URI。我们继续跟进一下:
跟进到joomla/libraries/vendor/joomla/uri/src/UriHelper.php的时候,我们稍停一下,看到进入了parse_url方法中。在这个方法中,首先对传入的URL进行了双重过滤,之后利用PHP自带方法parse_url,对URL进行了分割处理并保存到一个数组中,接着返回该数组:
最后的处理结果为:
option=com_content&view=article&id=7:article-en-gb&catid=10&lang=en&Itemid=116
处理完我们的显示URL后,在调用joomla/libraries/cms/application/cms.php中的execute方法时,在调用doExecute方法的时候,会使用joomla/libraries/cms/application/site.php文件中的route方法,这个方法将路由到我们application中。
在joomla/libraries/cms/application/cms.php中的route方法中,我们首先获取了全部的request URI,之后在getRouter方法中初始化并实例化了joomla/libraries/cms/router/router.php中的JRouter类,该类完成了对我们路由参数的识别与划分:
最后在joomla/libraries/cms/router/site.php中的parse方法中完成了相关组件的路由:
可以明显的看到,在
$component = $this-&JComponentHelper::getComponents()
后,$component的值:
对比components/目录下的组件,发现已经将所有的组件遍历,并保存在数组中。
接着遍历该数组,对每个组件设置本地路由,并包含响应的文件,从而完成路由控制。
0x04 总结一下
Joomla整体的运行思路可以简单的归结为一下几点:
框架核心代码的初始化:
关键是初始化了类自动加载器与消息处理器,并完成了配置文件的配置与导入。
完成了这一步,就可以通过类的自动加载器来实现核心类的查找与调用。自动加载器成为了cms的一个工具。
实例化应用程序:
这一步可以简单的理解为对Joomla接下来要提供的web服务的预加,与定义。
应用的执行:
这一步基于上面两步的准备,将执行应用。从代码上来看可以容易的总结出来一个规律:
预加载“执行之前需要做的事件”
执行“执行之后要做的事件”
基本上都是以这样的形式来完成调用以及运行的。
以上都是小菜个人看法,可能有不准确或者非常模糊的地方,希望大牛们多给建议…
Do not learn to hack, hack to learnjoomla 源代码探析(一) 准备工作
18:12 管理员 847 次点击 Tags: 源代码一个代码过程生成 用 Joomla 建站一段时间了,由于采用了 1.5RC3 版,建站过程中发现了不少的 问题,为了解决这些问题,看了不少的源代码,打算写一下源代码的学习过程。 首先是准备工作,源代码的学习过程其实也是一个不断测试代码的过程,所以: 1、搭建一个测试网站,我建议在本机上架一个 WAMP 环境,嘿嘿,为什么选择 WAMP,主要个人习惯了,做了 6 年的 linux 下的程序员,还是不习 惯 emacs, 呵呵,windows 下的编辑器好用。 2、搭建测试网站建议直接采用 SVN 下来的代码,在 windows 上装一个 tortoiseSVN,就可以了,joomla SVN reposity 的地址是 http://joomlacode.org/svn/joomla/development/trunk 3、编辑器,我觉得挺重要的,我推荐使用 UE Studio ,用上你就知道了,能自 动根据源码中的内容,生成类和函数的标签,你就不需要寻找 document 的生成 器了。 4、搭建完成后,用 UE 建一个 project ,导入源代码,时间有点点长,它在分析 代买生成 TAG,生成后,你就点击“标签”,就可以看到全部的类和函数,习惯 了 VC 的编辑环境的人,肯定喜欢这个。 5、搜寻代码学习的资源,目前我也没找到,我只在 http://dev.joomla.org 上 查看了 framework 的文章,中文资源似乎就更少了,我是说 1.5 版的,1.0 版的 有几个中文网站谈到部分的代码问题,但是我没仔细看过质量到底如 何。 到现在位置,已经建立了研究环境,下一步就是“开始” joomla 源代码探析(二) 目录结构
20:51 管理员 849 次点击 Tags: 结构目录首先熟悉完毕 测试网站搭建完毕,首先来熟悉一下,1.5RC3 版的目录结构: 1、componets 所有安装的组件的,前端用户界面相关程序都在这里,每个组件 一个子目录,通常是 com_*** 2、plugins 所有的插件,涉及的程序文件和模板文件,资源等等 3、modules 所以安装的模块相关的程序和资源 4、includes 涉及重要的类,定义等等 5、languages,下面是所有的语言文件,新的规范是一种语言一个目录,比如英 文就是 en-GB,中文简体就是 zh-CN,目录下是相应的语 言定义文件,命名规则 是 语种.组件名字(插件名字).ini ,比如 zh-CN.com_showcase.ini zh-CN.plg-***.ini 等等。 6、templates 没说的,一种模板一个目录 7、library 最重要的目录之一了,下面都是重要的类文件,子目录结构对应类 名称,比如 jimport( 'joomla.environment.uri' ); 那么对应的是 joomla/environment/uri.hp 文件 其他的 cache,logs 目录就不说了,以后用的到。joomla 源代码探析(三) 万源之源
20:15 管理员 816 次点击 Tags: 探析源代码 joomla万源之源,这个名字非常有意思,老是让我想起小时候,玩的那种圆圆的 纸牌,在土地中玩的,用自己的纸牌把别人的打翻了就赢了别人的,大部分都是 纸壳剪的, 偶尔也有用油毡纸,或者石棉纸做的,通常把这种好的牌或者那种 连赢了几次的纸牌作为自己的镇家宝贝,在牌背面上写上“保家之宝”,也有 “宝家之宝”,我曾 经留了几张一直到高三毕业。哈哈哈!现在不知道去那里 了,也许父母还留着吧。 documentroot/index.php ,以及 template/***/index.php ,可以称为万源之 源,因为可以说所有的页面都是这两个文件的成果。 /index.php 是所有页面程序的起点,让我们来看看这个文件到底做了什么? define( '_JEXEC', 1 ); //标志这是一个跟文件define('JPATH_BASE', dirname(__FILE__) ); //取得 Document root,就是 /index.php 所在的绝对路径 define( 'DS', DIRECTORY_SEPARATOR ); // 定义目录分隔符 require_once ( JPATH_BASE .DS.'includes'.DS.'defines.php' ); //defines.php 定义了一些目录变量,以后详细的写 require_once ( JPATH_BASE .DS.'includes'.DS.'framework.php' ); //framework.php 是另一个非常重要的文件,在 framework.php 读入了 config.php 中定义的变量,同时 //framework 中引入了一些的基础类,例如 JFactory,JUser 等等 //全局对象,工厂类 JFactory,JFactory 符合设计模式中的工厂模式,基本生成 的对象大部分是单例模式,接下来我详细描述 JFactory,JFactory 在 /libraries/joomla/factory.php 中定义, $mainframe =& JFactory::getApplication('site'); //取得 JApplication 对象,JApplication 是一个工厂类,提供了一些指定对象 的生成,并提供了一系列的 api 函数 //application 初始化过程,设置语言,并缺的 editor 的设置,并生成 Juser 对象 $mainframe-&initialise(); //引入 system 组的插件 JPluginHelper::importPlugin('system'); // 触发初始化完毕后定义的 pluging 响应事件 $mainframe-&triggerEvent('onAfterInitialise'); //route()函数,根据 url 生成进行解析,设置 JRequest $mainframe-&route(); // authorization $Itemid = JRequest::getInt( 'Itemid'); $mainframe-&authorize($Itemid); //触发 route 后 plugin JDEBUG ? $_PROFILER-&mark('afterRoute') : $mainframe-&triggerEvent('onAfterRoute'); //根据 JRequest 的的 option 参数,dispatch 到那个组件,也就决定页面的内 容部分是那个组件生成 $option = JRequest::getCmd('option'); $mainframe-&dispatch($option); //触发 dispatch 后的 plugin JDEBUG ? $_PROFILER-&mark('afterDispatch') : $mainframe-&triggerEvent('onAfterDispatch'); //页面的渲染过程,生成整个页面 html $mainframe-&render(); // trigger the onAfterDisplay events JDEBUG ? $_PROFILER-&mark('afterRender') : $mainframe-&triggerEvent('onAfterRender'); echo JResponse::toString($mainframe-&getCfg('gzip')); 以上是 /index.php 的内容,从这个 index.php 的引出了几个重要的文件需要我 们去注意 /includes/defines.php /includes/framework.php /libraries/joomla/application.php /libraries/joomla/factory.php 接下来我们主要看看这些文件。 joomla 源代码探析(四) defines.php
20:42 管理员 599 次点击 Tags: 路径主要文件一个时候 其实这个文件没什么好说的,主要就是定义一些路径,贴出来,主要是以后文件 中提这些路径的时候,有一个印象 $parts = explode( DS, JPATH_BASE ); //Defines define( 'JPATH_ROOT', define( define( define( define( define( define( define( define( define(implode( DS, $parts ) );'JPATH_SITE', JPATH_ROOT ); 'JPATH_CONFIGURATION', JPATH_ROOT ); 'JPATH_ADMINISTRATOR', JPATH_ROOT.DS.'administrator' ); 'JPATH_XMLRPC', JPATH_ROOT.DS.'xmlrpc' ); 'JPATH_LIBRARIES', JPATH_ROOT.DS.'libraries' ); 'JPATH_PLUGINS', JPATH_ROOT.DS.'plugins' ); 'JPATH_INSTALLATION', JPATH_ROOT.DS.'installation' ); 'JPATH_THEMES' , JPATH_BASE.DS.'templates' ); 'JPATH_CACHE', JPATH_BASE.DS.'cache');这些路径在以后的文件中经常用到。 joomla 源代码探析(五) framework.php
17:12 xieyingwu 649 次点击 Tags: 文件这个引入下面基本 /include/framework.php 这个文件在 index.php 中是最早引入的文件之一,这 个文件主要实现了一些基本类的引入,下面我们逐一看一下: require_once( JPATH_LIBRARIES . DS . 'loader.php' ); //loader.php 是一 个载入类的基本工作,最重要的是 Jimport 比如 jimport( 'joomla.environment.response' ); 实际上就 include_once /libaries/jooma/environment/response.phprequire_once( JPATH_CONFIGURATION . DS . 'configuration.php' ); //引入 了 configuration.php jimport( 'joomla.base.object' ); jimport( 'joomla.environment.request' ); JRequest::clean(); //清空 Jrequest // System configuration $CONFIG = new JConfig(); //读取配置文件,生成 Jconfig 对象 if (JDEBUG) { jimport( 'joomla.utilities.profiler' ); $_PROFILER =& JProfiler::getInstance( 'Application' ); } 以上这段主要是如果配置处于 debug 状态,那么就生成$_PROFILER,这个对象主 要要用来,记录页面执行到某一节点的执行时间,内存状态调 试信息。jimport( jimport( jimport( jimport( jimport( jimport( jimport( jimport( jimport( jimport( jimport( jimport( jimport( jimport('joomla.environment.response' ); 'joomla.application.menu' ); //needs to be loaded later 'joomla.user.user'); 'joomla.environment.uri' ); 'joomla.factory' ); 'joomla.methods' ); 'joomla.html.html' ); //needs to be loaded later 'joomla.utilities.array' ); //needs to be loaded later 'joomla.utilities.error' ); 'joomla.utilities.utility' ); 'joomla.utilities.string' ); //needs to be loaded later 'joomla.filter.output' ); 'joomla.version' ); //needs to be loaded later 'joomla.event.*');这些引入的类中,比较重要的是 factory user menu ,需要仔细研究一下,其 他的用的时候,再仔细看文档就行啦, 当然,methods 也包含了很多基本的函数和类,尤其是需要了解 SEF 的时候。 接下来,我们将仔细看看/index.php 中 $mainframe =& JFactory::getApplication('site') 这句话到底完成了什么工作。Joomla 源代码解析(六) JDocument 类的几个常用的方法 在 google 搜索我的网站就会发现一些,因为没有注意 meta 和 title 所有的开 源项目相关的页面 title 和 meta 都一样,对用户很不友好,根本无法分清那个 链接是说什么内容的,那么这里就需要 JDocuement 类来解 决问题 用法很简单, 首先取得 document 对象 $document =& JFactory::getDocument(); 然后: $document-&setTitle(*****); $document-&setDescription(*****); //添加 meta $document-&addStyleSheet(*****) //添加 CSS 文件 $document-&addScript(*****) //添加 js 脚本 $document-&setLanguage(***) //设置语言文件 其他还有一些 setModifiedDate 等,其他基本就不常用了,记住这些就行啦! Joomla 源代码解析(七) JFactory 类
16:18 joomla 544 次点击 Tags: 返回实例调用这个数据 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 等就不在写了Joomla 源代码解析(八) JDatabase 类
16:33 joomla 549 次点击 Tags: 函数返回一个数据库数据 这是数据库 connector 类, 封装了与数据库操作的一系列操作。 目前有两个子 类, JDatabaseMysql,JDatabaseMysqli, 这个类为以后扩展到其他数据库留出了接口。 关于一些具体函数没有什么特殊的,基本对应 mysql 的函数的一些特征,对于这 个类应用基本都是首先 setquery ,然后 load 或者直接执行 executequery ,主要还是不要混淆 load 开头的几个函数的具体功 能: 1、loadObject 以对象的形式返回结果集的第一行数据 2、loadObjectList 对应上一个函数,返回一个对象的集合 3、loadResult 返回第一行的第一个字段或者 NULL 4、loadResultArray 返回某一字段的数据到一个数组中 5、loadRow 返回第一行数据,应该是数组形式 6、loadRowList 对应上一个函数,返回行数据的集合 还有一个函数很重要就是 setUTF ,这个函数决定了数据库能显示中文。Joomla 源代码解析(九) JUser 类
19:17 joomla 518 次点击 Tags: 用户信息相关函数程序 user 类处理所有程序中与用户交互的相关事情。 这个类的构造函数调用 load 函数,输入的参数是用户 id,可以初始化用户的相 关信息,这些信息包括 aid ,gid,usertype,username,name,id 等等,这些信息 在扩展中经常用到。 同时,在程序中,用刚刚说过的 getUser,取得当前登录用户实例。具体用法如 下: $user =& JFactory::getUser(); $userId = (int) $user-&get('id'); 根据 gid 可以判断用户的相关的组以及组权限。 了解了 Juser 类,还需要了解一下 JUserHelper 类,这个类包括了与用户活动 相关的几个函数,比如获得随机密码以及取得加密密码等。 同样 getUserId 根据用户名取得用户 ID 也是经常用到的。 Joomla 源代码解析(十) JPath JFile JFolder 类
19:54 joomla 584 次点击 Tags: 生成模块代码函数非常 这几个类都是 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[]=$ 文件拷贝 $sfile=$sourcepath.DS.'helper.php'; $data=JFile::read($sfile); $tfile = $targetpath.'/helper.php'; JFile::write($tfile,$data); $files[]=$ unset($data); 文件读取和写入 Joomla 源代码解析(十一) JHtml 类
11:00 管理员 546 次点击 Tags: 一个显示用到函数看看 JHtml 没有几个函数,但是在组成页面已经模板书写过程中经常用到,比如: JHTML::_('date', $this-&item-&date, JText::_('DATE_FORMAT_LC5')) 以及在后台管理中常用到的 来看看这几个函数: calendar 显示一个日历插件 date 显示格式化日期 iframe 插入一个 iframe image 插入一个图片 link 插入一个超链 以上是常用的函数,函数的以用方式就如例子。 Joomla 源代码解析(十二) JToolBarHelper JToolBar 类
11:09 管理员 426 次点击 Tags: 管理后台过程经常比如 这个两个类是后台管理过程经常用到的,比如: JToolBarHelper::title( 'generic.png' ); JText::_( '{{component}} Manager' ),JToolBarHelper::deleteList(); JToolBarHelper::editListX(); JToolBarHelper::addNewX(); 这几句就添加了三个按钮,添加,删除,修改 其实还有几个常用的 preview //预览 publish //发布 cancel //取消 比较常用的就这几个了,主要是在后台管理 toolbar 上的按钮。相关按钮的动作 对应后台管理的 task,相应的对做要在 controller 中生 命。 Joomla 源代码解析(十三) JText 类
11:22 管理员 422 次点击 Tags: 常用 Joomla 语言文件存储 Joomla 最常用的类之一,使用方式 JTEXT::_('JJJJJ') JJJJJ 对应语言文件中的相应字符串。 为了实现多语言这个是常用的。当然如果你以 utf-8 字符集存储 php 文件,对于 中文就不用考虑那么多了,不过不够规范骸 要是只是自己用,也无所谓啦,开发要快点。 呵呵!推荐还是用吧!Joomla 源代码解析(十四) JRequest 类
19:04 joomla 442 次点击 Tags: Joomla 提交信息得到 get 这是另一个 Joomla 扩展中最常用的类,这个类封装了客户端提交的请求相关的 信息, 通过这个类你可以得到用户提交的相关信息和数据, 有几个重要的 函数: 首先是 get($hash),我们看看部分源码就知道,get 得到什么了 switch ($hash) { case 'GET' : $input = $_GET; case 'POST' : $input = $_POST; case 'FILES' : $input = $_FILES; case 'COOKIE' : $input = $_COOKIE;
case 'ENV' : $input = &$_ENV; case 'SERVER' : $input = &$_SERVER; default: $input = $_REQUEST; } 我们通过 get('post') 等取得用户提交的数据数组。 还有 getVar ,取得某一 request 变量 getURI ,返回请求的 URI setVar 和 set 则对应着 getVar 和 get 在程序中使用的方式是:JRequest::getVar('','');Joomla 源代码解析(十五) 组件是如何被调用并渲染的
20:32 joomla 566 次点击 Tags: 渲染调用组件 Joomla 我们 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.$nam e); 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 $ $contents = ob_get_contents(); ob_end_clean(); 这部分代码就是包含了组件的开始文件,而这个文件,我们在组件开发的时候用 到的。这个文件引入了 controller 文件,并根据 task 决定进入那个分支。 再深入下去就是组件的整个生成过程,以后再看了。 Joomla 源代码解析(十六) JTable 是什么
21:58 joomla 584 次点击 Tags: 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 等,具体还是需要用的时候看看源代码吧。 Joomla 源代码解析(十七) JModel 是什么
00:00 joomla 458 次点击 Tags: 数据 JModelMVC 对于我们 我们经常提到 MVC 模式,JModel 在 Joomla 的 MVC 组件中是重要的一个环节, JModel 是 MVC 中的数据视图层,我们需要明白的是 JModel 不同于 JTable,数 据视图是由一个或者几个 table 构成,或者多条数据记录构成的数据集合,以及 数据集合的相关操作,对于 JModel 我们不必了解太多的具体函数,在组件开发 过程中, 通常都要继承 JModel, 在子类中完成数据集合的生成以及相关的操作, 保存,删除。 我个人倾向对于几个表之间的数据完整性,要在 JModel 中验证,而对于单一表 的数据完整性要通过 JTable check 函数完成。 同事对于那些有逻辑操作的验证则最好在 MVC 的 controller 层完成。 接下来,我们要看看 MVC 中的 View 和 Control Joomla 源代码解析(十八) Jview
14:46 管理员 421 次点击 Tags: 需要扩展桥梁组件自己 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 子类都要继承这个。 Joomla 源代码解析(十九) JController
14:52 管理员 443 次点击 Tags: 看看我们流向提交数据 同样 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 ,其余函数用到再看就可以了。 Joomla 源代码解析(二十) MVC 组件的执行
15:16 joomla 453 次点击 Tags: 组件 controller 文件我们这个 以前的文章中, 我们曾经说过 $mainframework-&dispatch 是如何最终调用组件 的, 通过这个 dispatch, 最终 include 相应组件目录下的 组件名称.php 文件, 现在我们来看看,这个文件是怎么按部就班的联系了 MVC 模式相关的各个文件。 require_once (JPATH_COMPONENT.DS.'controller.php'); // Require specific controller if requested if($controller = JRequest::getVar('controller')) { require_once (JPATH_COMPONENT.DS.'controllers'.DS.$controller.'.php'); } // Create the controller $classname = 'HelloController'.$ $controller = new $classname( ); // Perform the Request task $controller-&execute( JRequest::getVar('task')); // Redirect if set by the controller $controller-&redirect(); 其实就是根据 request 提交的 controller 参数, 创建相应的 JController 对象, 然后由 controoler 对象执行相应的任务。 这样我们就完全理解了,一个组件是如何被调用,MVC 组件是如何执行,并最后 返回 html 代码的。 Joomla 源代码解析(二十一) 模块是如何被调用执行并渲染?
15:44 joomla 440 次点击 Tags: 我们执行组件 module 页面 以前的文章中,关于/index.php 我们已经分析完了 $mainframe-&dispatch()是 引入了组件,并被执行。我们知道对于 Joomla,一个页面只能有一个或者 0 个 组件,而上,下左右 的碎片都是 module,module 是页面丰富的有效补充。比如 我们知道菜单是 mod_mainmenu,而 footer 是 mod_footer 等等, 那么这些 module 是怎么被引入的,并最后执行的? 秘密都在$mainframe-&render()这个函数上, 我们看看这个函数都做了什么工作。 以下是 JSite 的 render 函数的内容 $document =& JFactory::getDocument(); $user =& JFactory::getUser(); // get the format to render $format = $document-&getType(); switch($format) { case 'feed' : { $params = array(); } case 'html' : default : { $template = $this-&getTemplate(); $file = JRequest::getCmd('tmpl', 'index'); if ($this-&getCfg('offline') && $user-&get('gid') & '23' ) { $file = 'offline'; } if (!is_dir( JPATH_THEMES.DS.$template ) && !$this-&getCfg('offline')) { $file = 'component'; } $params = array( 'template' =& $template, 'file' =& $file.'.php', 'directory' =& JPATH_THEMES ); } } $data = $document-&render( $this-&getCfg('caching'), $params); JResponse::setBody($data); 其实重要的部分是引入了相应的模板文件(template/***/index.php),并调用 了 JDocumentHtml 的 render 函数。 看到这里,我们终于明白了,模板的 index.php 原来是这个时候被引入的。 我们再看看 JDocumentHtml 的 render 函数。 这个函数中最重要的两句程序是 $data = $this-&_loadTemplate($directory.DS.$template, $file); 载入模板 文件 $data = $this-&_parseTemplate($data); 解析模板 再继续看看解析模板是什么过程: $replace = array(); $matches = array(); if(preg_match_all('#&jdoc:include\ type=&([^&]+)& (.*)\/&#iU', $data, $matches)) { $matches[0] = array_reverse($matches[0]); $matches[1] = array_reverse($matches[1]); $matches[2] = array_reverse($matches[2]); $count = count($matches[1]); for($i = 0; $i & $ $i++) { $attribs = JUtility::parseAttributes( $matches[2][$i] ); $type = $matches[1][$i]; $name = isset($attribs['name']) ? $attribs['name'] : $replace[$i] = $this-&getBuffer($type, $name, $attribs); } $data = str_replace($matches[0], $replace, $data); } return $ } 对了,就是这部分,对模板中 JDOC 标签进行了解析,获得了相应的 module 名 称和参数,并调用 getBuffer 函数执行。 至此 调用 $renderer-&render($name, $attribs, $result); Joomla 源代码解析(二十二) 模块是如何被调用执行并渲染(下)
16:00 joomla 391 次点击 Tags: 函数调用这个对象看看 上一文章中提到了 getBuffer 函数,在函数中实际上调用了 render ,这个对象 是 JDocumentRendererModule 类的实例,我们看看 JDocumentRendererModule 的 render 函数。 if (!is_object($module)) { $module =& JModuleHelper::getModule($module); if (!is_object($module)) { if (is_null($content)) { return ''; } else { /** * If module isn't found in the database but data has been pushed in the buffer * we want to render it */ $tmp = $ $module = new stdClass(); $module-&params = $module-&module = $ $module-&id = 0; $module-&user = 0; } } } // get the user and configuration object $user =& JFactory::getUser(); $conf =& JFactory::getConfig(); // set the module content if (!is_null($content)) { $module-&content = $ } //get module parameters $mod_params = new JParameter( $module-&params ); $contents = ''; if ($mod_params-&get('cache', 0) && $conf-&getValue( 'config.caching' )) { $cache =& JFactory::getCache( $module-&module ); $cache-&setLifeTime( $mod_params-&get( 'cache_time', $conf-&getValue( 'config.cachetime' ) * 60 ) ); $cache-&setCacheValidation(true); $contents = $cache-&get( array('JModuleHelper', 'renderModule'), array( $module, $params ), $module-&id. $user-&get('aid', 0) ); } else { $contents = JModuleHelper::renderModule($module, $params); } 这段代码完成了找到对应的 module ,和 helper 文件,兑取参数,并最后由 'JModuleHelper'执行,并渲染。 至此,我们也完全了解了模板是如何被调用,模块是如何并调用并渲染的。 joomla 源代码探析(二十三) 完结篇
11:50 joomla 438 次点击 Tags: 还是 Joomla 支持那个一直 到此为止,我们基本上了解了 Joomla 重要的类以及整体的框架。在第三篇中我 写了一个万源之源,在完结之篇中,一直想不到用那个词合适,不过我想 还是 应该说一句什么。 还是:支持开源,支持 Joomla!源代码探析续(二十四) joomla 源代码探析续(二十四)JPagination 类JPagination 类是 Joomla 的通用分页功能的封装类,从 RC3 开始一直存在一些问题,目前的 版本大的问题都解决了,但是 sef 开启的状态下,可能 url 还存在一些问题,至少我的站点 是这样的。源代码中的类函数与英文文档中的略有不同,暂时以源代码中的为准。 __construct 构造函数 这个构造函数有三个参数: $total 是集合中记录总数 $limitstart 是当前页的第一个记录在集合中的顺序号 $limit 每页的显示总数 使用的例子 $pageNav = new JPagination( $total, $limitstart, $limit )getLimitBox 生成一个下拉列表,下拉列表可以改变每页显示的记录数 getPagesCounter 当前页 1 总共 3 页,这样的文字 getPagesLinks 生成页码列表 , 最先 前一个 1 2 3 下一个 最后 getListFooter 生成分页页脚,包括以上三项 马上就要用到分页的部分了,随后找个源代码探析续(二十五) joomla 源代码探析续(二十五)JRequest 对象的变量获取过程Joomla 1.5 RC3 版本的 SEF 存在不少问题,前段时间架站的时候曾经仔细看过这部分,昨天 做 apache 转向的时候,突然发现又都忘记了,再回忆一次,记录下来。 /index.php 中$mainframe-&route(); 这一函数中实现了从 URI 中获取相关参数并填充到 JRequest 中,我们来看看这个函数的实现过程。 这个函数的代码清单如下: function route() { // get the full request URI $uri = clone(JURI::getInstance()); $router =& $this-&getRouter(); $result = $router-&parse($uri); JRequest::set($result, 'get', false ); } 可以看到,首先克隆了一个 JURI,然后$router-&parse($uri),实现了 uri 的解析,返回的数组 结果填充到了 JRequest 中。 先简略看一下 JURI::getInstance() ,代码在 enviroment/uri.php 中,这里略过了。代码大体 的实际就是兼容了 apache 与 IIS,组成完成的 URL 路径,传递给 JURI 的构造器,最终生成 JURI 对象作为返回结果。 接着我们来看看$result = $router-&parse($uri) 实现了什么,以下是 JRouterSite 的 parse 函数的 代码清单: function parse(&$uri) { $vars = array(); // Get the path $path = $uri-&getPath(); //Remove the suffix if($this-&_mode == JROUTER_MODE_SEF) { // Get the application $app =& JFactory::getApplication(); if($app-&getCfg('sef_suffix') && !(substr($path, -9) == 'index.php' || substr($path, -1) == '/')) { if($suffix = pathinfo($path, PATHINFO_EXTENSION)) { $path = str_replace('.'.$suffix, '', $path); $vars['format'] = $ } } } //Remove basepath $path = substr_replace($path, '', 0, strlen(JURI::base(true))); //Remove prefix $path = str_replace('index.php', '', $path); //Set the route $uri-&setPath(trim($path , '/')); $vars += parent::parse($uri); return $ } 这段代码实际就是去掉了路径中的 index.php 以及在 SEF 开启的状态下的后缀,并调用父类 JRouter 的 parse 函数。 JRouter 的 parse 函数代码清单如下: function parse(&$uri) { $vars = array(); // Process the parsed variables based on custom defined rules $vars = $this-&_processParseRules($uri); // Parse RAW URL if($this-&_mode == JROUTER_MODE_RAW) { $vars += $this-&_parseRawRoute($uri); } // Parse SEF URL if($this-&_mode == JROUTER_MODE_SEF) { $vars += $vars + $this-&_parseSefRoute($uri); } return array_merge($this-&getVars(), $vars); } 我们来看看关键的两个函数,因为不会同时发生,我们只来看看 $this-&_parseSefRoute($uri) 函数。以下是 JRouterSite 的_parseSefRoute 方法代码清单: function _parseSefRoute(&$uri) { $vars = array(); $menu =& JSite::getMenu(true); $route = $uri-&getPath(); //Handle an empty URL (special case) if(empty($route)) { $item = $menu-&getDefault(); //Set the information in the request $vars = $item-& //Get the itemid $vars['Itemid'] = $item-& // Set the active menu item $menu-&setActive($vars['Itemid']); return $ } //Get the variables from the uri $vars = $uri-&getQuery(true); /* * Parse the application route */ if(substr($route, 0, 9) == 'component') { $segments = explode('/', $route); $route = str_replace('component/'.$segments[1], '', $route); $vars['option'] = 'com_'.$segments[1]; $vars['Itemid'] = } else { //Need to reverse the array (highest sublevels first) $items = array_reverse($menu-&getMenu()); foreach ($items as $item) { $lenght = strlen($item-&route); //get the lenght of the route if($lenght & 0 && strpos($route.'/', $item-&route.'/') === 0 && $item-&type != 'menulink') { $route = substr($route, $lenght); $vars['Itemid'] = $item-& $vars['option'] = $item-& } } } // Set the active menu item if ( isset($vars['Itemid']) ) { $menu-&setActive( $vars['Itemid'] ); } //Set the variables $this-&setVars($vars); /* * Parse the component route */ if(!empty($route)) { $segments = explode('/', $route); array_shift($segments); // Handle component route $component = preg_replace('/[^A-Z0-9_\.-]/i', '', $this-&_vars['option']); // Use the component routing handler if it exists $path = JPATH_BASE.DS.'components'.DS.$component.DS.'router.php'; if (file_exists($path) && count($segments)) { //decode the route segments $segments = $this-&_decodeSegments($segments); require_once $ $function = substr($component, 4).'ParseRoute'; $vars = $function($segments); $this-&setVars($vars); } } else { //Set active menu item if($item =& $menu-&getActive()) { $vars = $item-& } } return $ } 这段代码比较长,不详细分析了,实际上首先做了菜单项的比较,然后接着调用 $uri-&getQuery(true)返回 query 中的所 有名称/值对,接着在合适的条件下调用相应组件下 的 router.php 中对应路径解析函数,比如对于 content,就是 com_content /router.php 的 ContentParseRoute 函数,最终整个函数生成了包含 option,view,layout 等在内的散列数组并 返 回。 返回的数据经过 merge 后,返回给 JRequest::set($result, 'get', false ) 至此全部的参数数值就写入到 JRequest 中了,注意这里只是 'get'方式传递的参数,不包括 post 方式提交的数据。源代码探析续(二十六) joomla 源代码探析续(二十六)JUser 对象和用户权限判断每一个访问 Joomla 网站的用户都对应这一个 JUser 对象, 通过$user =& JFactory::getUser() 就 可以获得这个对象引用并访问对象的成员函数和属性。 下面的代码就是显示用户的名称,邮件的一段代码: echo & Your name is {$user-&name}, your email is {$user-&email}, and your username is {$user-&username} &; echo & Your usertype is {$user-&usertype} which has a group id of {$user-&gid}. &;我们来看看 JUser 的属性和成员函数: id - 用户唯一编号 name - 姓名 username - 帐号 email - 邮件 password - 密码 password_clear - 用户修改密码的时候设置真 usertype - 用户类型(Super Administrator, Editor) gid - 用户的类型 id ,与 usertype 对应 block - 是否被阻止,如果阻止就设为 1 registerDate - 注册日期 lastvisitDate - 最后一次登录日期 guest - 如果用户未登录就设置为 1,其他以上的字段都设置为空 以上的属性都可以直接访问,如果想获取数据库中其他的参数,可以通过 getParam 函数来 获得,下面的代码获取的用户的语言参数: $user =& JFactory::getUser(); $language = $user-&getParam('language', 'the default'); echo & Your language is set to {$language}. &; 通常判断用户是否登录都是通过 guest 来判断的,当然通过 id 是否大于 0 也可以。 用户访问权限 不同的 Joomla 用户可能会有不同的权限,可以通过 authorize()成员函数来判断一个用户是 否具有执行某项任务的权利。authorize()有四个参数,第一个是我们要验证组件或者函数, 第二个 是任务, 第三, 四个分别是记录类型 record types 和 ownership respectively 相对关系, (英文很清晰,中文怎么这么难懂) 。 libraries/joomla/user /authorization.php 文件中包含了所有的用户权限项。我们来看下面的代 码: $user =& JFactory::getUser(); if ($user-&authorize('com_content', 'edit', 'content', 'all')) { echo & You may edit all content. &; } else { echo & You may not edit all content. &; } if ($user-&authorize('com_content', 'publish', 'content', 'own')) { echo & You may publish your own content. &; } else { echo & You may not publish your own content. &; } 上面的第一段代码就是判断用户是否可以编辑所有的文章, 第二段则是判断是否可以发布自 己的文章。 如果你自己开发了扩展,标准的权限也许并不合适你,那么你还可以添加自定义的权限项。 以下是添加权限的代码例子: $auth =& JFactory::getACL(); $auth-&addACL('com_userinfo15', 'persuade', 'users', 'super administrator'); $auth-&addACL('com_userinfo15', 'persuade', 'users', 'administrator'); $auth-&addACL('com_userinfo15', 'persuade', 'users', 'manager'); $user =& JFactory::getUser(); if ($user-&authorize('com_userinfo15', 'persuade')) { echo & You may persuade the system to do what you wish. &; } else { echo & You are not very persuasive. &; } 在我们自己的扩展中,进入组件或者插件的前部,就写如这样的代码,就可以判断是否有访 问和执行某项任务的权限了。源代码探析续(二十七) joomla 源代码探析续(二十七)组件后台如何设置参数以下的方法可以在管理后台中添加一个 Parameters 设置的按钮,点击按钮可以设置这个组 件的相关参数,当修改这些参数后,参数保存在 component 表中。 首先要创建一个 XML 配置文件,文件中包含了相关参数,这个参数文件保存在后台管理界 面相应组件中的 config.xml 中。 比如文章/administrator/components/com_content/config.xml. 假设我们的评论组件的 xml 安装文件如下: m& Hide Show 配置文件定义了一个参数 show_name。 接下来采用下面的代码就可以定义一个相应组件的按钮: JToolBarHelper::preferences( 'com_gcomment' ); 这样就完成了后台管理参数设定的界面。 在组件中,刚才配置的参数可以这样访问: $params = &$mainframe-&getParams(); $show_loginname = $this-&params-&get( 'show_loginname' );源代码探析续(二十八) joomla 源代码探析续(二十八) 如何扩展 JTable 类JTable 类是 Active Record 设计模式(web 应用中应用最为广泛,最为简单的数据库相关的设 计模式,笔者)的实现。JTable 在 joomla 与数据库交互过程中广泛的使用。要使用 JTable, 首先要创建一个 JTable 的子类。下面是我们的一个例子:defined('_JEXEC') or die(); class TableRecipes extends JTable { var $id = var $ingredients = var $instructions = var $serves = var $difficulty = var $prep_time = var $cook_time = var $published = 0; function __construct(&$db) { parent::__construct( '#__recipes', 'id', $db ); } } JTable 的子类命名前缀是 Table,然后就是首字母大写的表名,类中的成员变量对应着数据库 中的字段名,默认值与表中的字段默认值应该相同。加入字段默认是 NOT NULL,那就不能 采用 'null'作为成员变量的默认值。 最后是类的构造器, 构造器的参数是当前数据库的引用, 子类的构造器调用 JTable 的构造器, 父类的构造器有三个输入参数,第一个参数是表名,第二个是主键,第三个是当前数据库的 链接。加入以上的类应用在 Recipes 组件上,那么代码应该放在/administrator/components /com_recipes/tables/recipes.php.文件中。如何使用 JTable 扩展 为了使用 JTable 扩展,要首先在组件的代码中引入,下面一行是引入代码: JTable::addIncludePath(JPATH_ADMINISTRATOR.DS.'components'.DS.'com_recipes'.DS.'tables'); 用下面的代码,可以获得 JTable 扩展类的对象。 $row =& JTable::getInstance('recipes', 'Table'); 请注意全小写的类名作为第一个参数, 'Table'作为第二个参数, 而 getInstance 函数返回 JTable 的引用。 在 model 类(组件的 JModel 扩展)中可以可以采用以下代码获得 JTable 扩展的实例。 $row =& $this-&getTable('recipes');添加和更新数据记录 通常情况下,用户在客户端通过 html form 提交数据,而 JRequest 可以协助获得这些数据, 用 JRequest::get('post')可以获得 HTTP POST 方式提交的数组,获得的数组可以传递给 bind 函数。bind 函数将 post 中对应内容自动绑定到相应名称的成员变量,请看下面的例子: if (!$row-&bind( JRequest::get( 'post' ) )) { return JError::raiseWarning( 500, $row-&getError() ); } 注意上面代码中的 JError::raiseWarning,JError::raiseWarning 在 bind 方法出错的时候停止执 行, getError()可以得到 JTable 对象 bind 出错的返回信息。 如果绑定成功, 接下来调用 store() 函数。 if (!$row-&store()) { JError::raiseError(500, $row-&getError() ); } 如果 JTable 对象的任何成员变量为空,这些变量被默认忽略,这样可以更新指定字段,如 果需要每个字段都有值,可以在 store()函数中加上参数 'true',bind 函数不检查数据类型,如 果你要保证数据完整性,请在保存数据前程序代码中检查一下。 JTable 读取数据 如果要用 JTable 加载表中指定一行,传递主键给 load 成员函数。以下是代码: $row-&load( $id ); JTable 删除数据 下面是代码是删除例子,删除指定的数据,要用 delete 函数。 $row-&delete( $id ); 如果要一次删除多行数据,你需要手动写 query 语句。源代码探析续(二十九) joomla 源代码探析续(二十九) JHTML 与 JHTMLSelect 类的使用我们在 form 表单生成的过程中,经常需要有 select 标签或者 radio 标签,这 点上 Joomla!也给我们提供了方便的接口 JHTMLSelect 。 JHTMLSelect 的函数可以分为两类: 第一类是选项设置,包括:option,optgroup,我们来看看 option, option( $value, $text='', $value_name='value', $text_name='text', $disable=false ) 函数返回一个包含待选项必要信息的示例,必要的信息包括: $value:返回值 $text:显示文本 $value_name:值名称 $text_name: 文本名称 第二类函数就是根据已经设置的选项生成 html 标签代码,主要有: 1、booleanlist 生成 yes,no 两个选项的 radio button,返回值为 1 或 0 2、integerlist 生成一系列数字的 select 标签 3、 genericlist 根据设置的 options 生成 select 标签 4、radiolist 根据设置的 options 生成 radios 标签 我们来直接看示例代码: $html = JHTML::_('select.booleanlist', 'state', '', true); echo '1:'.$html.''.'';$sections = array(); $sections[] = JHTML::_('select.option', '-1', '- '.JText::_('Select Section').' -', 'id', 'title'); $sections[] = JHTML::_('select.option', '0', JText::_('Uncategorized'), 'id', 'title'); $html = JHTML::_('select.genericlist', $sections, 'sectionid', 'class=&inputbox& size=&1& ', 'id', 'title', 0); echo '2:'.$html.''.'';$html = JHTML::_('select.integerlist',1,10,1,'name','',5); echo '3:'.$html.''.''; $myoptions = array(); $myoptions[] = JHTML::_('select.option', '1','en'); $myoptions[] = JHTML::_('select.option', '2', 'ch'); $html = JHTML::_('select.radiolist', $myoptions,'language'); echo '4:'.$html.''.''; ?& 测试方法: 在 compontents/com_test/建立一个 test.php 在首页运行 http://localhost/Joomla_1.5.14-StableFull_Package/index.php?option=com_test: Joomla!这点上确实提供了太多方便,你根本不必了解 html 代码了。源代码探析续(三十) joomla 源代码探析续(三十) JDate 类参考 JDate 类与 JString 类一样是 Joomla!中的基础类,Joomla! core 中的大部分日 期都用到了相关的函数。JDate 的构造函数有两个参数,一个是$date,一个是 $tzOffset,前者是时间,默认是当前值,$date 可以有三种形式,RFC 822, ISO 8601,unix time stamps,而$tzOffset 是时区偏移,比如中国应该是 8,默认 值是全局配置中你设置的参数.创建一个 JDate 对象很方便: $mdate = new JDate(); $mdate =new JDate($row-&created, $tzoffset); JDate 的常用函数: toFormat($format = '%Y-%m-%d %H:%M:%S') toISO8601() 输出的格式是 Y-m-d\TH:i:sP toMySQL() 输出格式 Y-m-d H:i:s toRFC822() 输出格式 D, d M Y H:i:s O 格式定义请参考 php 在生成 atom 的时候用到比较多源代码探析续(三十一) joomla 源代码探析续(三十一) JHTML 类常用的方法我曾经在几篇文章中涉及到 JHTML 的方法使用,这里不再说了,请看相关的文章。 Joomla!中如何使用 switcher.js 实现一个位置上 div 层的切换显示 Joomla!用 caption.js 自动显示图片的简短描述 如何在 Joomla! 1.5 管理后台中实现滑动分页效果 在 Joomla!中怎样使用日历部分 behavior.calendar 在 Joomla!中使用弹出提示 (Tooltip)教程 这里主要说一下几个没提到的函数: script($filename, $path = 'media/system/js/', $mootools = true) 在页面中加上''元素,默认 js 脚本的路径在 media/system/js/下,并且默认会自动加载 mootools 的 js 包。 stylesheet($filename, $path = 'media/system/css/', $attribs = array()) 在页面引入 CSS。 date($date, $format = null, $offset = NULL) 在页面显示日期, 格式默认是 语言文件中定义的 DATE_FORMAT_LC1, 其实你可以在 zh-CN.ini 中添加自己的日期格式。通常这样使用: echo JHTML::_('date', 'now', JText::_('DATE_FORMAT_LC2')); echo JHTML::_('date', $row-&created, '%Y-%m-%d %H:%M:%S'); function iframe( $url, $name, $attribs = null, $noFrames = '' ) 在页面中添加一个 iframe function image($url, $alt, $attribs = null) 在页面中添加 image echo JHTML::_('image','http://www.maycode.com/images/logos/subscribe_google.gif','testalt','width= 300'); function link($url, $text, $attribs = null) 在页面中添加标签 echo JHTML::_('link','http://www.maycode.com/','test');Joomla 插件开发规范概述:JPlugin Joomla 1.5 的新功能 为了更好使 Joomla 符合面向对象的框架,引入了 JPlugin。Plugins 是依附于全局事件分派系 统的观察者类。这就意味无论是 Joomla 核心,还是第三方组件,模块都能触发一个或多个 JPlugins 来执行一些功能。这与 mambot 并不完全相同。虽然 mambot 与 plugin 都是事件触 发并执行代码,但是 mammot 需要全局范围的声明,而 JPlugin 是一个类,事件处理函数能 有自己的变量和私有的 helper 方法,这是整个事件处理系统更加清晰。2. 实现 JPlugin 系统的实现是一个观察者模式。有两部分,一部分是观察者(JPlugin) ,另一部分是 被观察者(JEventDispatcher)2.1 JPlugin 类 部分代码如下: /** * JPlugin Class * * @author Louis Landry &
为防备电子邮件地址收集器,这个 E-mail 地 址被隐藏,你的浏览器必须支持 Javascript 才可看到这个邮件地址 & * @package Joomla.Framework * @subpackage Application * @since 1.5 */ class JPlugin extends JObserver { /** * Constructor * * For php4 compatability we must not use the __constructor as a constructor for plugins * because func_get_args ( void ) returns a copy of all passed arguments NOT references. * This causes problems with cross-referencing necessary for the observer design pattern. * * @param object $subject The object to observe * @since 1.5 */ function JPlugin(& $subject) { parent::__construct($subject); } /** * Method to map events to handler methods * * @access public * @param array Arguments * @return mixed Routine return value * @since 1.1 */ function update(& $args) { /* * First lets get the event from the argument array. Next we will unset the * event argument as it has no bearing on the method to handle the event. */ $event = $args['event']; unset($args['event']); /* * If the method to handle an event exists, call it and return its return * value. If it does not exist, return a boolean true. */ if (method_exists($this, $event)) { return call_user_func_array(array($this, $event), $args); } else { } } } 2.1.1 详细设计 两个重要的部分使这个类得以运行 一个是构造器,在构造函数中做了以下操作: // 注册观察者 $subject-&attach($this); // 设置观察目标 $this-&_subject = & $ 这样就将 JPlugin 与被观察者建立了联系,所有的 plugin 都观察 JEventDispatcher 对象 第二个重要的就是 update 方法,这个方法传递给触发器一个数组,数组有两个参数,事件 和参数。一旦 update 方法接收到数组,那么它 提出事件,并清除数组.接下来调用数组传 递来的 ‘event’ 方法,返回结果。3. 第三方使用 例程: /** * @version $Id: $ * @package * @subpackage * @copyright * @license */ jimport('joomla.plugin');/** * Example Plugin * * @author * @package * @subpackage * @since */ class ExamplePlugin extends JPlugin { /** * Constructor * * @param object $subject The object to observe * @since 1.1 */ function ExamplePlugin(& $subject) { parent::__construct($subject); } /** * This method handles the onIncrement event. It takes an integer input and * increments its value. * * @access public * @param int $input An integer to increment * @return int Incremented integer * @since 1.1 */ function onIncrement($input) { return $input++; } } ?& 如你所见,创建 JPlugin 非常简单,就是继承 JPlugin 类,并写一个你要处理事件的方法。[翻译] Joomla XML 解析器规范 上 翻译]概述 Joomla! 1.5 新增 JSimpleXML 类, 可以更为简单的读取 xml 文件, 但是现在还不能修改 CDATA 或或者属性,也不支持 XPath. JSimpleXML 需要 PHP 4.2 以上版本,以及 Expat 扩展。2. 实现 JSimpleXML 类代码:class JSimpleXML extends JObject { /** * Document element * * @var object */ var $document = /** * Interprets a string of XML into an object * * This function will take the well-formed xml string data and return an object of class * JSimpleXMLElement with properties containing the data held within the xml document. * If any errors occur, it returns FALSE. * * @param string Well-formed xml string data * @param string currently ignored * @return object JSimpleXMLElement */ function loadString($string, $classname = null) { $this-&_parse($string); } /** * Interprets an XML file into an object * * This function will convert the well-formed XML document in the file specified by * filename to an object of class JSimpleXMLElement. If any errors occur during file * access or interpretation, the function returns FALSE. * * @param string Path to xml file containing a well-formed XML document * @param string currently ignored * @return object JSimpleXMLElement */ function loadFile($path, $classname = null) { //Get the XML document loaded into a variable $xml = file_get_contents($path); $this-&_parse($xml); } /** * Get the parser * * @access public * @return resource XML parser resource handle */ function getParser() { return $this-&_ } /** * Set the parser * * @access public * @param resource XML parser resource handle */ function setParser($parser) { $this-&_parser = $ } } 3. 使用 正如其名,JSimpleXML 使用起来非常简单。你可以参考 php5 的 SimpleXML 文档,机关本质 上两者有些不同,但是使用上是基本兼容的。 来看一个 xml 文档的例子(example.xml)Ms. Coder Onlivia ActoraMr. Coder El Act?rSo, this language. It's like, a programming language. Or is it a scripting language? All is revealed in this thrilling horror spoof of a documentary. 7 5 2.1 开始 首先要载入 xml 文档,在本例中我们要载入 example.xml,JSimpleXML loadFile 方法载入相应 文件的 xml 格式数据。loadFile 其实使用 file_get_contents()方法读取文件,并把被荣传递给 解析器。 //Create a JSimpleXML object $xml = new JSimpleXML(); //Load the xml file $xml-&loadFile($file); ?& XML 解析器在解析文档时候发生错误会触发 JError,如果没有任何错误,就会继续进行。 JSimpleXML 的对象结构是直接了当的, 文档的根包含在内。 也就是说上例中$xml-&document 是根。$xml-&document-&movie[0]是第一个 movie 标签$xml-&document-&movie 是一个数组, 而不是 JSimpleXMLElement 对象。1.5―― ――JDocument joomla 1.5――JDocument 类用法文档类,提供一个容易的接口解析和显示文件 Method Description __construct 构造函数 addScript 增加一个连接到页 addScriptDeclaration 增加脚本到页 addStyleDeclaration 增加一个 stylesheet 声明到页 addStyleSheet 增加一连接的 stylesheet 到页 getBase 返回本文的基本 URI getBuffer 得到本文缓冲的内容 getCharset 返回本文 charset 内码 getDescription 返回页的标题 getDirection 返回文件语言 getGenerator 返回文档创建者 getHeadData 得到本文头数据 getInstance 返回在全局 JDocument 对象 getLanguage 得到语言. getLink 得到文档的 URL getMetaData 得到 meta 标签 getTitle 得到文档标题 getType 得到文档类型 loadRenderer 随机装载 render 输出文档 setBase 设置文档的 e 基本 URI setBuffer 设置本文缓冲的内容 setCharset 设置本文 charset setDescription 设置本文的描述 setDirection 设置全局文件声明。 缺省左到右(ltr)。 setGenerator 设置文本创建者 setHeadData 设置文本头信息 setLanguage 设置语言. setLineEnd 设置线结尾样式对 Windows、Mac、Unix 或者自定义串。 setLink 设置文档链接 setMetaData 设置 metai 标签 setMimeEncoding 设置被送到浏览器的本文 MIME 内码 setModifiedData 定本文修改过的日期 setTab 设置串被用于内嵌 HTML setTitle 设置文档标题 setType 设置文档类型. 方法应用: addScript() 意义:增加一个连接到页 语法:void addScript (string $url, [string $type = &text/javascript&]) string $url: URL to the linked script string $type: Type of script. Defaults to 'text/javascript' 实际应用: $temp =& Jfactory::getDocument(); $temp-&addscript(JURI::base().'includes/js/overlib_mini.js'); 结果:在 head 部分插入一段 jsaddScriptDeclaration() 意义:增加脚本到页头 语法:void addScriptDeclaration (string $content, [string $type = 'text/javascript']) string $content: Script string $type: Scripting mime (defaults to 'text/javascript') 实际应用: $temp =& Jfactory::getDocument(); $script = &alert( 'A script has been added to the page!' );&; $temp-&addScriptDeclaration($scirpt);getBase() 意义:返回本文的基本 URI 语法:string getBase () 实际应用: $temp =& Jfactory::getDocument(); echo $temp-&getBase();getBuffer() 意义:得到本文缓冲的内容 语法: getBuffer () 实际应用: $temp =& Jfactory::getDocument(); echo $temp-&getBuffer();getInstance() 意义:返回在全局 JDocument 对象 语法:object The &getInstance ([type $type = 'html'], [ $attributes = array()]) type $type: The document type to instantiate $attributes 实际应用: $temp =& Jfactory::getDocument(); $temp-&getInstance('html'); //生成 jdocumenthtml 对象. $temp-&getInstance('error');//生成 jdocumenterror 对象. $temp-&getInstance('feed');//生成 jdocumentfeed 对象.setBuffer() 意义:设置本文缓冲的内容 语法:void setBuffer (string $content) string $content: The content to be set in the buffer 实际应用: $temp =& Jfactory::getDocument(); echo $temp-&setBuffer();setDirection() 意义: 设置全局文件声明。 缺省左到右(ltr)。 语法:void setDirection ([ $dir = &ltr&], string $lang) string $lang $dir 实际应用: $temp =& Jfactory::getDocument(); echo $temp-&setDirection();setGenerator() 意义: 设置文本创建者 语法:void setGenerator (string $generator) string $generator 实际应用: $temp =& Jfactory::getDocument(); echo $temp-&setGenerator();setHeadData() 意义: 设置文本头信息 语法:void setHeadData (array $data) array $data: The document head data in array form 实际应用: $temp =& Jfactory::

我要回帖

更多关于 nginx load module 的文章

 

随机推荐