本文依照 Joomla! 1.5 Stable 版本的安装程序写作,文中所引用代码均来自实际程序文件。
我们从安装程序入口文件 /installation/index.php 开始。
1. 常量定义
index.php 文件起始处定义了若干常量:
define( '_JEXEC', 1 );define( 'JPATH_BASE', dirname( __FILE__ ) );define( 'DS', DIRECTORY_SEPARATOR );
_JEXEC 是一个标志量,表示程序正常启动(通过合法入口 /index.php 访问)。Joomla! 在其他所有的 .php 程序起始处,均通过执行以下代码,阻止直接访问非入口程序的请求,这是出于安全的考虑:
// no direct accessdefined( '_JEXEC' ) or die( 'Restricted access' );
JPATH_BASE 顾名思义,是指安装程序的根目录,注意它与 PHP 预定义变量 $_SERVER['DOCUMENT_ROOT'] 的区别,后者是当前的 www 虚拟主机在文件系统中的根目录,它是前者的上级目录。__FILE__ 是 PHP 的魔术常量之一:
名称 说明
__LINE__ 文件中的当前行号。
__FILE__ 文件的完整路径和文件名。如果用在包含文件中,则返回包含文件名。自 PHP 4.0.2 起,__FILE__ 总是包含一个绝对路径,而在此之前的版本有时会包含一个相对路径。
__FUNCTION__ 函数名称(PHP 4.3.0 新加)。自 PHP 5 起本常量返回该函数被定义时的名字(区分大小写)。在 PHP 4 中该值总是小写字母的。
__CLASS__ 类的名称(PHP 4.3.0 新加)。自 PHP 5 起本常量返回该类被定义时的名字(区分大小写)。在 PHP 4 中该值总是小写字母的。
__METHOD__ 类的方法名(PHP 5.0.0 新加)。返回该方法被定义时的名字(区分大小写)。
定义 DS 则完全是为了方便程序书写和阅读,DIRECTORY_SEPARATOR 是 PHP 的预定义常量之一,指目录分隔符,在 Windows 中是反斜杠(backslash) \,在 Linux 中是斜杠(slash) /。
2. 引入框架定义
在常量定义之后,通过两个包含文件引入了 Joomla! 安装程序的框架定义:
require_once ( JPATH_BASE .DS.'includes'.DS.'defines.php' );require_once ( JPATH_BASE .DS.'includes'.DS.'framework.php' );
这两个文件的实际位置在 /installation/includes/ 目录中。打开 /installation/includes/defines.php 文件,这里定义了若干与路径有关的常量,包括:
JPATH_ROOT
Joomla! 根目录,当 Joomla! 被配置为独立的虚拟主机程序是地,此变量相当于 $_SERVER['DOCUMENT_ROOT']
JPATH_SITE
Joomla! 站点目录,JPATH_ROOT 的别名
JPATH_CONFIGURATION
配置文件保存目录
JPATH_ADMINISTRATOR
后 台管理程序根目录
JPATH_XMLRPC
XMLRPC 目录
JPATH_LIBRARIES
库 程序目录
JPATH_PLUGINS
插件目录
JPATH_INSTALLATION
安 装程序目录
JPATH_THEMES
外观模板目录
JPATH_CACHE
缓存 目录
好了,我们可以关闭 defines.php 文件了。再来看看 /installation/includes/framework.php 文件中有些什么,首先是 PHP 配置调整:
error_reporting( E_ALL );@set_magic_quotes_runtime( 0 ); @ini_set('zend.ze1_compatibility_mode', '0');
此处做了这么几件事:
打开 PHP 报错,要求回显从错误(Error)到提醒(Notice)的全部异常信息;
关 闭运行时魔术引号(magic_quotes_runtime)功能。此功能将对所有来自外部(包括数据库或 文本文件)的字符串中的引号进行转义,即在其 前面加上反斜杠 \ 或使用两个连续单引号替换所有的单引号(当打开 magic_quotes_sybase 开关时)。PHP 不鼓励使用此功能,从 PHP 6.0.0 开始它将被废除;
关闭 Zend 引擎 1(PHP 4) 兼容模式。PHP 官方文档中提到:这影响到了对象的复制、构造(无属性的对象会产生 FALSE 或 0)及比较。此模式下,对象将以值传递,而不是默认的引用传递。
Joomla! 的程序设计完全遵循面向对象思想,且书写非常规范,在这种前提下,这些兼容功能只会造成困扰,不如舍弃之。
接着检查 Joomla! 安装状态:
if (file_exists( JPATH_CONFIGURATION . DS . 'configuration.php' ) && (filesize( JPATH_CONFIGURATION . DS . 'configuration.php' ) > 10) && !file_exists( JPATH_INSTALLATION . DS . 'index.php' )) { header( 'Location: ../index.php' ); exit();}
如果配置文件 /configuration.php 已经存在且包括配置信息,并且安装程序已被移除,则自动转向首页。这段语句似乎没有实际意义,针对谁呢?至少不是针对安装程序本身的。
然后载入库程序装载器:
require_once( JPATH_LIBRARIES . DS . 'loader.php' );
通过这个装载程序,可以模拟类似 JAVA import 的程序导入方式。我们看紧接着的两行代码:
jimport( 'joomla.base.object' );jimport( 'joomla.environment.request' );
实际完成的功能是引入了 /libraries/joomla/base/object.php 和 /libraries/joomla/environment/request.php 两个文件。当然,事实上 jimport 和 JAVA 中的 import 语句还是有区别的,因为 PHP 尚不支持 OO 中非常重要的命名空间(namespace)功能。
object.php 和 request.php 文件分别定义了 JObject 类和 JRequest 类。JObject 类在 Joomla! 中这所有子类的基类,即所有非基类都必须直接或间接地继承 JObject 类。JObject 定义中值得玩味的是它对构造函数的处理:
function JObject(){ $args = func_get_args(); call_user_func_array(array(&$this, '__construct'), $args);} function __construct() {}
PHP 4 中将与类同名的成员函数作为其构造函数,这与 JAVA 和 C++ 类似。而 PHP 5 支持固定名称的构造函数 __construct() 和析构函数 __destruct()。JObject 中同时定义两种形式的构造函数 JObject() 和 __contruc(),而所有子类一律按 PHP 5 的规范以 __construct 命名构造函数。这样,当 Joomla! 运行在 PHP 5 上时,JObject() 方法将被忽略;而运行在 PHP 4 上时,解释器找不到与子类同名的成员函数,认为子类中未定义构造函数,因此在创建子类对象时,将调用父类 JObject 的构造函数 JObject(),而 JObject() 的功能即是调用对象自身的 __contruct() 方法,并将所有参数传递给它,也即实现了将子类定义中的 __contruct() 方法作为其构造函数的目的。这样,子类作者在编写构造函数时,不必再考虑 PHP 的版本差异,但是需要注意子类定义中不得再出现与类名相同的成员函数,否则会导致混乱。
JRequest 类是大部分 IO 操作都需要使用的类,在定义了这个类之后,Joomla! 立刻使用它完成了一步非常谨慎的操作:
JRequest::clean();
clean() 方法检查所有当前已经存在的全局变量($GLOBALS 数组)及超全局变量(超全局变量包括 $_FILES, $_ENV, $_GET, $_POST, $_COOKIE, $_SERVER, $_SESSION, $_REQUEST),清除了所有非超全局变量以及超全局变量中可能存在的不安全的数据。经过这一步,之前在程序中定义的任何变量都将被释放。
然后又定义了一个常量 JPATH_INCLUDES,说实话我非常不理解为什么不把这个定义放在 /installation/includes/defines.php 中?
// Installation file includesdefine( 'JPATH_INCLUDES', dirname(__FILE__) );
接下来进入 framework.php 的正题,即载入 Joomla! 的 API 框架定义:
/* * Joomla! framework loading */ // Include object abstract classjimport( 'joomla.utilities.compat.compat' ); // Joomla! library importsjimport( 'joomla.environment.response' );jimport( 'joomla.database.table' );jimport( 'joomla.user.user');jimport( 'joomla.environment.uri' );jimport( 'joomla.user.user');jimport( 'joomla.factory' );jimport( 'joomla.methods' );jimport( 'joomla.filesystem.*' );jimport( 'joomla.html.parameter' );jimport( 'joomla.utilities.array' );jimport( 'joomla.utilities.error' );jimport( 'joomla.utilities.utility' );jimport( 'joomla.version' );
我们来看看这些文件的用途:
joomla.utilities.compat.compat
当 PHP 版本低于5时,自动载入补丁程序,以支持 file_put_contents() 和 clone() 函数
joomla.environment.response
定 义 JResponse 类,用于访问响应变量(response variables),包括消息头(header)和消息主体(body)
joomla.database.table
定 义抽象类 JTable, 所有数据表的映射类都继承自此类
joomla.user.user
定义 JUser 类,处理所有与用户信息有关的交互
joomla.environment.uri
定义 JURI (注意全部是大写)类,用于解析、处理和生成 URI,它的另一个功能是提供当前执行脚本的 URI
joomla.user.user
又 定义一遍 JUser 类,不是他晕了,就是我太肤浅
joomla.factory
定义静态类 JFactory,用于按工厂模式生成对象实例
joomla.methods
定义 JRoute 和 JText 类,分别用于输出可读的 URI 和本地化文本,实际上它们只是简单封装了 JRouter (注意区别)类和 JLanguage 类
joomla.filesystem.*
定 义文件系统包,内含 JArchive (文件压缩)、JFile (文件访问和控制)、JFolder (文件夹访问和控制)、JPath (文件路径处理)类
joomla.html.parameter
定义 JParameter 类
joomla.utilities.array
定 义 JArrayHelper 类
joomla.utilities.error
定义 JError 类
joomla.utilities.utility
定 义 JUtility 类
joomla.version
定义 JVersion 类
joomla.utilities.string
定 义 JString 类
最后,framework.php 读取了 task 参数,以决定是否引用 JString 类,这是一个专门用于处理 utf-8 编码字符串的静态类:
// JString should only be loaded after pre-install checks$task = JRequest::getCmd( 'task' );if (!($task == '' || $task == 'preinstall' || $task == 'lang')) { jimport( 'joomla.utilities.string' );}
说 实话我真是看不过这抠门劲儿,直接引用了又能咋样?框架定义本身不应该涉及任何 IO 操作,为了一点点性能上的优化就破坏了这个原则,不值当。不过也可能是我站着说话不腰疼,因为定义 JString 类需要引入 utf-8 兼容补丁,在语言选择和安装前检查这些步骤中引入这一补丁,可能会带来麻烦:
jimport('joomla.utilities.compat.phputf8env');jimport('phputf8.utf8');
分享到:
相关推荐
- `index.php`:Joomla的入口文件,用于加载框架和控制页面显示。 - `COPYRIGHT.php`:版权信息。 - `index2.php`:备用的首页文件,通常在安装过程中使用。 - `configuration.php-dist`:预设的配置文件模板,...
2. **index.php**: 这是Joomla网站的入口文件,负责初始化系统环境,加载核心类库,并处理请求。它连接数据库,解析URL,调用相应的控制器来处理请求,最后渲染视图并显示结果。 3. **LICENSE.txt**: 这个文件包含...
2. **index.php**: 网站的入口文件,负责初始化Joomla框架并执行请求处理。 3. **LICENSE.txt** 和 **README.txt**: 分别包含了软件的许可协议和使用说明,用户应仔细阅读以了解权限和操作指南。 4. **htaccess....
1. **Joomla模板结构**:讲解Joomla模板的基本组成,如index.php、css、images和language目录,以及它们各自的作用。 2. **CSS样式表**:详细解释如何使用CSS来控制模板的样式,包括布局调整、颜色改变、字体选择等...
在 Joomla 中,每个组件、模块和模板都有自己的 index.php 文件,但根目录下的 index.php 是整个网站的起点。 6. **index2.php**: 这可能是 Joomla 为了提供额外的入口点或者备用首页而设置的。在某些情况下,可能...
2. **index.php** - 这是网站的入口文件,它负责初始化Joomla框架并处理请求。它是整个系统的起点。 3. **LICENSE.txt** - 包含了Joomla的许可协议信息,Joomla遵循GPL(GNU General Public License)开源许可,...
2. `index.php`:这是网站的入口文件,处理所有HTTP请求并决定如何呈现内容。它是Joomla框架的核心部分,通过调用不同的类和函数来实现页面的动态生成。 3. `LICENSE.txt`和`README.txt`:分别包含了软件的许可协议...
- `index.php`:这是Joomla的入口文件,处理所有HTTP请求。 - `LICENSE.txt`和`README.txt`:分别包含了软件的许可协议和使用说明。 - `.htaccess.txt`和`web.config.txt`:这两个文件用于配置服务器的重写规则,以...
5. **index.php, index2.php**:这两个文件是Joomla网站的默认首页。通常,index.php是主要的入口点,处理请求并展示内容。index2.php可能是备用或特殊的首页文件,可能在某些特定情况下使用。 6. **configuration....
在这个实战教程中,我们将深入了解如何创建和定制 Joomla 模板,特别是关注 index.php 文件的细节。 首先,`index.php` 是 Joomla 模板的核心文件,它定义了页面的结构和布局。在 `index.php` 中,我们可以看到一些...
你需要熟悉HTML、CSS和可能的JavaScript,以及理解模板文件结构,如index.php、templateDetails.xml等。 4. **组件、模块与插件**:Joomla 的核心功能由组件、模块和插件构成。组件是大型应用程序,模块则是在页面...
- **index.php**:这是Joomla的入口文件,负责启动整个网站的运行流程。 - **COPYRIGHT.php**:版权信息,通常包含版权声明和法律条款。 - **index2.php**:可能是一个备用的首页文件,或者在某些配置下使用。 -...
4. **phocadownload.php**:组件的主要PHP文件,包含了组件的核心逻辑和功能实现。 5. **uninstall.phocadownload.php**:卸载组件时执行的脚本,负责清理数据库和文件系统中的相关资源。 6. **install.bak.sql**:...
8. **layouts**:定义了网站布局的PHP文件。 9. **templates**:存放网站模板,你可以选择预设模板或自定义模板。 10. **joomla.xml**:这是 Joomla 扩展的XML文件,用于描述扩展的元数据,如名称、版本、作者等。 ...
4. `index.php`和`index2.php`:这两个文件是网站的入口点,它们负责加载 Joomla 框架并呈现网页内容。`index2.php`可能是备用或特定用途的首页。 5. `configuration.php-dist`:这是一个示例配置文件,用于存储...
1. index.php:主模板文件,定义了页面的基本结构。 2. CSS文件:如style.css,用于设定样式和布局。 3. 图片文件夹:存储模板中的图片资源。 4. HTML部分:如header.php、footer.php等,分别定义头部和底部内容。 5...
解压后,你会得到一系列文件和文件夹,包括但不限于`index.php`(网站的入口文件)和各种`.ini`配置文件。这些`.ini`文件是语言文件,用于定义 Joomla 系统中的各种文本字符串,例如菜单项和组件的名称,以支持多...
接下来,我们需要创建`index.php`文件,这是模板的核心,它包含了HTML结构和PHP代码,用于渲染Joomla内容。模板的其他部分可能包括CSS样式表、JavaScript文件、图像和其他资源。 关于静态生成,Joomla的System-...
- templates/TEMPLATE_NAME/html:包含各种页面组件的PHP文件,如菜单、模块等。 在使用模板时,要注意Joomla的安全更新和最佳实践。由于Joomla 1.5已不再支持,继续使用可能存在安全风险,建议升级到最新版本,如...
5. `index.php`:网站的入口文件,负责加载Joomla框架并处理请求,是整个系统的核心部分。 6. `LICENSE.txt`:包含Joomla的许可协议,表明该软件遵循GNU General Public License v2或更高版本。 7. `README.txt`:...