D.H.Q的烂笔头

Just code for fun~

zotonic 的模块结构

zotonic 的模块是把跟模块功能相关的一些文件或文件夹统一放在一个以模块名命名的文件夹里。以之前介绍过的 mod_syntaxhighlighter 模块为例,它的目录架构如下:

|----mod_syntaxhighlighter
| |----lib
| | |----css
| | |----js
| |----templates
| | |----_html_body.tpl
| |----mod_syntaxhighlighter.erl

从上往下,mod_syntaxhighlighter 是模块的文件夹,模块文件夹下包含有资源文件夹lib、模板文件夹templates和模块的初始信息文件 mod_syntaxhighlighter.erl (跟模块名一样的erl文件),资源文件夹lib下还包含有css 文件夹和js文件夹(这两个文件夹里还含有若干css和js文件,由于篇幅省略)。

其实,zotonic 的模块一般由以下文件或文件夹组成:

模块的初始信息文件

这是一个跟模块名一样的erl文件,例如上面的mod_syntaxhighlighter .erl文件。这个文件包含着模块的一些基础信息,例如模块标题、作者、描述、模块权重(priority)等等,这些信息将作为模块的描述信息出现在后台模块管理页面(System/Modules)上。例如mod_syntaxhighlighter .erl内容如下:

-module(mod_syntaxhighlighter).

-author("Alain O'Dea <alain.odea@gmail.com>").
-mod_title("SyntaxHighlighter").
-mod_description("Alex Gorbatchev's client-side code highlighter").
-mod_prio(500).

author、mod_title、mod_description分别描述模块作者、标题、摘要等信息。

mod_prio描述的是模块的权重,最高权重是1,默认是500(没有这个属性),具有较高权重的模块是会优先检录,权重一样的话,则根据模块的名称顺序来排(正序)。

如果你想在模块开始运行的时候执行一些操作或初始一些数据,可以导出(export)一个 init/1 的函数,这个init函数的参数Context就是你网站运行时被context记录(record)初始的数据(具体的context初始record值可以查看/include/zotonic.hrl)。如果你想模块被终止的时候执行一些操作,可以导出一个 terminate/2 的函数,第一参数是一个原子,是说明模块被终止的原因,第二个参数跟 init/1 的参数是一样。其实这个跟 erlang 的 gen_server 里的 init 和 terminate 的概念是一样,如果你熟悉 gen_server,这是很容易理解的。当然,你想把模块当作一个进程启动,也可以把这个模块的初始信息文件写成 gen_server的形式,这里不多说具体请看这里

actions

这个文件夹保存着模块定义的行为。每一个行为文件的名称必须是 “action” 和不包含 "mod_" 的模块名作为前缀,例如在 mod_base 模块里的 dialog_open 行为的文件名是 action_base_dialog_open.erl

dispatch

这个文件夹下存放着默认命名为 dispatch 的 URL 路由调度规则文件,它定义着每一个被访问的 URL 该做出哪些响应操作,该访问哪个页面,该调用哪个模板,该返回什么页面内容。

PS:路由规则文件不能是 erl 的文件类型。

lib

zotonic的资源文件夹,里面存放这一些静态的图片、css和js等文件,这些文件访问的规则由dispatch来定义。

scomps

任何自定义的标签(tag)都放在这个文件夹。自定义标签文件夹里的文件命名跟行为的是一样。例如在 mod_base 模块里的 button 标签的文件名是 scomp_base_button.erl

controllers

这个文件夹包含着定义控制器的erlang模块,这些控制器处理从url路由调度规则传过来的HTTP请求。由于这些控制器是一个erlang模块,所以会被编译并加载到erlang的运行时系统,因此控制器的命名必须是唯一。控制器的命名跟行为的命名规则是一样。

models

这个文件夹存放的是 erlang 模块,每个模块是一个模型。每个模型模块都是以 m_ 开头,例如m_test,并以 m_test 的方式常用在模板文件i。由于模型文件也要编译加载到erlang运行时系统,所以模型文件的命名也要唯一。

templates

存放模板的文件夹

filters

这个文件夹保存的是erlang模块,每一个模块被定义成一个模板过滤器。每一个过滤器必须有一个唯一的名字,映射相对于的过滤器名字,例如,过滤器“tail”写在erlang模块文件filter_tail.erl,该过滤器文件导出一个tail/1的函数。模板编译器将引入正确的过滤器模块到编译模板里,一个错误的过滤器将会导入模板编译失败。

validators

存放一些验证器(例如email格式验证)的文件夹,验证器的命名跟行为的一样,除了前缀是validator之外。

services

这个文件夹也是存在erlang模块文件,每一个服务模块的函数将作为一个API方法,使用这些API,你可以从其他应用程序访问到zotonic,这些都是通过controller_api 调用。服务的命名有一点不同:模块名总是用于服务名称,例如服务 base/export 是放在 mod_base/services/service_base_export.erl 文件里。这个服务可以通过 http://yoursite.com/api/base/export 访问到。

参考:Zotonic Module Structure

comments powered by Disqus
返回顶部