xwiki开发者指南-脚本

2021-01-14 11:48:49 浏览数 (1)

脚本可以让你在XWiki页面(或者视图)无需编译代码或部署软件组件来创建基本到复杂的Web应用程序。换句话说,你可以除了wiki和HTML语法之外使用脚本语法来编写XWiki页面的内容。

XWiki集成了jsr-223 scripting。你可以使用通用的Script Macro来使用几种可用的语言或使用以下特定宏:

  • Velocity Macro (XWiki Enterprise默认安装)
  • Groovy Macro (XWiki Enterprise默认安装)
  • Python Macro (XWiki Enterprise默认安装)
  • Ruby Macro (XWiki Enterprise默认无安装)
  • PHP Macro (XWiki Enterprise默认无安装)

权限

从XWiki 7.2M1开始,一个用户需要有Script权限来编写脚本。

另外,除了Velocity以外的所有脚本语言也需要编程权限(见下文有详细介绍)。

选择一个脚本语言

XWiki支持多种脚本语言。大部分由XWiki开发者编写代码是使用Velocity,有一些复杂的扩展是由Groovy编写;这两者脚本语言是久经考验和反复测试。而其他的语言应该也是可以正常使用的,但是只有少量的开发人员可以帮忙回答相应的问题。

Velocity

了解Velocity的第一件事情是它与其他脚本语言的2个不同方面:

  • 这是一个模板语言,而不是一个纯粹的脚本语言,这意味着它的内容实际上是Velocity指令穿插wiki标记,而纯粹的脚本语言是该语言编写的,他们需要明确的输出wiki标记。例如: Velocity: {{velocity}} Your username is $xcontext.getUser(), welcome to the site. {{/velocity}} Groovy: {{groovy}} println("Your username is " xcontext.getUser() " welcome to the site."); {{/groovy}}
  • 在沙盒里运行脚本是不需要权限,只能访问几个安全的对象,并且每个API调用需要检查在wiki配置里的权限,当前用户不允许执行将禁止对资源的访问或操作。其他的脚本语言要求编写脚本的用户有编程权限来执行它们,但是除了这个初始前提条件,服务器上的所有资源都是授予访问权限。注意,从XWiki 4.1我们引入了一个Sandbox for Groovy,但它仍在初期阶段。

作为一个模板引擎,Velocity不提供结构化代码。事实上,在这方面只有一个有用的指令,#macro。然而,因为它是一个模板引擎,它的语法更简单,更容易被非开发人员了解,这意味着它有更广泛的用户使用,无需编程背景。

没有编程权限,是不可能实例化新的对象,除了文字和那些由XWiki提供的安全的API。尽管如此,XWiki API是强大到足以允许安全地开发出了广泛的应用,前提是遵循“XWiki方式”。

Velocity在XWiki其他一些地方也可供选择:用此语言编写XWiki HTML UI模板,可以在皮肤扩展选择性激活。

最后,Velocity适合由小到中等复杂的项目,并且不需要访问其他资源除了XWiki提供的API和注册的脚本服务。它允许非常快速和轻松的开发,提供了良好的安全性和出色的性能,并且可以很容易地被包装为XAR。

Groovy

Groovy是一个成熟的脚本语言,它支持几乎所有的java语法,并提供了自己的语法,而且提供了增强Java语言的自定义API。虽然建议复杂的代码用Java编写然后通过脚本访问服务组件,但是Groovy的优点在于它可以在wiki编写,无需编译,部署和服务器重新启动,从而实现更快的开发。

当执行Groovy脚本时,XWiki API在上下文中是可以用的,但不像在Velocity,代码并不局限于API,可以自由地访问任何其他类或对象。新的类可以在Groovy进行定义,与Java类兼容,这使得可以写更多结构化代码,不像Velocity。它可以加载jar文件到classpath,这意味着一个wiki文档可以包含一个复杂的程序和平台没有提供的库。

