第一章Joomla!扩展开发:概况你以前开发过动态网站但你的朋友告诉你有关Joomla!的事,所以你决定试一试。从美食网上那些著名的厨师中得到灵感后,你想建立一个简单的关于餐厅的网站。这个网站的安装比你期望要建立的内容管理系统要快速和平稳。当你找到一个精美的模板并添加了一些菜单和一些内容后,你开始考虑增加一些新的特性可以给你带来更多的访问量,甚至是利润。之后,你安装了购物车来买书,一个论坛来收集意见和一些边栏广告。为什么扩展JoomlaJoomla!不但能够处理内容文章,而且允许你干净整合各种复杂的应用。开发者为Joomla!开发各种扩展,如购物车、论坛、职位发布等。所有这些扩展能够运行在单个数据库、模板和核心。我们开发出来的扩展,界面是完全统一的。当你正确地开发扩展后,你就不用登录数据库和做其他基本的配置。另外,你也可以分发你自己开发的扩展给别人与别人分享你的成果,不需要另外的编程和数据库操作。自定义VS扩展Joomla!的代码是设计成可扩展的而不是直接修改它的核心代码。当有升级版本或者有补丁的时候,Joomla!才会升级它本身的核心代码,而你的扩展是不会被覆盖的。如何扩展JoomlaJoomla!支持三类扩展,每一类都有其特殊的用途。组件组件是最基本的,组件就是你所看到的页面的主要部分。Joomla!的设计是为每个页面加载和运行一个组件。因此,Joomla!核心的内容管理功能本身也是一个组件(例如:com_content)。组件通常有强大的后台管理功能。后台通常用来创建和更新数据库记录。你也可以通过它允许网站管理员去上传图片或者视频文件。模块相对于组件而言,一个页面可以有很多的模块。模块一般由边栏的元素或者是内容菜单组成,模块显示组件的内容,但它们不是页面的主要内容。Joomla!也支持不需要编程的内容模块(例如:自定义模块)。模块后台的控制是有限的,一般由一些基本的格式组成。插件当网站需要插入一些代码来实现某些逻辑时,可以由插件实现(以前叫做Mambot)。插件一般用来格式化页面的组件或者模块的输出。例如有这样的组件,关键字高亮显示、文章评论表单、基于JavaScript的HTML编辑器等。后台的控制与模块相似。主题概况创建工具栏和列表Joomla!的后台提供了一套标准的工具栏按钮。它们使得界面可以保持一致的风格,所以使用者可以很快地熟悉相应的功能。如果有必要的话,这些按钮可以修改或添加。和标准的工具栏一样,数据库记录的列表也有统一的显示风格。这些列表通常会包括编辑单条记录的链接,改变发布状态的链接和提供自动分页功能。使用HTML函数来保持一致的风格和减少重复的代码在你的扩展里,有各种标准的CSS类名可以用来格式化内容和HTML元素。另外,Joomla!包含很多函数可以自动生成复选框、下拉框和其他通用的元素。访问数据库和管理记录Joomla!提供了一个公用的数据库对象,可以让每个页面的请求只适用一个连接。这个对象提供了一组函数用来查询数据和返回结果。这些函数是独立数据库的,他们被设计成支持一个数据库多套Joomla!。除了一个公用的数据库对象,Joomla!还提供了标准的数据库表类。使用它核心的函数可以创建、读取、更新和删除记录。也可以添加这样的逻辑,当父记录被删除,其他表的子记录也会被删除。安全和获取请求变量的首选方法既然Joomla!是一个公开的web应用,有必要保护他免受攻击。Joomla!提供了只有在框架里被调用的保险的脚本方法,也不会随便地执行。除非是未明的脚本行为,黑客能故意地提交数据来访问你的数据库,Joomla!提供了阻止这类攻击的功能。菜单项控制Joomla!的一个显著的特性是导航与内容分离。然而,如果一个组件创建时没有考虑到这一点,网站管理员可能会不能选择他们的模板和模块。为了使用这个系统,有必要在产生连接时使用既定的菜单项ID数字。组件的链接可以有多个选项,允许在前端显示不同的选择而不用手工去构建长长的URL。控制组件的逻辑流当某一个组件被加载时同一个文件被调用,但是执行不同的函数。Joomla!使用标准的变量来决定每个请求要执行的函数。对于比较小的组件,可以用来从数据库和其它处理函数直接处理输出,比较大的组件会使用controller来处理逻辑流,用model来处理数据访问,用views来控制输出。这样的约定使得维护代码更加容易和帮助组件以更可靠的方式执行。通过XML进行参数配置Joomla!不是通过创建单独的表来处理扩展的配置信息,而是预留了一个字段来处理。变量通过扩展中的XML文件定义。XML文件也提供了默认值和约束这些参数。而且会自动地保存和返回这些值,而不需要手写查询语句。打包和分发一旦所有的代码都编写完成,就很容易打包给其他人使用的。所有文件的一个列表会被加入到XML文件中。任何需要建立数据表的查询语句也会包含在里面。所有文件被压缩成一个文件,然后这个扩展就可以被任何基于Joomla!的网站安装和使用。第二章组件开发入门在你编写代码之前,有一些文件和文件夹需要创建和一些查询语句需要运行。你不但可以创建组件而且不用额外的配置就可以尝试不同的特性。你也可以看到Joomla!组织和访问组件方法的概况。最后,你会像其它组件一样加入工具栏。Joomla!组件的结构Joomla!的所有组件都遵守指定的命名约定。每个系统组件都有唯一的名字,名字不要包括空格。代码分成两个文件夹,文件夹以com_开头,紧接着就是组件的名字。因此,你要创建两个相同名字的com_reviews文件夹,一个放到前台components下,另一个放到后台administrator/components下。当组件被前台加载的时候,Joomla!将会查找以组件唯一命名并以.php扩展名结束的文件。在components/com_reviews下建立review.php文件。同样,在后台建立的文件需要在前面加上admin.,在administrator/components/com_reviews下建立admin.reviews.php。执行组件Joomla!前台所有的请求都经过根目录的index.php文件,加载不同的组件是通过设置URLGET的option变量。假设你本地的joomla!站点地址是,那么你加载的组件的地址应该是=reviews,打开reviews.php文件并加入以下代码:?phpdefined('_JEXEC')ordie('Restrictedaccess');echo'divclass=componentheadingRestaurantReviews/div';?你会看到类似的页面:也许你可能想知道调用defined()函数的目的是什么,这是为了确保避免代码被直接通过components/com_reviews/reviews.php来访问。在后台的administrator/components/com_reviews/admin.reviews.php文件加上以下代码:?phpdefined('_JEXEC')ordie('Restrictedaccess');echo'RestaurantReviews';?前往:=com_reviews,查看页面输出:Joomla!前后台的分离Joomla!的所有组件,它们的代码使得后台部分与前台部分的代码很好地分离,在某些情况下,例如数据库表类,后台会调用前台的某些文件,但它们是独立的。当你不让后台的函数混入前台的代码,那么安全性就加强了。这是后台和前台的结构相似的同时一个很重要的特性。以下显示了Joomla!的根目录和administrator文件夹展开的图表:要注意的是administrator文件夹与根目录有相似的结构。区分二者是很重要的,否则你可能会将你的代码放错位置了而执行失败,除非是将它们放回正确的位置。在数据库里注册你的组件你现在知道怎么样访问前台和后台的组件了吧,尽管每次你都能够通过手工输入URL来执行你的代码,但你的用户是无法接受和你一样的通过手工输入URL来执行你的代码的。如果你在数据库中注册了组件,即在components数据表中加入一条记录,那么你就可以使用导航了。使用以下的SQL语句来注册组件:INSERTINTOjos_components(name,link,admin_menu_link,admin_menu_alt,`option`,admin_menu_img,params)VALUES('RestaurantReviews','option=com_reviews','option=com_reviews','ManageReviews','com_reviews','js/ThemeOffice/component.png','');在phpMyAdmin中,它看起来应该是这样的:这里声明了组件的名称,可以包括空格和标点,可以指定前台和后台的链接,也可以指定后台组件菜单的图标。当你创建了基本的目录并加入了文件后,有的组件已经准备好被执行了,而不需要写任何的SQL语句。这样你就在后台加入了组件的链接,也可以在前台适当的位置加入链接而不需要硬编码URL。刷新你后台的页面,下拉组件菜单,你会看到你的组件的子菜单项中显示了你的组件名称:既然组件已经注册了,现在可以创建前台导航菜单了。打开“菜单”|“主菜单”,然后单击“新建”按钮,从该页面中选择“RestaurantReviews”,输入链接名称后,如下图:点击“保存”,然后到前台刷新你的浏览器,在主要导航条上你应该看到“Reviews”导航链接了,你看到大概是下面这样的:从现在开始,你可以准备你的PHP技巧开始编写组件了。还要确保所有的前台请求都要通过=com_views,后台的请求通过=com_reviews。Joomla!是非常灵活的,可以让你做你喜欢做的事情。我们这个例子中,我们会教你重新创建一个组件,然后设计工具栏、用户、数据库类和库等,一旦你理解了它们的工作原理,这些元素将会让你节省下大量的时间。创建工具栏在Joomla!的后台,所有的核心组件都实现相同的保存、删除、编辑和发布项目等按钮,你可以在你的组件中使用这些按钮以便管理员会有无缝的体验。首先,在administartor/components/com_reviews文件夹下创建toolbar.reviews.html.php文件,并输入以下代码:?phpdefined('_JEXEC')ordie('Restrictedaccess');classTOOLBAR_reviews{function_NEW(){JToolBarHelper::save();JToolBarHelper::apply();JToolBarHelper::cancel();}function_DEFAULT(){JToolBarHelper::title(JText::_('RestaurantReviews'),'generic.png');JToolBarHelper::publishList();JToolBarHelper::unpublishList();JToolBarHelper::editList();JToolBarHelper::deleteList();JToolBarHelper::addNew();}}?包括输出代码的文件通常会组织成类,像这里的TOOLBAR_reviews。每个成员函数都会显示不同的工具栏。JtoolBarHelper类包