1+1=10

扬长避短 vs 取长补短

Joomla!扩展笔记

Joomla! 的扩展分:组件、模块、插件、模板

简单了解一下

组件(Component)

组件是Joomla!的一种扩展,是Joomla!的主要功能单元。大部分组件都包含administrator和site两部分,它们分别装在Joomla!根目录下的 administrator/components 和 components目录中。

当用户通过类似如下的http://example.com/index.php?option=com_<name>的url请求页面时,Joomla!平台将试图加载组件文件components/com_<name>/<name>.php。在该文件中,可以决定:直接返回HTML代码,还是使用模型-视图-控制器(MVC)模式。

组件的控制流程见 Component_Program_Flow

Old-Flat-Model(直接返回HTML代码)

假定我们创建一个名为 hello 的组件,在网站components目录下创建 com_hello 子目录,在该目录下创建一个 hello.php 的文件,该文件内输入

    Hello from my first component.

而后创建一个空的 hello.xml 文件。这样,一个简单的组件就完成了,在 扩展=》扩展管理器=》检测 中点击检测按钮。即可发现该组件。

com_hello\
    |--  hello.php 
    \--  hello.xml 

组件后台

在网站 administrator/components/com_hello目录下创建 hello.php 文件,内容简单包含

    Hello administratation from my first component.

该页面通过 administrator/index.php?option=com_hello 访问

安装包

如果不是直接放置在网站目录下让jommla!去检测,而是直接制作安装包

com_hello\
    |--  site\
    |      |-- hello.php 
    |
    |--  admin\
    |      |-- hello.php 
    |
    \--  hello.xml 

关键的是一个名为 hello.xml 的文件,内容大致如下

<?xml version="1.0" encoding="utf-8"?>
<extension type="component" version="3.2.0">
    <name>hello</name>
    <version>0.0.2</version>
    <files folder="site">
    <filename>hello.php</filename>
    </files>

    <administration>
        <menu>hello</menu>
        <files folder="admin">
            <filename>hello.php</filename>
        </files>
    </administration>
</extension>

注:一般子目录下都会放置一个空的index.html的文件,以避免用户看到目录下内容。

关于该xml文件的信息,见Manifest_files

MVC模式

Joomla!3 第三方组件通常都分为三部分:模型、视图、控制器。 基本结构:

com_mycomponent\
    |--  mycomponent.php 
    |--  controller.php
    |--  views\
    |       |--  mycomponent\
    |       |       |-- view.html.php
    |       |       |-- tmpl\
    |       |             |-- default.php
    |...

现在网上的例子基本上都是 JControllerLegacy/JViewLegacy/JModelLegal,它们都加了Legal,说明有更新的和推荐的替代品: JControllerBase/JViewBase/JModelBase。

url
index.php?option=com_<name> Joomla!将加载 components/com_<name>/<name>.php
index.php?option=com_<name>&view=<myview> Joomla!会导入components/com_<name>/views/<myview>/view.html.php,默认<name>
index.php?option=com_<name>[&task=<mytask>] 默认Task是display
index.php?option=com_<name>&format=pdf 默认Format是html

东西太多了,本文跳过

参考

  • https://docs.joomla.org/Portal:Component_Development
  • https://docs.joomla.org/Absolute_Basics_of_How_a_Component_Functions
  • https://docs.joomla.org/J3.x:Developing_a_MVC_Component/Developing_a_Basic_Component
  • https://docs.joomla.org/J3.x:Developing_a_MVC_Component/Adding_a_view_to_the_site_part
  • ...

模块(Module)

模块用来在页面的某部位添加一些内容。在典型的页面中,它们通常是围绕组件的方盒子,比如Login Form等。

简单的组件通常包含4个文件

mod_mymodule\
    |--  mod_mymodule.php 
    |--  mod_mymodule.xml 
    |--  helper.php
    |--  tmpl\
    |      |-- default.php

mod_mymodule.php 是模块的入口,mod_mymodule.xml包含安装信息以及配置参数信息等。

参考

  • https://docs.joomla.org/Portal:Module_Development
  • https://docs.joomla.org/J3.x:Creating_a_simple_module/Developing_a_Basic_Module

插件(Plugin)

插件是Joomla!的一种扩展,它提供与事件相关联的函数功能。Joomla提供了一套核心的插件事件,但是其他扩展也可以发射(fire) 自定义事件。当某一个特定事件发生时,所有与该事件关联的插件函数都会被依次调用。Joomla插件架构遵循观察者模式。

子类化 JPlugin

<?php
class plg<PluginGroup><PluginName> extends JPlugin
{
     function <EventName>()
     {
        return true;
     }
}
?>

而后 创建一个安装文件

<?xml version="1.0" encoding="utf-8"?>
<extension version="3.1" type="plugin" group="system">
    <name>plg_system_example</name>
    <version>1.0.0</version>
    <files>
        <filename plugin="example">example.php</filename>
    </files>
    <config>
    </config>
</extension>

里面关键的是extension 中的group属性,以及 files 中的 filename。

参考

  • https://docs.joomla.org/Portal:Plugin_Development
  • https://docs.joomla.org/Administration_of_a_Plugin_in_Joomla
  • https://docs.joomla.org/Creating_a_Plugin_for_Joomla
  • https://docs.joomla.org/Plugin_Developer_Overview
  • https://docs.joomla.org/Plugin/Events

模板(Template)

参考

  • https://docs.joomla.org/Portal:Template_Development
  • https://docs.joomla.org/Understanding_Joomla!_templates

语言包(language package)

只关注非核心扩展的语言包。

在Joomla!1.5之前,通过安装文件中的languages元素进行安装

<languages folder="lang">
    <language tag="zh-CN">zh-CN.com_example.ini</language>
</languages>

这将会把扩展的语言文件安装进Joomla!的核心语言文件存放位置:Joomla根目录下的language或administrator/language。

该做法在3.x中仍然被支持,但推荐将语言文件和扩展的其他文件直接放一块,目录结构有一定要求

<files>
    <filename plugin="example">example.php</filename>
    <folder>language</folder>
</files>

注意:语言文件保存成不带BOM的UTF8格式

参考

  • https://docs.joomla.org/Making_a_Language_Pack_for_Joomla_3.x
  • https://docs.joomla.org/Creating_language_packs_for_extensions_in_Joomla_2.5
  • https://docs.joomla.org/J2.5:Making_non-core_language_packs
  • https://docs.joomla.org/Specification_of_language_files
  • https://docs.joomla.org/Creating_a_language_definition_file

其他

  • https://docs.joomla.org/Manifest_files