总之,Groov的适合于复杂的项目或通过新的组件自定义增强wiki,它也可以很容易打包为XAR

考虑到这些因素后,如果需要的编程权限不是你的问题,那么你应该挑选你最熟悉的脚本语言!

XWiki Scripting API

Scripting API文档是以Javadoc格式,具体访问XWiki API Javadoc。如果你不熟悉Java或面向对象编程,你可能会对API文档困惑。这不是在我们文档的范围之内教你所有关于Java或面向对象的编程细节。你可以在网上找到所有已经存在的信息。你还可以游览整个扩展wiki,看看别人是如何实现各种效果的页面代码。

我们还提供了一个API指南有关使用XWiki API的例子。

绑定

主要提供的对象:

  • 当前文档:doc
  • 请求的上下文:xcontext
  • request对象:request
  • Response对象:response
  • XWiki对象:xwiki
  • XWiki utils: util (已被弃用)
  • 各种脚本服务: services

查看脚本参考文档的完整列表。

访问XWiki Component

从XWiki 4.1M2 开始,可以通过脚本服务访问Component Manager (也可以看下:通过Groovy访问components).

例如使用Groovy:

{{groovy}}

def greeter = services.component.getInstance(org.xwiki.component.HelloWorld.class)

println greeter.sayHello()

{{/groovy}}

你还可以通过以下获得ComponentManager:

{{groovy}}

def cm = services.component.componentManager

{{/groovy}}

低于XWiki 4.1M2版本的,你需要用以下方式(Groovy):

{{groovy}}

def greeter = com.xpn.xwiki.web.Utils.getComponent(org.xwiki.component.HelloWorld.class)

println greeter.sayHello()

{{/groovy}}

访问XWiki Core

有时XWiki API不提供你的应用程序需要的一些方法。你可以访问XWiki Core,但是它增加了安全风险,并且需要编程权限才能保存包含该脚本的页面(查看包含需要编程权限的脚本是不需要编程权限,只有在保存时才是需要)。

{{groovy}}

def xc = xcontext.getContext();

def wiki = xc.getWiki();

def xdoc = doc.getDocument();

{{/groovy}}

使用这个代码片段后,你将有3个新的对象:

  • 上下文对象的底层XWikiContext: xc
  • 底层XWiki对象: wiki
  • 当前文档的底层XWikiDocument: xdoc

你会发现,在wiki的许多方法和xdoc需要XWikiContext的实例,这是底层的xcontext XC不是API上下文的xcontext

再次,当功能不提供公共Api时,这些方法仅用于极少情况下。我们投入了大量的精力维护公共API,少量精力维护核心方法,所以你可能会发现,核心方法已被弃用,删除或在后续版本中改变。

查询XWiki Model

从你的脚本,你可以查询所有XWiki Model。查看Query Module以获取更多信息。

Velocity具体信息

Velocity是当前唯一不需要编程权限的脚本语言。这意味着你可以使用较少的权限的用户来保存Velocity脚本,没有人可以利用你的脚本来执行安全漏洞。

你可以用Velocity获得访问XWiki core,但这需要编程权限。严格地说,受保护的API可用仅当页面最后一次是具体编程权限的人保存。

在Velocity,你不能导入类,因此你不能访问XWiki components。你需要提供绑定。(注意: 在Velocity, 这些绑定都以$开始和其他Velocity变量)

有关Velocity语言编程的更多信息,可以参考Velocity用户指南。也可以查看Velocity练习。

更多有关详细使用Velocity,查看Velocity模块文档,包含完整的Velocity工具的完整列表。

如果要添加新的Velocity工具,你需要编辑你的xwiki.properties文件,并按照说明进行操作。

要在其他Velocity脚本引入Velocity脚本,查看这里。

其他Velocity变量

这些变量可以使用,但在未来会发生变化。

控制哪些部分显示

你可以控制 Comments/History/Attachment/Information部分,通过设置一些velocity变量为false:

#set (showcomments = false) #set ( showattachments = false) #set (showhistory = false) #set ( showinformation = false)

