This guide covers the main XWiki APIs that you can use from scripts in wiki pages. It's not meant to be comprehensive. For that you'll need to check the XWiki Reference API page.

Note that while most examples are written in Velocity you can use any other scripting language to access the same APIs.

Querying documents

See the Query Module for examples on how to perform queries on the wiki using a scripting language.

Accessing the request

You can access the HTTP Request by accessing the  com.xpn.xwiki.web.XWikiServletRequest object through the request script variable.

for example in Velocity, to access an action HTTP parameter passed in the request you would write:

$request.action

Note that this is a shortcut to:

$request.get("action")

Getting external content

You can use the following APIs to get content located at external URLs:

public String getURLContent(String surl, String username, String password) throws IOException
public String getURLContent(String surl) throws IOException
public String getURLContent(String surl, String username, String password, int timeout) throws IOException
public String getURLContent(String surl, int timeout) throws IOException
public byte[] getURLContentAsBytes(String surl, String username, String password)
public byte[] getURLContentAsBytes(String surl) throws IOException

For example in Velocity:

$xwiki.getURLContent("http://google.com")

Add objects to a page

Here a piece of Velocity script to show how is possible to store a new object in one page:

## Create an object
#set($obj = $doc.newObject("XWiki.SomeClass"))
$obj.set("field1",$value1)
$obj.set("field2",$value2)

## Save the object in the page
$doc.save()

The "XWiki.SomeClass" class has to be created (through the class editor): field1 and field2 are property of the class. At the moment, this code works fine only if the user currently logged in has editing rights on the page, otherwise the Document.save() will not work.

Access objects in a page

Here is a piece of Velocity script to show how it is possible to access an object attached to the page, and read its fields :

## Retrieve the first object (index [0]) among all objects attached to this page and of a certain class 
#set($obj = $doc.getObject("SomeSpace.SomeClass"))

## Retrieve the value of the propertty "field1" for this object, provided a property called "field1" is actually defined in the class of this object
#set($field1 = $obj.get("field1"))
SomeSpace.SomeClass[0] : field1 = "$field1"

You can also go through all properties of an object, without knowing their name respective names. That's how the default Class Sheet works, when you create a class using the Class Wizard.

#set($class = $obj.xWikiClass) ## access the class object representing SomeSpace.SomeClass
#foreach($prop in $class.properties) ## go through all properties
 <dt> *${prop.prettyName}* </dt>
 <dd>$doc.display($prop.getName())</dd>
#end

Actually the line $doc.display(propertyName) can either display the property value, or generate an input field in the page, mapped to the property whose name is passed as argument (when you edit the page in inline mode). If you have a Velocity script you want to include somewhere else, and uses the display(propertyName) method to access properties of an object attached to the including page, you have to use the includeForm() Velocity macro in the including script :

#includeForm("spacename.docname")

See the reference for the includeForm() macro.

Include a Velocity page into another Velocity page

See Include In Velocity.

Redirecting to another page

It's possible to redirect the user to another page. This is useful for example when a page has been removed and you have given the URL to someone so you want the old page to redirect to the new page.

Example:

$response.sendRedirect($xwiki.getURL("Space.Page"))

For more examples, see the Redirect Snippet.

Add an Attachment to a page

For example, in Velocity:

{{velocity}}
#set($content = "This is some small arbitrary content")
#set($discard = $doc.addAttachment("myfile.txt", $content.getBytes()))
#set($discard = $doc.save("some comment"))
{{/velocity}}
Tags:
Created by Vincent Massol on 2007/10/03
   

Get Connected