Obsolete Pages{{Obsolete}}
The official documentation is at: http://docs.alfresco.com
Draft PagesDeveloper GuideSurf PlatformLabs 33.0
NOTE: This page describes the Alfresco Surf Platform which is included in Alfresco 3.0, 3.1 and 3.2.
If you are looking for information about Alfresco 3.3, please visit Spring Surf.
Note: This document describes an API which is available in the presentation tier when using Alfresco Surf. The objects and methods described herein are available to templates and components within an Alfresco Surf application and not available for repository tier Web Scripts.
When building new presentation templates or web components, developers may choose to use Alfresco's Freemarker and JavaScript technologies. These are the default and preferred way to build high performance and lightweight web parts. They are easy to build and require no server restarts.
The availability of these APIs speeds the time to develop new functionality. Most Surf platform features are available as root scope JavaScript and FreeMarker objects. Developers are able to work with the full range of the Surf platform object model, the request context, users, remote connections, and credential management.
The Freemarker Template API and the JavaScript API use a common object model. This means that the objects available to the JavaScript API are very similar (in most places, identical) to those made availble by the Freemarker API. There are some minor differences that are noted in their respective sections below. It is recommended though that the standard development pattern of logic work being performed in JavaScript and presentation work being performed in FreeMarker should be followed where possible.
The Surf Platform Freemarker Template Processor provides capabilities similar to that provided by Alfresco's FreeMarker Engine. However it does not provide direct access to Alfresco repository concepts such as Nodes and Propetries that developers of repository tier Web Scripts will be familar with.
Similarly, the Surf Platform Web Script runtime extends the capabilities that are already provided by Alfresco's Web Script runtime. These are covered in great depth in the Web Scripts and Web Script Runtimes pages. There, you will find examples of how to build your own Web Scripts.
The Surf platform extends the basic Alfresco templating and scripting capabilities and then provides additional web-tier related root-scoped objects.
The Surf platform root-scoped objects are:
The request context
object provides the following properties:
id
: The internally managed id for the current request.pageId
: The id of the page being rendered.page
: The page object being rendered.templateId
: The id of the template being rendered.template
: The template object being rendered.user
: The current userthemeId
: The current theme id.theme
: The current theme object.formatId
: The format id for the current request.properties
: Associative array of all context values.authenticated
: Returns true if there is a non-guest current user.externalAuthentication
: Returns true if external authentication such as NTLM is being used to manage the user.If the dispatcher is rendering a page for a given content object id, the following objects will additionally be available:
contentId
: The id of the content being renderedcontent
: The content being rendered.For example:
var pageTitle = context.page.title;
var userFullName = context.user.fullName;
var contentTitle = context.content.properties['title'];
var customValue = context.properties['customValue'];
The user
object provides the following properties:
properties
: An associative array of user properties.id
: The user identifier.name
: The Principal name (most commonly, this will be the same as the user id).fullName
: The user's full name (for example, Joe Dwight Smith).firstName
: The user's first name (Joe).middleName
: The user's middle name (Dwight).lastName
: The user's last name (Smith).email
: The user's email.organization
: The user's organization.jobTitle
: The user's job title.location
: The user's location.biography
: The user's biography.telephone
: The user's telephone entry.mobilePhone
: The user's mobile phone entry.skype
: The user's skype id.instantMsg
: The user's instant message id.companyPostcode
: The user's company post code.companyTelephone
: The user's company telephone.companyFax
: The user's company fax entry.companyEmail
: The user's company email.companyAddress1
: The user's company address entry 1.companyAddress2
: The user's company address entry 2.companyAddress3
: The user's company address entry 3.The user
object provides the following methods:
save()
: Saves changes to the users properties - if supported by the User object implementation.getUser(userId)
: Retrieve a user object with populated details for the given user Id.For example:
Welcome to the Red Sox appreciation page, ${user.firstName}!
NOTE: Only available if an object ID is provided as part of the page URL.
The content
object provides the following properties:
id
: The id of the content object.typeId
: The type id of the content object.properties
: An associative array of properties about the object.The following properties are metadata fields about the object:
timestamp
: The time (long) when the object was loaded.endpointId
: The id of the endpoint from which the object was loaded.isLoaded
: Whether the object successfully loaded.statusCode
: Status code from the attempt to load the object.statusMessage
: Status message from the attempt to load the object.The following properties contain the payload of the document itself:
text
: The content of the selected object as textxml
: The content of the selected object as xmlFor example, you can work with metadata about the currently selected object as follows:
var id = content.id;
var typeId = content.typeId;
var endpointId = content.endpointId;
var timestamp = content.timestamp;
var isLoaded = content.isLoaded;
var statusCode = content.statusCode;
var statusMessage = content.statusMessage;
var customData = content.properties['cm:customData'];
You can also write components that work with the data of the object. This is particularly useful if you're dispatching from XML of Web Form based objects:
var text = content.text;
var xml = context.xml;
// parse the xml and load properties into our model
var e4x = new XML(content.xml);
model.productName = e4x.*::name.toString();
model.productDescription = e4x.*::description.toString();
Where the XML could be the following:
<pr:product xmlns:alf='http://www.alfresco.org'
xmlns:chiba='http://chiba.sourceforge.net/xforms'
xmlns:ev='http://www.w3.org/2001/xml-events'
xmlns:pr='http://www.alfresco.org/alfresco/pr'
xmlns:xf='http://www.w3.org/2002/xforms'
xmlns:xhtml='http://www.w3.org/1999/xhtml'
xmlns:xs='http://www.w3.org/2001/XMLSchema'
xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'>
<pr:name>Demo Product 1</pr:name>
<pr:description>Demo Product 1</pr:description>
</pr:product>
The instance
object provides the following properties:
object
: The currently executing object (page, template or component).id
: The id of the currently executing object.htmlId
: The page unique HTML id of the currently executing object.properties
: An associative array of properties about the currently rendering object.The instance
object provides the following methods:
getParameterNames()
: Returns a String[] of the names of the request parameters.getParameter(String name)
: Returns the parameter value for the given parameter name.getParameters()
: Returns an associative Array of the request parameter name/value pairs.NOTE: Only available within the context of a page render.
The page
object provides the following properties:
url
: The url helper object.id
: Page object ID.title
: Page definition title.titleId
: Page definition title I18N message id.description
: Page definition description.descriptionId
: Page definition description I18N message id..theme
: Theme ID.properties
: Custom page definition properties map, for example page.properties['abc']
. The url
object provides the following properties:
context
: Page root context path, for example /share
.servletContext
: Page root context path and servlet path, for example /share/page
.uri
: Page URI (no URL arguments), for example /share/page/mylogin
.url
: Complete page URL, for example /share/page/mylogin?user=test
.queryString
: Query string from the URL, for example user=test&a=1
.args
: Map of URL argument name/value pairs.The sitedata
object provides the following framework properties:
rootPage
: Root page object for the web site/application.siteConfiguration
: Configuration object for the web site/application.The following properties provide arrays of all objects of a given type:
chrome
: Array of all Chrome objects.components
: Array of all Component objects.componentTypes
: Array of all ComponentType objects.configurations
: Array of all Configuration objects.contentAssociations
: Array of all ContentAssociation objects.pages
: Array of all Page objects.pageTypes
: Array of all PageType objects.pageAssociations
: Array of all PageAssociation objects.templates
: Array of all Template objects.templateTypes
: Array of all TemplateType objects.themes
: Array of all Theme objects.The following properties provide associative arrays (or maps) of all instances for a given object type. These maps are keyed by object id:
chromeMap
: Associative array of all Chrome objects.componentsMap
: Associative array of all Component objects.componentTypesMap
: Associative array of all ComponentType objects.configurationsMap
: Associative array of all Configuration objects.contentAssociationsMap
: Associative array of all ContentAssociation objects.pagesMap
: Associative array of all Page objects.pageTypesMap
: Associative array of all PageType objects.pageAssociationsMap
: Associative array of all PageAssociation objects.templatesMap
: Associative array of all Template objects.templateTypesMap
: Associative array of all TemplateType objects.themesMap
: Associative array of all Theme objects.The following generic lookup methods are also available, if you are looking for components it is generally much faster to use the specific findComponents() method as detailed below:
getObjects(objectTypeId)
: Array of all objects of the given type.getObjectsMap(objectTypeId)
: Associative array of all objects of the given type.The following methods allow you to create new objects:
newChrome()
: Instantiates a new Chrome.newComponent()
: Instantiates a new Component.newComponent(componentTypeId)
: Instantiates a new Component with the given ComponentType id.newComponent(componentTypeId, title, description)
: Instantiates a new Component with the given ComponentType id, title and description.newComponentType()
: Instantiates a new ComponentType.newConfiguration()
: Instantiates a new Configuration.newConfiguration(sourceId)
: Instantiates a new Configuration bound to the given source id.newContentAssociation()
: Instantiates a new Content Association.newPage()
: Instantiates a new Page.newPage(title, description)
: Instantiates a new Page with the given title and description.newPageAssociation()
: Instantiates a new Page Association.newPageType(pageTypeId)
: Instantiates a new Page Type.newTemplate()
: Instantiates a new Template.newTemplate(templateType)
: Instantiates a new Template instance of the given template type.newTemplate(templateTypeId, title, description)
: Instantiates a new Template instance of the given template type, title and description.newTemplateType(templateTypeId)
: Instantiates a new Template Type with the given id.The following generic object creation method is also available:
newObject(objectId, objectTypeId)
: Instantiates a new object of the given typeThe following methods look up objects and return arrays of results. An AND operator is applied across all supplied parameters. If a parameter is null, it is not included in the lookup.
findComponents(scopeId, sourceId, regionId, componentTypeId)
: Finds all Component instances whose bindings match the given scope, source object, region and component type. The component type should be left as null for the fastest lookup performance.findChildPageAssociations(sourceId, destId)
: Finds all PageAssociation instances of type child
between the given source and destination pages.findPageAssociations(sourceId, destId, assocType)
: Finds all PageAssociation instances between the given source and destination pages of the given association type (that is, child
).findChildPages(sourceId)
: Finds all child page objects for the given top level page id.findContentAssociations(sourceId, destId, assocType, formatId)
: Finds all ContentAssociation instances whose bindings match the given source id, dest id, association type and format.The following methods look up objects and return maps of results. An AND operator is applied across all supplied parameters. If a parameter is null, it is not included in the lookup.
findComponentsMap(scopeId, sourceId, regionId, componentTypeId)
: Finds all Component instances whose bindings match the given scope, source object, region, and component type. The component type should be left as null for the fastest lookup performance.findPageAssociationsMap(sourceId, destId, assocType)
: Finds all PageAssociation instances between the given source and destination pages of the given association type (that is, child
).findContentAssociationsMap(sourceId, destId, assocType, formatId)
: Finds all ContentAssociation instances whose bindings match the given source id, dest id, association type and format.findTemplatesMap(pageId)
: Finds all templates that are bound to the given page.The following methods return a single object. An AND operator is applied across all supplied parameters. If a parameter is null, it is not included in the lookup. If multiple objects result from the lookup, the first one is returned:
findConfiguration(sourceId)
: Returns a Configuration instance bound to the given sourceId.findTemplate(pageId)
: Returns the default Template instance bound to a given page.findTemplate(pageId, formatId)
: Returns the Template instance bound to a given page for a specific format.The following methods are used to bind objects together. These are used to create association objects and to stamp binding parameters onto objects:
associateComponent(componentId, scopeId, sourceId, regionId)
: Binds a given component to specified scope, source object, and region.associateTemplate(templateId, pageId)
: Binds the default template to a page.associateTemplate(templateId, pageId, formatId)
: Binds a template to a page for a given format id.associatePage(sourceId, destId)
: Associates a source page to a child page.associateContent(contentId, pageId, formatId)
: Associates a content id to a page for a given format id.associateContentType(contentTypeId, pageId, formatId)
: Associates a content type id to a page for a given format id.The following methods are used to unbind objects from one another. They are used to remove association objects and to clear binding parameters on objects:
unassociateComponent(componentId)
: Unbinds a given component so that it is uncoupled from a scope, source object, and region.unassociateTemplate(pageId)
: Unbinds the default template from a page.unassociateTemplate(pageId, formatId)
: Unbinds a template from a page for a given format id.unassociatePage(sourceId, destId)
: Unassociates a source page from a child page.unassociateContent(contentId, pageId, formatId)
: Unassociates a content id from a page for a given format id.unassociateContentType(contentTypeId, pageId, formatId)
: Unassociates a content type id from a page for a given format id.The following methods can be used to look up individual objects:
getObject(objectTypeId, objectId)
: Returns a single object with the given object type id and object idgetChrome(objectId)
: Returns a Chrome instance with the given object idgetComponent(objectId)
: Returns a Component instance with the given object idgetComponent(scope, regionId, sourceId)
: Returns a Component instance bound to the given scope, region id and source idgetComponentType(objectId)
: Returns a ComponentType instance with the given object idgetConfiguration(objectId)
: Returns a Configuration instance with the given object idgetContentAssociation(objectId)
: Returns a ContentAssociation instance with the given object idgetPage(objectId)
: Returns a Page instance with the given object idgetPageType(objectId)
: Returns a PageType instance with the given object idgetPageAssociation(objectId)
: Returns a PageAssociation instance with the given object idgetTemplate(objectId)
: Returns a Template instance with the given object idgetTemplateType(objectId)
: Returns a TemplateType instance with the given object idgetTheme(objectId)
: Returns a Theme instance with the given object idFor example:
// create two pages
var page1 = sitedata.newPage('My First Product Page', 'First Description');
var page2 = sitedata.newPage('My Second Product Page', 'Second Description');
// associate both pages to the site's root page
sitedata.associatePage(sitedata.rootPage.id, page1.id);
sitedata.associatePage(sitedata.rootPage.id, page2.id);
// create a new template instance of type 'product_display_template'
var template1 = sitedata.getObject('product_display_template');
// bind both pages to this template for their 'default' format
sitedata.associateTemplate(template1.id, page1.id);
sitedata.associateTemplate(template1.id, page2.id, 'default');
// create a component instance
var component1 = sitedata.newComponent('pdfViewer', 'PDF Viewer', 'Description');
// bind component into both pages at once by setting to template scope
sitedata.associateComponent(component1.id, 'template', template1.id, 'viewer');
The remote
object provides the following properties:
endpointIds
: A String[] of available endpoint ids.The remote
object provides the following methods:
connect
: Provides a connector to the default endpoint.connect(endpointId)
: Provides a connector to the given endpoint ID.call(uri)
: Invoke a specific URI on the default endpoint - this is just a shortcut for calling remote.connect().call(uri)
.getEndpointName(endpointId)
: Returns the display name for an endpointgetEndpointDescription(endpointId)
: Returns the description for an endpointgetEndpointURL(endpointId)
: Returns the url for an endpointFor example:
// get a connector to the Alfresco repository endpoint
var connector = remote.connect('alfresco');
// retrieve the web script index page
var indexHtml = connector.get('/index');
// TODO: do something with it...
Model objects are returned from most of the query functions on sitedata
. They are also bound to rendering contexts. A model object could be a component
, a template
, or any other object type.
By default, the following properties are available:
id
: The id of the object.title
: The title of the object.description
: The description of the object.properties
: An associative array (map) of all properties on the object.The following metadata properties are available:
timestamp
: The modification time of the object(long).persisterId
: The id of the persister to which the object belongs.storagePath
: The path to the file within the persister.The following persistence methods are available:
save()
: Persists the model object to the store.reload()
: Reloads the model object from the store.remove()
: Removes the model object from the store.The following methods are also available:
toXML()
: Generates a user-friendly XML serialization of the object.touch()
: Touches the model file (updating its modification timestamp).getProperty(key)
: Returns the property directly from the model object.setProperty(key, value)
: Sets a property directly onto the model object.removeProperty(key)
: Removes a property from the model object.Connectors are retrieved via the remote
object and are used to communicate with endpoints. This communication generally consists of an HTTP request followed by an appropriate Response
object (JSON, XML or other format).
endpoint
: The ID of the endpoint to which this connector is boundcall(uri)
: Invokes a URI on the endpoint - same as calling get(uri)
.get(uri)
: Invokes a GET request URI on the endpoint.post(uri, body)
: Invokes a URI on the endpoint, passing the supplied body as a POST request.post(uri, body, mimetype)
: Invokes a URI on the endpoint, passing the supplied body as a POST request. The given mimetype for the content body is applied.put(uri, body)
: Invokes a URI on the endpoint, passing the supplied body as a PUT request.put(uri, body, mimetype)
: Invokes a URI on the endpoint, passing the supplied body as a PUT request. The given mimetype for the content body is applied.del(uri)
: Invokes a URI on the endpoint as DELETE request.The Response object wraps the response data, status code, status message and any exception information from a remote call.
response
: The data of the response as a string.status
: Returns a ResponseStatus
object wrapping the return code status, message and any exception information.The ResponseStatus object wraps the response status code, status message and any exception information from a remote call.
message
: Response status message.code
: Response status code.codeName
: Localised response status code name.codeDescription
: Localised response status code description.exception(
: Reponse status exception object - may be null.Specific objects are available to each different types of rendering engine. There are two rendering engines that are most common: template
renderers and component
renderers.
The following root-scoped objects are available during the rendition of a Template
:
sitedata
- always availablecontext
- always availableinstance
- always availableuser
- always available ('guest' if unauthenticated)content
- available if content is being dispatchedpage
- page model objecttheme
- the current theme idhtmlid
- the html idurl
- url info objecthead
- String of all component headers (<script>
and <link>
dependencies)Custom properties of the Template object can be accessed like this:
${context.template.properties['customProperty']}
Custom properties of the Page object can be accessed like this:
${context.page.properties['customProperty']}
The following Surf directives are available to Freemarker Templates:
The following root-scoped objects are available during the rendition of a Component
:
sitedata
- always availablecontext
- always availableinstance
- always availableuser
- always available (guest if unauthenticated)content
- available if content is being dispatchedpage
- page model objecttheme
- the current theme idhtmlid
- the html idCustom properties of the currently rendering Component can be accessed like this:
${instance.properties['customProperty']}
Ask for and offer help to other Alfresco Content Services Users and members of the Alfresco team.
Related links:
By using this site, you are agreeing to allow us to collect and use cookies as outlined in Alfresco’s Cookie Statement and Terms of Use (and you have a legitimate interest in Alfresco and our products, authorizing us to contact you in such methods). If you are not ok with these terms, please do not use this website.