删除所有,你可以设置:

#set($docextras = [])

关于当前用户的信息

以下的变量(在xwikivars.vm 模板中设置)用于查看当前用户各种信息的快捷方式:

  • $isGuest: 检查当前用户是不是XWiki.XWikiGuest
  • $isSuperAdmin: 检查当前用户是不是特殊用户superadmin
  • $hasComment: 检查当前文档是否有评论权限
  • $hasEdit: 检查当前文档是否有编辑权限
  • $hasWatch: 检查用户是否经过身份验证,并提供watch服务
  • $hasAdmin: 检查当前文档是否有admin权限
  • $hasSpaceAdmin: 检查当前空间的XWikiPreferences文档的admin权限
  • $hasGlobalAdmin: 检查XWiki.XWikiPreferences的admin权限
  • $hasCreateSpace: 在不存在的空间,检查是否有对不存在的页面有编辑权限
  • $hasCreatePage: 在当前空间检查是否有对不存在的页面有编辑权限
  • $hasProgramming: 检查当前用户是否有编程权限
  • $isAdvancedUser: 高级用户: superadmin,用户的用户类型属性设置为“Advanced”,拥有管理员权限的游客

例如:

{{velocity}}

#if ($hasAdmin)

This link will only be visible to users that have admin rights on this document

[Do some admin action>>Some.Document]

#end

{{/velocity}}

关于当前wiki的信息

以下变量(在xwikivars.vm 模板中设置)用于查看当前wiki各种信息的快捷方式:

  • $isReadOnly
  • $isInServletMode
  • $isInPortletMode

Groovy具体信息

目前所有使用非Velocity脚本语言需要用户有编程权限。

  • 在扩展wiki查看Groovy代码片段(在标签云点击"Groovy"标签)
  • Groovy网站

Groovy例子

下面的例子演示了如何使用Groovy脚本在你的页面与velocity代码交互。以下例子通过DNS查找IP,通过velocity变量hostname以及把结果存储在变量 address里。

使用XWiki语法2.0:

对象可以在脚本语言间被来回传递,通过存储在对象。

{{velocity}} #set(hostname = "www.xwiki.org") Host Name: $``$xcontext.put("hostname",

使用XWiki语法1.0:

由于是一起解析Groovy和Velocity代码,在Groovy中定义的变量可以直接在velocity使用,从上下文获取。

#set (hostname = "www.xwiki.org") Host Name:

Python具体信息

你可以在XWiki运行Python代码,就如Velocity或者Groovy一样。

{{python}}

print "The full name of this document is " doc.getFullName()

{{/python}}

语言之间共享变量

大多数基于JSR223脚本语言可以重新注入创建的变量到当前ScriptContext中,这意味着你可以在Groovy脚本定义一个变量,并在例如Python脚本重用。

从4.1M2开始,这个桥梁已经为Velocity (这不是基于JSR223),以允许它访问当前ScriptContext中的变量,所以你可以这样写:

{{groovy}}

var = "toto"

{{/groovy}}

{{velocity}}

$var

{{/velocity}}

请注意,你也可以通过在XWiki上下文(xcontext绑定)设置他们来共享变量。

XWiki语法1.0 脚本

XWiki语法1.0在旧的渲染引擎还是支持的,但是在未来开发中是没有计划(最终被删除)。语法1.0的一些特性在语法2.0中解决。

  • 只提供给Velocity和Groovy脚本语言。
  • 在Groovy,上下文为:context不是xcontext
  • Groovy脚本的开头和结尾的标记为<%和%>而不是通过Groovy宏 (使用{{groovy}}和{{/groovy}})
  • Velocity在页面可以直接解析(不需要引入Velocity宏,使用{{velocity}}和{{/velocity}})

最后这一部分是很重要的,因为这意味着你需要小心当你的文档中使用$# 的时候。在<%%>中这些会生效,所以你写Groovy脚本的时候要小心。

0 人点赞