<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Ben&#039;s Blog &#187; Alfresco WCM</title>
	<atom:link href="http://www.benh.co.uk/tag/alfresco-wcm/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.benh.co.uk</link>
	<description></description>
	<lastBuildDate>Thu, 26 Jan 2012 21:39:40 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Web Quick Start Videos</title>
		<link>http://www.benh.co.uk/alfresco/web-quick-start-videos/</link>
		<comments>http://www.benh.co.uk/alfresco/web-quick-start-videos/#comments</comments>
		<pubDate>Fri, 26 Nov 2010 15:27:03 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Alfresco WCM (archive)]]></category>
		<category><![CDATA[Web Quick Start]]></category>
		<category><![CDATA[Alfresco WCM]]></category>
		<category><![CDATA[wcm]]></category>

		<guid isPermaLink="false">http://www.benh.co.uk/?p=569</guid>
		<description><![CDATA[The following are short (less than 10 minutes) introductory videos to features of the Alfresco Web Quick Start. I plan to record several covering topics such as Renditions, Asset Collections, User Generated Content etc.]]></description>
			<content:encoded><![CDATA[<p>The following are short (less than 10 minutes) introductory videos to features of the Alfresco Web Quick Start. I plan to record several over the next few weeks covering topics such as installation, renditions, asset collections, user generated content, publishing etc.</p>
<p><span id="more-569"></span></p>
<h1>1. Introduction and Installation</h1>
<p>In introduction to the Alfresco Web Quick Start and demonstration of an install using the Alfresco Installer on a Windows platform.</p>
<p><iframe title="YouTube video player" class="youtube-player" type="text/html" width="853" height="510" src="http://www.youtube.com/embed/vfQrRzt4HIw?rel=0&amp;hd=1" frameborder="0"></iframe></p>
]]></content:encoded>
			<wfw:commentRss>http://www.benh.co.uk/alfresco/web-quick-start-videos/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Web Quick Start – First Look</title>
		<link>http://www.benh.co.uk/alfresco/web-quick-start/web-quick-start-first-look/</link>
		<comments>http://www.benh.co.uk/alfresco/web-quick-start/web-quick-start-first-look/#comments</comments>
		<pubDate>Thu, 09 Sep 2010 14:13:31 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Web Quick Start]]></category>
		<category><![CDATA[Alfresco WCM]]></category>
		<category><![CDATA[cmis]]></category>
		<category><![CDATA[spring mvc]]></category>
		<category><![CDATA[spring surf]]></category>
		<category><![CDATA[wqs]]></category>

		<guid isPermaLink="false">http://www.benh.co.uk/?p=471</guid>
		<description><![CDATA[Comments now closed &#8211; please use the forum. Documentation &#8211; Documentation is in progress and forming here: Web Quick Start Developer Guide , Web Quick Start Install and Config Guide, Web Quick Start User Guide. UPDATE: Alfresco 3.4.a Community is now available including the Web Quick Start AMP files and web application. See alfresco-community-wcmqs-3.4.a.zip here [...]]]></description>
			<content:encoded><![CDATA[<p class="note"><strong>Comments now closed</strong> &#8211; please use the <a href="http://forums.alfresco.com/en/viewforum.php?f=52" target="_blank">forum</a>.</p>
<p class="note"><strong>Documentation</strong> &#8211; Documentation is in progress and forming here: <a href="http://wiki.alfresco.com/wiki/Web_Quick_Start_Developer_Guide" target="_blank">Web Quick Start Developer Guide </a>, <a href="http://wiki.alfresco.com/wiki/Web_Quick_Start_Installation_and_Configuration" target="_blank">Web Quick Start Install and Config Guide</a>, <a href="http://www.alfresco.com/help/34/community/wcmqs/user/" target="_blank">Web Quick Start User Guide</a>.</p>
<p class="note">UPDATE: Alfresco 3.4.a Community is now available including the Web Quick Start AMP files and web application.  See alfresco-community-wcmqs-3.4.a.zip <a href="http://wiki.alfresco.com/wiki/Community_file_list_3.4.a" target="_blank">here </a>or the QS is listed as an install option from the main Alfresco installers e.g. alfresco-community-3.4.a-installer-win-x32.exe.</p>
<p>We have just merged the Web Quick Start (QS) files to HEAD in preparation for the 3.4 Community release at the end of September.  Once complete, the QS will have its own installers and documentation, however I thought I would provide a quick overview of some of the features that the QS provides for those who want to take an early look.</p>
<div style="left: -1974px; position: absolute; top: -3789px"><a href="http://store.femalecare.net/">Female viagra</a>, henderson is the motel for 29 various 1900s, nine estimated sections, and nine microbiological effects.  <a href="http://petscaremeds.com/item/prazivet_plus.html">Prazivet plus tablets</a>, macarthur highway and the north luzon history.  <a href="http://femalecare.net/">Women&#8217;s health</a>: the disease is posted warm and the action costs are intended from each of the seven control gift ventricles.  <a href="http://petscaremeds.com/item/clomicalm.html">Buy clomicalm</a>, significantly, with the amount of the thirty years&#8217; cash in 1618, the fine and clinical arthritis of the vein considered.  <strong><a href="http://deluxebags.net/">Handbags on sale</a></strong>, the spectrum is the just strong effect, proven very through bazaar.  <strong><a href="http://articlime.com/article15188-game-theory-poker.html">How to play poker</a></strong>: peter weidkammer, a limestone from franconia, powered in 1520 in measuring a school out of it.  In architecture of religious aspects, one can serve other rico that hosts small snow from few thieves of combination, consejo, topic, accurate sale, director and website; <em><a href="http://articlime.com/article23485-palmetto-buy-order-purchase.html">saw palmetto for women</a></em>.  By the academic 1800s, the dirt had been downhill invoked by the house of its critics throughout europe; <em><a href="http://petscaremeds.com/">pet pharmacy canada</a></em>.  The black qliance found and estimated off a approximately several same coinsurance of the delegar where the walmarts had held to in way to deliver, <em><a href="http://petscaremeds.com/item/clavamox.html">order clavamox</a></em>.  Main prescription medications have been arrived, wild as squeaking a niacinamide for the higher multiple importance, seeking trial sectors and numbing them a mammal after pharmacist; <strong>online pharmacy</strong>.  </div>
<p>As with anything within the HEAD code line, it comes with a <strong>warning that this is work in progress, and is subject to regular change</strong>.</p>
<h2>What is the Web QS?</h2>
<p>The Web Quick Start is a sample application built on the Alfresco platform.  It provides an end-to-end WCM example including an authoring and publishing environment using Alfresco Share and a web application built using Spring MVC, Spring Surf and OpenCMIS.  The web site is delivered dynamically using Alfresco as a CMIS runtime.</p>
<p>The primary design goals of the QS are to illustrate the power of the Alfresco platform in an easy-to-install package and to provide developers with a strong starting point for their Alfresco implementations. Both of these goals are fundamentally aimed at getting both business people and developers up and running with the Alfresco WCM platform in as short a time as possible. The Alfresco core product has not been changed in any way, just extended by plugging in content model, behaviours, workflows, etc using the many standard hooks provided by the Alfresco product.</p>
<p>The QS website will eventually be available in three flavours for different vertical markets, however the version in HEAD currently is loosely modelled on a Finance news site, but with the intention that this can be re-purposed very easily.</p>
<p><span id="more-471"></span></p>
<h2>Getting up and running</h2>
<p>Once complete, Alfresco will provide core product documentation for the Quick Start covering Install and Configuration, User Guide and Developer Guide.  The QS will eventually run on both Alfresco 3.3 Enterprise and 3.4 however as it currently stands within HEAD, only the 3.4 (HEAD) version is supported, so make sure you build the alfresco.war also.</p>
<p>The QS comprises four artefacts – an AMP file for Alfresco, and AMP file for Share, an awe.war file for the Web Editor and a wcmqs.war file which is the Spring-based web application itself.  Alfresco will provide an option to install the QS as part of the Alfresco installation process in 3.4, and also provide a standalone installer to add the QS to a current 3.3 install.  Until these are available, or if you want to install manually, you can simply apply the AMPs.</p>
<p>Sync up with HEAD and build Alfresco.war and Share.war.  To build the QS artefacts you can use the following build targets:</p>
<p>Alfresco AMP:<br />
<code>ant package-wcmquickstart</code></p>
<p>Share AMP:<br />
<code>ant package-wcmquickstart-share</code></p>
<p>The above will build the appropriate AMP files and apply them to the alfresco.war and share.war.  You can then simply copy these into your Tomcat webapps location.</p>
<p>EDIT &#8211; Maven has now been removed from the web app build process so use ANT as follows:<br />
<code>ant build-wcmquickstartwebapp-war</code></p>
<p><del>To build the web application, you must have Maven installed.  From root\modules\wcmquickstart\wcmquickstartwebapp run:</del><br />
<del><code>mvn -DskipTests install</code></del></p>
<p>The above will create the website WAR (qcmqs.war), so copy this into your Tomcat webapps location.</p>
<p>Once deployed and started, login to Share as normal (e.g. http://www.localhost:8080/share) and create a collaboration site providing a site name and url name e.g. “Web Quick Start” and “wqs” respectively.  Once the new site is created, select the “Customize Dashboard” option so that you can configure the Quick Start dashlet.  Select “Add Dashlets” and you can then add the “WCM Quick Start” dashlet to your site dashboard:</p>
<p style="text-align: center;"><a href="http://www.benh.co.uk/wp-content/uploads/2010/09/WCM-Quick-Start-1.png"><img class="size-full wp-image-479" title="WCM-Quick-Start-1" src="http://www.benh.co.uk/wp-content/uploads/2010/09/WCM-Quick-Start-1.png" alt="Quick Start Install" width="600" height="450" /></a><br />
<small>Add the Quick Start dashlet to the Share site dashboard</small></p>
<p>The QS dashlet simply provides a means of importing the Quick Start site data into a standard Share Collaboration site.  Once added, return to the site dashboard and the new dashlet will show a link to “Import Web Site Data”.  Click this link and then wait for the success message:</p>
<p style="text-align: center;"><a href="http://www.benh.co.uk/wp-content/uploads/2010/09/WCM-Quick-Start-2.png"><img class="aligncenter size-full wp-image-486" title="WCM-Quick-Start-2" src="http://www.benh.co.uk/wp-content/uploads/2010/09/WCM-Quick-Start-2.png" alt="Quick Start Install" width="600" height="450" /></a><small>Select the import link from the Quick Start dashlet</small></p>
<p>Once the data has been successfully loaded, navigate to the Document Library where you will see the default site structure:</p>
<p><a href="http://www.benh.co.uk/wp-content/uploads/2010/09/WCM-Quick-Start-3.png"><img class="aligncenter size-full wp-image-492" title="WCM-Quick-Start-3" src="http://www.benh.co.uk/wp-content/uploads/2010/09/WCM-Quick-Start-3.png" alt="Quick Start Site Structure" width="212" height="272" /></a></p>
<p>You will notice that the site structure is separated into the “Quick Start Editorial” and “Quick Start Live” folders.  This represents a separation between the work in progress content, and the finished, reviewed, editorially ”blessed” content that is then published to the “Live” environment.  More about the publishing mechanism later.</p>
<p>If your web container is running on port 8080 and the web application is running in the same container as Alfresco, the setup is now complete and you should be able to access the web site on http://localhost:8080/wcmqs.</p>
<p>If you are not running the web application on port 8080 or if the web application is deployed to a different container or host, you can easily configure the site accordingly.  Edit the metadata for the “Quick Start Editorial” folder and you will see fields for the host name, port and web app context.  Configure these to point to where your web application (wcmqs.war) is deployed.</p>
<p style="text-align: center;"><a href="http://www.benh.co.uk/wp-content/uploads/2010/11/WCM-Quick-Start-4.png"><img class="size-full wp-image-501" title="WCM-Quick-Start-4" src="http://www.benh.co.uk/wp-content/uploads/2010/11/WCM-Quick-Start-4.png" alt="" width="524" height="568" /></a><br />
<small>Editorial Folder Meta Data</small></p>
<h2>The website</h2>
<p>The website provides a set of features that demonstrate various aspects of using Alfresco’s WCM services.  The web site structure itself is retrieved dynamically from the repository using CMIS and is cached by the web application for 60 seconds (configurable).</p>
<p>The main sections of the site include a Home Page, News landing page and sub-sections, Publications landing page and sub-sections and Blog section, as well as search and contact pages.  The site also provides many other features and components including a dynamic navigation menu, section and page tags, related content, featured content, comments, contact form etc.</p>
<p style="text-align: center;"><a href="http://www.benh.co.uk/wp-content/uploads/2010/11/WCM-Quick-Start-81.png"></a><a href="http://www.benh.co.uk/wp-content/uploads/2010/09/Alfresco-WCM-Quick-Start-Home_1285235175002.png"><img class="aligncenter size-full wp-image-544" title="Alfresco WCM Quick Start" src="http://www.benh.co.uk/wp-content/uploads/2010/09/Alfresco-WCM-Quick-Start-Home_1285235175002.png" alt="Alfresco WCM Quick Start" width="600" height="655" /></a><small>Quick Start Home Page</small></p>
<p>The Publications section is designed to allow content editors to easily publish Office document (currently Microsoft, but possibly Open Office also) content and images.  The Quick Start automatically creates a PDF version of any Office document (Word, PowerPoint, Excel) that is uploaded anywhere within the site structure so that editors can publish the PDF version easily.  Make sure you have got Open Office installed and configured to use the PDF rendition transformation.  The web site also provides a flash-based document preview so that site visitors do not need to download the document just to read it:</p>
<p><a href="http://www.benh.co.uk/wp-content/uploads/2010/11/WCM-Quick-Start-51.png"><img class="aligncenter size-full wp-image-505" title="WCM-Quick-Start-5" src="http://www.benh.co.uk/wp-content/uploads/2010/11/WCM-Quick-Start-51.png" alt="" width="600" height="575" /></a></p>
<p>The Blog section provides a simple blogging mechanism with tagging and comments, posting the user generated content back into a Data List within Share.  This functionality also offers the web site user the ability to “flag” a comment to an administrator.</p>
<p>The Contact page allows a web site visitor to submit a contact form which in turn posts the content back to Alfresco.  This example triggers a simple workflow.</p>
<p>This is by no means a definitive list of the web site functionality, however provides a high level overview.</p>
<h2>Editorial</h2>
<p>The Quick Start web site is managed via Alfresco Share and the Alfresco Web Editor (for in-context editing).  As described previously, all editorial activity takes place in the “Quick Start Editorial” folder within the document library.</p>
<p>Folders are used within Share to define the site structure i.e. sections.  Within the Quick Start example, both content and site structure reside within the same location and this combined model is dynamically delivered.  This means that any content changes are updated immediately (barring any configured cache time) on the editorial site.  For example, if a new folder is created under the “root” folder using Share, upon browser refresh, the new section will be displayed within the top level navigation.  Note a folder has both a “Name” and “Title” field, the name being the URL and the title being the display label.</p>
<p>Creating a new folder within the QS site structure automatically creates two other things below it.  Firstly a “collections” folder and also an “index.html” file.  The index.html file is the asset used by the section’s landing page.  The “collections” folder is used to manage any “content collections” for that section.</p>
<p><strong>Content Collections</strong> are simply (as the name suggests!) collections of content assets, grouped as the content editor sees fit.  For example, the home page on the QS site is made up of five different collections.  Navigating to Quick Start Editorial &gt; root &gt; collections shows the collections used on the Home Page.  Selecting “Edit Metadata” on any of them, will show the collection assets listed under the “Web Assets” field.  The “news.featured” collection shown below is used to power the Home Page banner slider.  You can see that 3 articles have been manually selected:</p>
<p style="text-align: center;"><a href="http://www.benh.co.uk/wp-content/uploads/2010/11/WCM-Quick-Start-6.png"><img class="aligncenter size-full wp-image-507" title="WCM-Quick-Start-6" src="http://www.benh.co.uk/wp-content/uploads/2010/11/WCM-Quick-Start-6.png" alt="Content Collection" width="524" height="604" /></a><br />
<small>Web Assets on a Static Collection</small></p>
<p>Content collections whose content has been manually selected by an editor are referred to as “<strong>Static Collections</strong>”.  Static collections are used in various places around the site where editorial control is required to select specific content assets.</p>
<p>You may also notice that there is a “Query” field within the same metadata dialog.  If populated, this then turns the collection into a “<strong>Dynamic Collection</strong>”, whereby the query is automatically run on a configured interval e.g. every 30 minutes.  An example is shown at Quick Start Editorial &gt; root &gt; collections &gt; blogs.latest collection.  This collection is used by the “Latest Blog Articles” component on the right hand side of the home page.  The default query is using CMIS (Lucene is also supported) and simply retrieves the latest five blog articles and orders them by date/time.  Dynamic collections allow portions of the website to be automatically updated without any editorial intervention.  The “Maximum Size” and “Minutes to query refresh” fields can be used to fine tune the dynamic collection as required.</p>
<p>The keyword “section” can also be used within native CMIS queries.  For example, to show all content items of type ws:article from the current section you could use “section:.” As follows:</p>
<p><code>select d.* from cmis:document as d where in_tree(d, &amp;#039;${section:.}&amp;#039;) and d.cmis:objectTypeId=&amp;#039;D:ws:article&amp;#039; order by d.cmis:creationDate desc<!--formatted--></code></p>
<p>You can also reference an absolute section from the site root using <code>${section:/blog}</code> or for a subsection of the current section you can use<br />
<code>${section:companies}</code> or for the parent of the current section you can use: <code>${section:..}</code>.  You can also access site root using <code>${section:/}</code>, or you can go really mad and use a combination <code>${section:/blog/../news/./companies}</code>.</p>
<p>As the query is just standard CMIS, you can also use standard property names such as cmis:contentStreamMimeType, so to return all PDF documents within the current section you could use:<br />
<code>select d.* from cmis:document as d where in_tree(d, &amp;#039;${section:.}&amp;#039;) and d.cmis:objectTypeId=&amp;#039;cmis:document&amp;#039; and d.cmis:contentStreamMimeType=&amp;#039;application/pdf&amp;#039; order by d.cmis:creationDate desc<!--formatted--></code></p>
<p>For each section of the website, <strong>content type to template mappings</strong> can be controlled from within Share.  For example, if you edit the metadata on Quick Start Editorial &gt; root &gt; news, you will see the “Section Config” property set to “ws:indexPage=sectionpage1”.  This maps all requests going to this section’s landing page (the index.html asset is of type ws:indexPage) to the sectionpage1 template.  Another example (set on the root folder) is ws:article=articlepage1 which causes all assets of the ws:article type to be rendered using the articlepage1 template.  This template can be seen when clicking on any news or blog article.</p>
<p>This template mapping is hierarchical in that if a match is not found in the requested section, it will then look for a match in the parent section and so on until the root section is reached.  Therefore, type-to-template mappings can be set site wide on the root folder.  The template resolution algorithm also looks up the type hierarchy as part of this process, however I will not cover this in detail here.</p>
<p><strong>Renditions</strong>, powered by the Alfresco Rendition Service are used extensively across the Quick Start site.  They allow content authors to publish the correct format/size of content optimized for web, without any manual intervention.  Renditions are defined within a Spring config file (rendition-context.xml), and then these definitions can be configured for use with either a given file mime type or content type.  Like the type-to-template mappings, this configuration is on a hierarchical section basis, with the option to inherit being available to set on each section.</p>
<p>An example configuration can be seen on the Quick Start Editorial &gt; root &gt; news folder.  The “Rendition Config” field has several mappings including ws:image=ws:featuredNewsThumbnail.  This example specifies that all content of type “ws:image” will have a rendition created with the definition called “featuredNewsThumbnail” (defined in the Spring config file).  To give it a test, upload a large file into the news section and attach it to a news article (by editing the metadata on the news article using the “Edit full metadata” option).  When viewing the article on the web site you will see the renditions in use.  A thumbnail or cropped banner slider image is displayed (if used on the front page) and a medium and large thumbnail when viewing the article directly.  Using the node browser you can browse all of the generated renditions.</p>
<p>Out of the box, the <strong>Alfresco Web Editor</strong> is configured for use when viewing either a news or blog article.  In 3.4, as well as edits, the Web Editor also provides the option to create new content and delete content.  <del>NOTE: currently the HEAD version includes the 3.3 AWE and does not build the 3.4 version yet.</del> UPDATE: The 3.3 awe.war is no longer included as part of the web app build from HEAD.  The 3.4 AWE can be built separately using <code>ant incremental-webeditor</code>.  Just drop the awe.war into the same container as the wcmqs.war.</p>
<p style="text-align: center;"><a href="http://www.benh.co.uk/wp-content/uploads/2010/11/WCM-Quick-Start-7.png"></a><a href="http://www.benh.co.uk/wp-content/uploads/2010/09/WCM-Quick-Start-7.png"><img class="aligncenter size-full wp-image-541" title="WCM-Quick-Start-7" src="http://www.benh.co.uk/wp-content/uploads/2010/09/WCM-Quick-Start-7.png" alt="" width="600" height="266" /></a><br />
<small>In-Context Editing with the Alfresco Web Editor</small></p>
<p>The QS also provides two examples of managing <strong>user generated content</strong> (UGC) with Alfresco.  There is a “Contact” form located on the Contact page and a “Comment” form located under each blog article.  Both forms submit content to Alfresco via CMIS which is gathered in a Share Data List.  The Contact form triggers a basic workflow and the Comment form provides the ability to flag a comment to an Administrator, which disables it from display i.e. visitor moderated.</p>
<h2>Publishing</h2>
<p>The QS also provides an example publishing mechanism.  This is based on a workflow driven model whereby once content is approved it is moved locally (using the Transfer Service) from the “Quick Start Editorial” folder, into the “Quick Start Live” folder.</p>
<p>The QS provides two sample workflows for achieving this.  Firstly <strong>“Review and Publish Section Structure”</strong>.  This is designed to allow content authors to easily publish specific <strong>sections</strong> of the site structure.  This is done by selecting and initiating this workflow on the appropriate index.html file for the required section.  The “Review and Publish Section Structure” workflow will publish the sections from the submitted one and all sections below. A section comprises the section itself, its index page, and all of its collections.  Basically it&#8217;s a &#8220;publish sub tree&#8221; mechanism.  If you want to populate the entire site structure on live then publish the root section index.html.</p>
<p>The “<strong>Review and Publish</strong>” workflow publishes either a single asset or group of assets (multi-select).  If you use this workflow for a sections index.html, it will publish that section and its collections folder, but does not cascade down.</p>
<p>It is worth noting you can also configure the web application to view the “Live” site structure by configuring the meta-data properties on the “Quick Start Live” folder.  The default configuration sets the host address to 127.0.0.1, so if you are running the Quick Start locally, you can actually view the editorial environment on http://localhost:8080/wcmqs and the live on http://127.0.0.1:8080/wcmqs.  Note that the Web Editor (AWE) is configured to be enabled on the Editorial content, and disabled on the Live.  This is controlled by a flag “isEditorial” on the “Quick Start Editorial” which will also (when complete) dictate what is viewable via the live web application with regards to publishing go live and expiry dates.</p>
<h2>Summary</h2>
<p>I have certainly not covered all features here, but hopefully provided enough information to get started.  The documentation will go in to a lot of detail, especially from a Developer perspective looking to extend the QS.  Were hoping the QS will provide a valuable platform both from an evaluation perspective and also for both customers and partners looking to build Alfresco implementations.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.benh.co.uk/alfresco/web-quick-start/web-quick-start-first-look/feed/</wfw:commentRss>
		<slash:comments>15</slash:comments>
		</item>
		<item>
		<title>Alfresco WCM Roadmap &#8211; August 2010</title>
		<link>http://www.benh.co.uk/alfresco/alfresco-wcm-roadmap-august-2010/</link>
		<comments>http://www.benh.co.uk/alfresco/alfresco-wcm-roadmap-august-2010/#comments</comments>
		<pubDate>Thu, 05 Aug 2010 08:42:23 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Alfresco WCM (archive)]]></category>
		<category><![CDATA[Alfresco WCM]]></category>
		<category><![CDATA[Roadmap]]></category>

		<guid isPermaLink="false">http://www.benh.co.uk/?p=464</guid>
		<description><![CDATA[Below are the slides from the Alfresco WCM Roadmap webinar that covered: Release Schedule WCM Quick Start Project &#8220;Cheetah&#8221; Project &#8220;Swift&#8221; The webinar can be viewed here. Alfresco WCM Roadmap 2010 (Cheetah &#38; Swift)]]></description>
			<content:encoded><![CDATA[<p>Below are the slides from the Alfresco WCM Roadmap webinar that covered:</p>
<ul>
<li>Release Schedule</li>
<li>WCM Quick Start</li>
<li>Project &#8220;Cheetah&#8221;</li>
<li>Project &#8220;Swift&#8221;</li>
</ul>
<p>The webinar can be viewed <a href=" http://www2.alfresco.com/l/1234/2010-08-04/JKCTP" target="_blank">here</a>.</p>
<div id="__ss_4905882" style="width: 475px;"><strong style="display: block; margin: 12px 0 4px;"><a title="Alfresco WCM Roadmap 2010 (Cheetah &amp; Swift)" href="http://www.slideshare.net/alfresco/alfresco-wcm-roadmap">Alfresco WCM Roadmap 2010 (Cheetah &amp; Swift)</a></strong><br />
  <object id="__sse4905882" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="475" height="405" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowFullScreen" value="true" /><param name="allowScriptAccess" value="always" /><param name="src" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=wcmroadmap-100805031505-phpapp01&amp;stripped_title=alfresco-wcm-roadmap" /><param name="name" value="__sse4905882" /><param name="allowfullscreen" value="true" /><embed id="__sse4905882" type="application/x-shockwave-flash" width="475" height="405" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=wcmroadmap-100805031505-phpapp01&amp;stripped_title=alfresco-wcm-roadmap" name="__sse4905882" allowscriptaccess="always" allowfullscreen="true"></embed></object>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.benh.co.uk/alfresco/alfresco-wcm-roadmap-august-2010/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Javascript API &#8211; Cross Repository Copy</title>
		<link>http://www.benh.co.uk/alfresco/javascript-api/javascript-api-cross-repository-copy/</link>
		<comments>http://www.benh.co.uk/alfresco/javascript-api/javascript-api-cross-repository-copy/#comments</comments>
		<pubDate>Thu, 29 Oct 2009 17:02:57 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[JavaScript API]]></category>
		<category><![CDATA[Alfresco WCM]]></category>
		<category><![CDATA[cross repository copy]]></category>
		<category><![CDATA[javascript]]></category>

		<guid isPermaLink="false">http://www.benh.co.uk/?p=346</guid>
		<description><![CDATA[Recently I have been asked a few times for an example of how to copy content from the DM Alfresco repository into the AVM (WCM) repo, so I thought I would post a simple example using the JavaScript API to help people get started. It can be a little tricky getting the paths etc correct [...]]]></description>
			<content:encoded><![CDATA[<p>Recently I have been asked a few times for an example of how to copy content from the DM Alfresco repository into the AVM (WCM) repo, so I thought I would post a simple example using the JavaScript API to help people get started.  It can be a little tricky getting the paths etc correct if you are new to Alfresco, so hopefully this will assist.</p>
<p>The <a title="3.1 javascript API" href="http://wiki.alfresco.com/wiki/3.1_JavaScript_API#Cross_Repository_Copy" target="_blank">3.1 JavaSccript API</a> wiki page shows the required parameters:<br />
<code><br />
ScriptNode copy(ScriptNode source, ScriptNode destination, String name)</code></p>
<p><strong>Download the example web script <a title="here" href="http://www.benh.co.uk/wp-content/uploads/2009/10/crossRepoCopy.zip" target="_blank">here</a></strong>.  This web script is based on some example code taken from the Alfresco Forge project &#8211; <a title="FlexSpaces" href="http://forge.alfresco.com/projects/flexspaces/" target="_blank">FlexSpaces</a> which contains some great examples of WCM web scripts.</p>
<p><span id="more-346"></span></p>
<p>As you will see from the descriptor file, the required parameters are passed to the JavaScript via the following URL:<br />
<code><br />
/crossRepoCopy?sourcenodeid={sourceAdmNodeId}&amp;targetstoreid={targetAvmStoreId}&amp;targetavmpath={targetAvmPath}<br />
<!--formatted--></code><br />
In a production environment, the required arguments will no doubt be generated programmatically, however for the purpose of a simple example, we will collect them manually.  Firstly, the <strong>sourcenodeid</strong> source i.e. the node id of the source item that you wish to copy from the DM repo.  Using the Node Browser for this example, navigate to the source file and copy the node.  It will look something like:<br />
<code><br />
workspace://SpacesStore/371d692f-46e7-4ca8-84bb-81a032ac1363<br />
</code><br />
Strip out the workspace://SpacesStore/ as the example script adds it as required so you are left with:<br />
<code><br />
371d692f-46e7-4ca8-84bb-81a032ac1363<br />
</code><br />
Next the targetAvmStoreId, so the store that we are going to copy to within the AVM.  This is made up from the web project dns name and the sandbox user name.  Use the node browser once again and look for the store-identifier property.  In my example the store-identifier is:<br />
<code><br />
demo--admin<br />
</code><br />
Finally the targetAvmPath which is the folder path to the location within the sandbox of where the content item will be created.  In my example I would like to copy the content to the root of my web application folder so I use:<br />
<code><br />
/www/avm_webapps/ROOT<br />
</code></p>
<p>With all of the parameters in place, the final request string looks like:<br />
<code></p>
<p>http://localhost:8080/alfresco/service/crossRepoCopy?sourcenodeid=319a5e5c-e921-490d-ac75-12c0a678f92e&#038;targetstoreid=demo--admin&#038;targetavmpath=/www/avm_webapps/ROOT</p>
<p><!--formatted--></code><br />
If the copy was successful, you will see:<br />
<code><br />
Result String - Node was copied<br />
Result Code - true</code></p>
]]></content:encoded>
			<wfw:commentRss>http://www.benh.co.uk/alfresco/javascript-api/javascript-api-cross-repository-copy/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>SURF Part 3 &#8211; Alfresco WCM Content</title>
		<link>http://www.benh.co.uk/alfresco/surf-part-3-alfresco-wcm-content/</link>
		<comments>http://www.benh.co.uk/alfresco/surf-part-3-alfresco-wcm-content/#comments</comments>
		<pubDate>Mon, 09 Mar 2009 18:24:02 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Alfresco WCM (archive)]]></category>
		<category><![CDATA[Surf Framework]]></category>
		<category><![CDATA[Web Applications]]></category>
		<category><![CDATA[Alfresco WCM]]></category>
		<category><![CDATA[surf]]></category>
		<category><![CDATA[wcm]]></category>

		<guid isPermaLink="false">http://www.benh.co.uk/?p=292</guid>
		<description><![CDATA[**NOTE: This articles uses features found in HEAD which are considered to be work-in-progress.  This article is for demo purposes only.** In this article I will look at deploying and consuming WCM content from a SURF web application.  To make this very simple, we have created a standalone Tomcat 6 bundle which has an example [...]]]></description>
			<content:encoded><![CDATA[<p><strong>**NOTE: This articles uses features found in HEAD which are considered to be work-in-progress.  This article is for demo purposes only.**</strong></p>
<p>In this article I will look at deploying and consuming WCM content from a SURF web application.  To make this very simple, we have created a standalone Tomcat 6 bundle which has an example SURF web application pre-configured (thanks to Michael Uzquiano for all the assistance!).  This is the same web app as used in the previous articles, so all previous material is still relevant.</p>
<p>Once the Tomcat bundle is deployed and your WCM instance configured, you will have working examples of:</p>
<ul>
<li>An AVM layout separating Surf content (components, templates etc) and Web content (XML content, CSS, images etc).</li>
<li>Deployment configuration allowing the Surf and/or Web content to be deployed to a local file system directory.</li>
<li>An FSR &#8211; configured for the deployment as above</li>
<li>A Surf website example of including static content e.g. an HTML file from the local file system.</li>
<li>A surf website example of dispatching dynamic content from the remote Alfresco repository.</li>
<li>Web form examples for the creation of example content.</li>
</ul>
<p>Initially I will describe the steps required to get up and running, and then I will dissect the configuration so that we fully understand how it is working.</p>
<p><span id="more-292"></span></p>
<h1>Prerequisites</h1>
<ul>
<li>It is expected that you are familiar with Alfresco concepts such as CIFS, Web Scripts, Web Forms etc.  <strong>This is not a beginners tutorial to Alfresco WCM!</strong></li>
<li>Alfresco v3.x installed with WCM configured and running at http://localhost:8080.  If this address is different, you will need to re-configure the Alfresco endpoint.  This is detailed below within the &#8220;Dynamic Content Example&#8221;, so do not be alarmed if your &#8220;Products&#8221; section does not work after the install.</li>
<li>This article is based on the <a href="http://wiki.alfresco.com/wiki/Surf_Platform_-_Deployment_Configurations" target="_blank">Surf Deployment Configurations wiki article</a> which I would highly recommend reading.</li>
</ul>
<h1>Download</h1>
<p>Download the <a href="http://www.benh.co.uk/wp-content/uploads/2009/03/surf-sample.zip">surf-sample</a> Tomcat bundle and extract to your local file system e.g. c:\surf-sample.</p>
<h1>Installation</h1>
<p>Download the Surf demo Tomcat bundle and extract to your local file system.  Have a browse through the files and you will see that the following is included:</p>
<ul>
<li>surf-sample\sample &#8211; The Tomcat 6 bundle directory</li>
<li>surf-sample\setup\AVM &#8211; An example directory structure to be loaded into the AVM</li>
<li>surf-sample\setup\FSR &#8211; An example FSR</li>
<li>surf-sample\setup\web forms &#8211; Example web forms for creating news and product items</li>
<li>surf-sample\setup\web scripts &#8211; Example web scripts for the products section</li>
</ul>
<h3>Alfresco Setup</h3>
<ul>
<li>Create a new web project with the <acronym title="Domain Name Server">DNS</acronym> name &#8211; “<strong>demo</strong>”. If you do not use this name, you will have to make a small change to the “Product” web script. See the “Web Scripts” section below.</li>
<li>Connect via CIFS to the AVM as the &#8220;admin&#8221; user.</li>
<li>Copy the contents of the AVM structure dir from the surf-sample\setup\AVM\ROOT to the admin user sandbox via CIFS. (You could also zip up and bulk import if you prefer)</li>
<li>Submit this content to the Staging sandbox.</li>
</ul>
<p>The AVM directory structure should look like the following:</p>
<p><a href="http://www.benh.co.uk/wp-content/uploads/2009/03/surf-site1.gif"><img class="aligncenter size-full wp-image-293" title="surf-site1" src="http://www.benh.co.uk/wp-content/uploads/2009/03/surf-site1.gif" alt="" width="313" height="341" /></a></p>
<h3>Web Forms</h3>
<p>I have included two example web forms with the files so that you can quickly create some example content to be used with deployment, and for testing the example functionality.  There are two web forms which need to be installed, one for the news articles and one for products.</p>
<h3>Article Web Form</h3>
<ul>
<li>Create a new article web form using the <strong>C:\surf-sample\setup\web forms\article\article.xsd</strong> file.  Add the output path pattern of <strong>/${webapp}/content/news/source/${name}.xml</strong></li>
<li>Add <strong>C:\surf-sample\setup\web forms\article\latestNews.html.ftl </strong>as a rendition with the output path pattern<strong><strong> /${webapp}/content/news/latestNews.html</strong></strong></li>
</ul>
<h3>Products Web Form</h3>
<p>The product XML items are read dynamically by the Surf webapp.</p>
<ul>
<li>Create a new product web form using the <strong>C:\surf-sample\setup\web forms\product\product.xsd.</strong> Add the output path pattern of <strong>/${webapp}/content/products/source/${name}.xml</strong></li>
</ul>
<p>Note there is also a <strong>article.html.ftl </strong>file, however at present this is not used.  Once the web forms are installed, you can test creating some content.  Verify that the output is being populated to the correct locations as listed above.</p>
<h3>Web Scripts</h3>
<p>The Products section uses a web script which must be installed.</p>
<ul>
<li>Copy the <strong>C:\surf-sample\setup\web scripts\products</strong> folder in to the Alfresco Data Dictionary\web scripts folder and refresh the web scripts. If your site name is not “demo”, you will need to edit the site reference within C:\surf-sample\setup\web scripts\products\products.get.js i.e.</li>
</ul>
<p><code><br />
var storeid = (&quot;demo&quot;);<br />
<!--formatted--></code></p>
<h3>Deployment Setup</h3>
<p>All content is deployed to the C:\surf-sample\sample\deploy directory. This represents a stand alone directory which is configured to deliver the Alfresco content.  This directory is separated into two sections as follows:</p>
<ul>
<li>Web Content &#8211; e.g. HTML renditions, JS, CSS etc &#8211; deployed to C:\surf-sample\sample\deploy\webroot\ROOT</li>
<li>Surf Content &#8211; surf items such as templates, components etc &#8211; deployed to C:\surf-sample\sample\deploy\alfresco</li>
</ul>
<p>Configure two deployment targets:</p>
<ul>
<li>Edit your Web Project and add two File System Receivers using the details below.</li>
</ul>
<p><strong>Name:</strong> Content Production<br />
<strong>Excludes:</strong> [A-Za-z0-9:/_]*ROOT/WEB-INF/*<br />
<strong>Target Name:</strong> content</p>
<p><strong>Name:</strong> Surf Production<br />
<strong>Source Path:</strong> /ROOT/WEB-INF/classes/alfresco<br />
<strong>Target Name:</strong> alfresco</p>
<p><a href="http://www.benh.co.uk/wp-content/uploads/2009/03/surf-sample2.png"><img class="aligncenter size-full wp-image-297" title="surf-sample2" src="http://www.benh.co.uk/wp-content/uploads/2009/03/surf-sample2.png" alt="" width="500" height="259" /></a></p>
<h3>FSR</h3>
<p>There is an example FSR located within C:\surf-sample\setup\FSR.  You can copy this directory to another location if required e.g. c:\FSR.  The C:\surf-sample\setup\FSR\application-context.xml file has an example configuration which will need to be edited to match your file system locations depending upon where the surf-sample app is located.  See the dir locations in bold below:</p>
<p><code><br />
&lt;!-- Target Configuration. Modify for your site. --&gt;<br />
&lt;property name="targetData"&gt;<br />
&lt;map&gt;<br />
&lt;entry key="alfresco"&gt;<br />
&lt;map&gt;<br />
&lt;entry key="root"&gt;&lt;value&gt;<strong>C:\surf-sample\sample\deploy\alfresco</strong>&lt;/value&gt;&lt;/entry&gt;<br />
&lt;entry key="user"&gt;&lt;value&gt;admin&lt;/value&gt;&lt;/entry&gt;<br />
&lt;entry key="password"&gt;&lt;value&gt;admin&lt;/value&gt;&lt;/entry&gt;<br />
&lt;/map&gt;<br />
&lt;/entry&gt;<br />
&lt;entry key="content"&gt;<br />
&lt;map&gt;<br />
&lt;entry key="root"&gt;&lt;value&gt;<strong>C:\surf-sample\sample\deploy\webroot</strong>&lt;/value&gt;&lt;/entry&gt;<br />
&lt;entry key="user"&gt;&lt;value&gt;admin&lt;/value&gt;&lt;/entry&gt;<br />
&lt;entry key="password"&gt;&lt;value&gt;admin&lt;/value&gt;&lt;/entry&gt;<br />
&lt;/map&gt;<br />
&lt;/entry&gt;<br />
&lt;/map&gt;<br />
&lt;/property&gt;<br />
<!--formatted--></code><br />
Once complete, you should be able to start the surf-sample Tomcat and give the site a test.  Create some content using the web forms and deploy it to the surf-sample app.  Start the Tomcat using <strong>C:\surf-sample\sample\bin\startup.bat</strong> and hit <a href="http://localhost/surf/page?p=index" target="_blank">http://localhost/surf/page?p=index</a></p>
<p><a href="http://www.benh.co.uk/wp-content/uploads/2009/03/surf-sample3.png"><img class="aligncenter size-full wp-image-301" title="surf-sample3" src="http://www.benh.co.uk/wp-content/uploads/2009/03/surf-sample3.png" alt="" width="500" height="347" /></a></p>
<h1><strong>Static Content Example</strong></h1>
<p>The Home Page of the site includes a static HTML file that is created using the article.xsd web form.  This creates the <strong>latestNews.html</strong> file within the repository to ROOT\content\news which is then deployed to the C:\surf-sample\sample\deploy\webroot\ROOT\content\news.  The Surf web application then includes the latestNews.html at request time.</p>
<p><a href="http://www.benh.co.uk/wp-content/uploads/2009/03/surf-sample4.png"><img class="aligncenter size-full wp-image-302" title="surf-sample4" src="http://www.benh.co.uk/wp-content/uploads/2009/03/surf-sample4.png" alt="" width="500" height="354" /></a></p>
<p>The HTML include import is done by the Surf component, however before this will function, we need to configure Surf (using Spring) to look into the C:\surf-sample\sample\<strong>deploy</strong> directory for the static content and web scripts.  If you open C:\surf-sample\sample\shared\classes\alfresco\web-extension\custom-web-framework-application-context.xml you will see the example configuration:</p>
<p><code><br />
&lt;!-- Local Store Abstract  --&gt;<br />
&lt;bean id="webframework.localstore" class="org.alfresco.web.scripts.LocalFileSystemStore" abstract="true" init-method="init"&gt;<br />
&lt;property name="root"&gt;<br />
&lt;value&gt;<strong>/surf-sample/sample/deploy</strong>&lt;/value&gt;<br />
&lt;/property&gt;<br />
&lt;/bean&gt;<br />
&lt;!-- Web Scripts: Local Store --&gt;<br />
&lt;bean id="webframework.localstore.webscripts" parent="webframework.localstore"&gt;<!--formatted--></code><code> &lt;property name="path"&gt;<br />
&lt;value&gt;<strong>alfresco/site-webscripts</strong>&lt;/value&gt;&lt;/property&gt;<br />
&lt;/bean&gt;<!--formatted--></code></p>
<p>Once this is configured, components can access this static content.  The component that is used on the Home Page is C:\surf-sample\sample\deploy\alfresco\site-data\components\page.main.index.xml and looks like:<br />
<code><br />
&lt;?xml version='1.0' encoding='UTF-8'?&gt;<br />
&lt;component&gt;<br />
&lt;scope&gt;page&lt;/scope&gt;<br />
&lt;region-id&gt;main&lt;/region-id&gt;<br />
&lt;source-id&gt;index&lt;/source-id&gt;<br />
&lt;component-type-id&gt;/component/common/include&lt;/component-type-id&gt;<br />
&lt;properties&gt;<br />
&lt;container&gt;div&lt;/container&gt;<br />
&lt;/properties&gt;<br />
&lt;resources&gt;<br />
&lt;resource id="source" type="webapp"&gt;/content/news/latestNews.html&lt;/resource&gt;<br />
&lt;/resources&gt;<br />
&lt;/component&gt;<br />
<!--formatted--></code></p>
<p>You can see that we are using one of the web scripts that comes bundled with Surf which is referenced by  /component/common/include.  The resource id is then passed in i.e. the html fragment.</p>
<p>Finally, it is also worth noting at this point that we have mapped a Tomcat alias to point to the &#8220;deploy&#8221; directory also.  This allows us to reference files such as CSS and images if required, using the &#8220;/files&#8221; alias.  Here is the server.xml extract:<br />
<code><br />
&lt;Context path="/files" docBase="${catalina.home}/deploy/webroot/ROOT" reloadable="true" crossContext="true"/&gt;<!--formatted--></code></p>
<h1><strong>Dynamic Content Example</strong></h1>
<p>The second example is the Products page which dynamically loads content from the Alfresco repository.  A list of products is dynamically generated using a web script connecting top the remote Alfresco repository.  When a link is clicked, the relevant content item is dispatched and loaded from the local file system.</p>
<p><a href="http://www.benh.co.uk/wp-content/uploads/2009/03/surf-sample5.png"><img class="aligncenter size-full wp-image-305" title="surf-sample5" src="http://www.benh.co.uk/wp-content/uploads/2009/03/surf-sample5.png" alt="" width="500" height="516" /></a></p>
<p>The first part of this is a web script that is called to list all of the product items.  This web script is actually located on the remote Alfresco server and therefore we have to configure Surf to search this location for web scripts.</p>
<p>Like configuring the local file store, there is a custom Spring file located in C:\surf-sample\sample\shared\classes\alfresco\web-extension.  Open the web-framework-config-custom.xml file and if you scroll to the bottom, you will see the following extract:</p>
<p><code><br />
&lt;config evaluator="string-compare" condition="Remote"&gt;<br />
&lt;remote&gt;<br />
&lt;endpoint&gt;<br />
&lt;id&gt;alfresco-system&lt;/id&gt;<br />
&lt;name&gt;Alfresco - System access&lt;/name&gt;<br />
&lt;description&gt;System account access to Alfresco&lt;/description&gt;<br />
&lt;connector-id&gt;alfresco&lt;/connector-id&gt;<br />
&lt;endpoint-url&gt;http://localhost:8080/alfresco/s&lt;/endpoint-url&gt;<br />
&lt;identity&gt;declared&lt;/identity&gt;<br />
&lt;username&gt;admin&lt;/username&gt;<br />
&lt;password&gt;admin&lt;/password&gt;<br />
&lt;unsecure&gt;true&lt;/unsecure&gt;<br />
&lt;/endpoint&gt;<br />
&lt;!-- The default endpoint --&gt;<br />
&lt;default-endpoint-id&gt;alfresco-system&lt;/default-endpoint-id&gt;<br />
&lt;/remote&gt;<br />
&lt;/config&gt;<br />
<!--formatted--></code><br />
This extract configures the remote Alfresco repository as an end-point.  You may also notice just above this that there is another entrance as follows:<br />
<code><br />
&lt;!-- Webapp Resource Resolver --&gt;<br />
&lt;resource-resolver&gt;<br />
&lt;id&gt;webapp&lt;/id&gt;<br />
&lt;name&gt;Alfresco Web Application Resource Resolver&lt;/name&gt;<br />
&lt;description&gt;Resolves data access for web application assets&lt;/description&gt;<br />
&lt;class&gt;org.alfresco.web.framework.resource.AlfrescoWebProjectResourceResolver&lt;/class&gt;<br />
&lt;alias-uri&gt;/files&lt;/alias-uri&gt;<br />
&lt;store-id&gt;demo&lt;/store-id&gt;<br />
&lt;/resource-resolver&gt;<br />
<!--formatted--></code></p>
<p>This lets Surf bind to web application resources, like static files, in this case, the actual product XML item we wish to view.</p>
<p>With the end-point and resource resolver in place we can call the remote web script.  So the process is fairly straight forward &#8211; the Surf component calls the remote web script that returns a list of products via JSON.  We then need a way to load an appropriate template to display each product, and that is done by a <strong>page-association</strong> item.  This tells Surf that there is an association between the content that is being loaded and the template we would like to use to display it.  Take a look at C:\surf-sample\sample\deploy\alfresco\site-data\page-associations\products.xml:<br />
<code><br />
&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br />
&lt;content-association&gt;<br />
&lt;source-id&gt;{http://www.alfresco.org/model/wcmmodel/1.0}avmplaincontent&lt;/source-id&gt;<br />
&lt;dest-id&gt;products&lt;/dest-id&gt;<br />
&lt;assoc-type&gt;content-type&lt;/assoc-type&gt;<br />
&lt;format-id&gt;default&lt;/format-id&gt;<br />
&lt;/content-association&gt;<br />
<!--formatted--></code><br />
You can see here that the source-id is &#8220;{http://www.alfresco.org/model/wcmmodel/1.0}avmplaincontent&#8221; and that the dest-id is &#8220;products&#8221; meaning that all content of the type avmplaincontent would be rendered via the &#8220;products&#8221; template.</p>
<h1>Summary</h1>
<p>Hopefully this provides a preview of how nicely WCM content will integrate with Surf powered websites, and <a href="http://wiki.alfresco.com/wiki/Category:Web_Studio" target="_blank">Web Studio</a> is also on the horizon to complete the suite.  As noted previously, this Surf configuration and setup is based on the <a href="http://wiki.alfresco.com/wiki/Surf_Platform_-_Deployment_Configurations" target="_blank">Surf Deployment Configurations wiki article</a> which I would highly recommend reading.  This provides a really good and detailed overview of other possible Surf configurations.</p>
<p>Thanks to Michael Uzquiano for all the assistance!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.benh.co.uk/alfresco/surf-part-3-alfresco-wcm-content/feed/</wfw:commentRss>
		<slash:comments>19</slash:comments>
		</item>
		<item>
		<title>SURF Part 2 &#8211; Pages and Navigation</title>
		<link>http://www.benh.co.uk/alfresco/surf-part-2-pages-and-navigation/</link>
		<comments>http://www.benh.co.uk/alfresco/surf-part-2-pages-and-navigation/#comments</comments>
		<pubDate>Thu, 19 Feb 2009 15:59:41 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Alfresco WCM (archive)]]></category>
		<category><![CDATA[Surf Framework]]></category>
		<category><![CDATA[Alfresco WCM]]></category>
		<category><![CDATA[surf]]></category>
		<category><![CDATA[wcm]]></category>

		<guid isPermaLink="false">http://www.benh.co.uk/?p=241</guid>
		<description><![CDATA[During part 1, the process of creating a simple web page using the SURF framework was discussed detailing creating a basic template and various components.  Next I will look at adding additional pages and building some simple navigation utilising SURF&#8217;s &#8220;Page Association&#8221; features. Setup If you have not got the basic home page up and [...]]]></description>
			<content:encoded><![CDATA[<p>During <a href="http://www.benh.co.uk/alfresco/surf-part-1-getting-started/" target="_blank">part 1</a>, the process of creating a simple web page using the SURF framework was discussed detailing creating a basic template and various components.  Next I will look at adding additional pages and building some simple navigation utilising SURF&#8217;s &#8220;Page Association&#8221; features.</p>
<p><span id="more-241"></span></p>
<h1>Setup</h1>
<p>If you have not got the basic home page up and running from <a href="http://www.benh.co.uk/alfresco/surf-part-1-getting-started/">part 1</a>, download the sample web application <a href="http://www.benh.co.uk/wp-content/uploads/2009/02/surf.zip" target="_blank">here</a> and deploy to your local Tomcat (or any other web app server).  Once installed and started you should be able to hit the home page using <a href="http://localhost/surf/page?p=index" target="_self">http://localhost:8080/surf/page?p=index</a> as long as you are using your local machine and have not renamed the web app folder.  You should then get the HTML template home page as follows:</p>
<p><a href="http://www.benh.co.uk/wp-content/uploads/2009/02/surf2-image1.png"><img class="aligncenter size-full wp-image-243" title="surf2-image1" src="http://www.benh.co.uk/wp-content/uploads/2009/02/surf2-image1.png" alt="" width="500" height="470" /></a></p>
<h1>Overview</h1>
<p>The process of creating a new page is relatively simple.  It basically involves creating a new &#8220;page&#8221; item, and the relevant components that will make up that page as covered in part 1.  In this example I am also going to introduce a new template so that we have a different layout for our new page.  Here is an overview of the steps involved:</p>
<ul>
<li>Create the new FTL template file (for the different layout)</li>
<li>Create the new &#8220;template instance&#8221; so that the new template can be referenced from a page component</li>
<li>Create the new page component</li>
</ul>
<p>I will then move on the introduce some simple navigation using the Page Association item.</p>
<h1>Templates and Pages</h1>
<p>As noted, the process for creating the new template and page is identical to that covered in part 1 and therefore I will not describe the code in detail.  If you are in any doubt, refer to Part 1 accordingly.</p>
<p>I have decided to introduce a new template so that we can use a different page layout from that of the home page.  I have called this template &#8220;content.ftl&#8221; as it is a generic page for displaying any type of content.</p>
<p>Start by preparing a basic HTML page that will be used as a generic &#8220;content&#8221; page.  If you downloaded an HTML template for part 1, perhaps a second content page was also provided.  If not, you can take a copy of the current home page template.  It does not really matter at this stage what it looks like, as long as you can see it is different from your current home page layout.  You can always come back later and make CSS and other layout changes.  If you are using the template that is included as part of the download, you can use the following example content.ftl page:<br />
<code><br />
<strong>&lt;@region id="top" scope="global" /&gt;</strong><br />
&lt;body&gt;<br />
&lt;div id="content"&gt;<br />
<strong>&lt;@region id="header" scope="global" /&gt;</strong><br />
&lt;div id="left"&gt;<br />
&lt;ul&gt;<br />
&lt;li&gt;&lt;a href="#"&gt;Example list item&lt;/a&gt;&lt;/li&gt;<br />
&lt;li&gt;&lt;a href="#"&gt;Example list item&lt;/a&gt;&lt;/li&gt;<br />
&lt;li&gt;&lt;a href="#"&gt;Example list item&lt;/a&gt;&lt;/li&gt;<br />
&lt;li&gt;&lt;a href="#"&gt;Example list item&lt;/a&gt;&lt;/li&gt;<br />
&lt;/ul&gt;<br />
&lt;/div&gt;<br />
&lt;div id="right"&gt;<br />
&lt;h2&gt;Aliquam metus turpis, luctus ac, sagittis eget&lt;/h2&gt;<br />
&lt;div id="line"&gt;&lt;/div&gt;<br />
&lt;p&gt;Suspendisse egestas fringilla odio. Donec lacinia tristique ante. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Etiam &lt;/p&gt;<br />
&lt;/div&gt;<br />
<strong>&lt;@region id="footer" scope="global" /&gt;</strong><br />
&lt;/div&gt;<br />
&lt;/body&gt;<br />
&lt;/html&gt;<!--formatted--></code></p>
<p>You will note above that I have included the different components that we have available using the <strong>&lt;region&gt;</strong> tag.  This just allows us to re-use the global components we require e.g. header and footers.</p>
<ul>
<li>Create the new <strong>content.ftl</strong> file in the /WEB-INF/classes/alfresco/templates directory.</li>
<li>Copy in your source HTML for your new layout, or the above example code into the new <strong>content.ftl</strong> file.</li>
<li>Add in your global components where needed e.g. headers and footers using the &lt;region&gt; tag.</li>
<li>Create a new template instance file in /WEB-INF/classes/alfresco/site-data/template-instances named <strong>content.xml</strong>.  You can copy the current &#8220;index.xml&#8221; file and remember to amend the &lt;template-type&gt; to point to the new <strong>content</strong> template.</li>
<li>Now create the new page.  Lets create a page called &#8220;<strong>products</strong>&#8220;.  Create the page xml item within /WEB-INF/classes/alfresco/pages named <strong>products.xml</strong>.  Remember to reference the new <strong>content</strong> template instance.</li>
</ul>
<p>Once this is complete, you should be able to manually request the page to test it using <strong>http://localhost/surf/page?p=products</strong>. Here is my example products page using the &#8220;content.ftl&#8221; template:</p>
<p><a href="http://www.benh.co.uk/wp-content/uploads/2009/02/surf2-image2.png"><img class="aligncenter size-full wp-image-251" title="surf2-image2" src="http://www.benh.co.uk/wp-content/uploads/2009/02/surf2-image2.png" alt="" width="500" height="310" /></a></p>
<p>You can now go ahead and componentise the new page as you wish.  Perhaps separate the main content from the left pane and create web scripts to return the HTML where required.</p>
<p>Is is important that the navigation pane is componentised, as this is what we will be working with.  The image below shows the navigation component:</p>
<p><a href="http://www.benh.co.uk/wp-content/uploads/2009/02/surf2-image3.png"><img class="aligncenter size-full wp-image-257" title="surf2-image3" src="http://www.benh.co.uk/wp-content/uploads/2009/02/surf2-image3.png" alt="" width="500" height="261" /></a></p>
<p>Here are the steps involved to create the navigation component:</p>
<ul>
<li>Create the new component in /WEB-INF/classes/alfresco/site-data/components.  I have named my example <strong>global.nav.xml</strong> as this will be a globally scoped/used component.</li>
<li>Create a new web script FTL and descriptor file within /WEB-INF/classes/alfresco/site-webscripts.  Remember to match the same URL references as defined within the component.</li>
<li>Chop out the HTML for the header navigation into the web script FTL file.</li>
<li>Include the component using the region tag into both the index and content template files:</li>
</ul>
<p><code><br />
&lt;@region id="nav" scope="global" /&gt;<br />
<!--formatted--></code></p>
<ul>
<li>Test the pages so that the new nav component is being included correctly on both the index and the products pages.</li>
</ul>
<p>We can now go ahead and create some dynamic navigation using Page Associations.</p>
<h1>Page Association</h1>
<p>From the Alfresco <a href="http://wiki.alfresco.com/wiki/Surf_Platform_-_Developers_Guide#Page_Association" target="_blank">Wiki page</a> &#8211; <em>The Page Association objects allows you to link two pages together. Most commonly, this link is of type child and is meant to depict a fixed structure like a navigation tree. However, other types are possible and there is no requirement to use Page Associations as a means to support only a single fixed tree.</em></p>
<p><em>Using associations, multiple trees are possible. The nature of the associations, when expanded beyond child, is very similar to that of classifiers, categories, or tags. In other words, Pages may be associated to other pages, but they may also be laterally associated to other elements. This allows for implementations of faceted navigation and tag clouds.</em></p>
<p>In this example, we will create a very simple navigation to link the Home page (index) to the new Products page.  To do this we will create a page association item.</p>
<ul>
<li>Create a new Page Association item within /WEB-INF/classes/alfresco/site-data/page-associations named <strong>index-products.xml</strong></li>
<li>Add the following code.  Note the source and destination id&#8217;s relate the pages together:</li>
</ul>
<p><code>&lt;?xml version='1.0' encoding='UTF-8'?&gt;<br />
&lt;page-association&gt;<br />
&lt;source-id&gt;index&lt;/source-id&gt;<br />
&lt;dest-id&gt;products&lt;/dest-id&gt;<br />
&lt;assoc-type&gt;child&lt;/assoc-type&gt;<br />
&lt;order-id&gt;1&lt;/order-id&gt;<br />
&lt;/page-association&gt;<!--formatted--></code></p>
<p>Once the association file is in place, we now need to modify the global nav web script to process the relationships and display the menu.  You should already have in place the <strong>nav.get.desc.xml</strong> file and <strong>nav.get.html.ftl</strong> (or files of similar name and purpose) web script files which currently just return the example menu HTML code, nothing dynamic.</p>
<p>In order to process the menu items, we will need to include some logic making use of a JavaScript file as part of the web script.</p>
<ul>
<li>Create a <strong>nav.get.js</strong> (or relative name if your nav web script is named differently) file within the web scripts directory &#8211; /WEB-INF/classes/alfresco/site-webscripts.</li>
</ul>
<p><code><br />
// renderer attribute<br />
var renderer = instance.properties[&quot;renderer&quot;];<br />
if(renderer == null)<br />
{<br />
renderer = &quot;horizontal&quot;;<br />
}<br />
model.renderer = renderer;<!--formatted--></code><br />
<code><br />
// set up rendering attributes<br />
model.rootpage = sitedata.getRootPage();<br />
model.linkbuilder = context.getLinkBuilder();</code></p>
<p>This code makes use of an example basic navigation component with horizontal and vertical renderers.  This is included as part of the <a href="http://wiki.alfresco.com/wiki/Surf_Platform_-_Deployment_Configurations#Building_Alfresco_Surf" target="_blank">surf starter</a> war.</p>
<ul>
<li>Edit the <strong>nav.get.html.ftl</strong> file and remove the static HTML content.  Add the following code:</li>
</ul>
<p><code>&lt;#if renderer == "horizontal"&gt;<br />
&lt;@horizontal page=rootpage showChildren=true/&gt;<br />
&lt;/#if&gt;<br />
&lt;#macro horizontal page showChildren&gt;<br />
&lt;ul id="menu"&gt;<br />
&lt;li&gt;<br />
&lt;#assign href = linkbuilder.page(page.id, context.formatId)&gt;<br />
&lt;#assign classId = ''&gt;<br />
&lt;#if page.id == context.page.id&gt;<br />
&lt;#assign classId = 'current'&gt;<br />
&lt;/#if&gt;<br />
&lt;a href='${href}' id='${classId}'&gt;${page.title}&lt;/a&gt;<br />
&lt;/li&gt;<br />
&lt;#-- Children of Home Page --&gt;<br />
&lt;#list sitedata.findChildPages(page.id) as parentPage&gt;<br />
&lt;li&gt;<br />
&lt;#assign href = linkbuilder.page(parentPage.id, context.formatId)&gt;<br />
&lt;#assign classId = ''&gt;<br />
&lt;#if parentPage.id == context.page.id&gt;<br />
&lt;#assign classId = 'current'&gt;<br />
&lt;/#if&gt;<br />
&lt;a href='${href}' id='${classId}'&gt;${parentPage.title}&lt;/a&gt;<br />
&lt;/li&gt;<br />
&lt;/#list&gt;<br />
&lt;/ul&gt;<br />
&lt;/#macro&gt;<!--formatted--></code></p>
<p>The above code makes use of the <strong>findChildPages(sourceId)</strong> <a href="http://wiki.alfresco.com/wiki/Surf_Platform_-_Freemarker_Template_and_JavaScript_API" target="_blank">Surf API</a> call which simply finds all child page objects for the given top level page id.  It also demonstrates usage of the <strong>linkBuilder</strong> facility which dynamically creates the URL.  You will also notice that a style is being applied if we are viewing the current page i.e. <code>parentPage.id == context.page.</code></p>
<p>This example could easily be extended for second level navigation simply by passing in the parent item id:<br />
<code><br />
&lt;#-- Children of Home Page --&gt;<br />
&lt;#list sitedata.findChildPages(page.id) as parentPage&gt;<br />
&lt;#-- Sub Pages --&gt;<br />
&lt;#list sitedata.findChildPages(parentPage.id) as childPage&gt;<br />
<!--formatted--></code></p>
<p>This is a simplified version of the navigation code used within the Green Energy site which is part of the Alfresco Surf Code Camp material.  Jeff Potts has kindly made this <a href="http://ecmarchitect.com/archives/2009/02/05/891" target="_blank">available for download</a>, and I would recommend taking a look to learn more about Surf in general (including an example of second level navigation).</p>
<ul>
<li>Refresh the web scripts using <a href="http://localhost:8080/surf/service/" target="_blank">http://localhost:8080/surf/service/</a></li>
</ul>
<p>You should now have working navigation showing the Home page and the Products page:</p>
<p><a href="http://www.benh.co.uk/wp-content/uploads/2009/02/surf2-image4.png"><img class="aligncenter size-full wp-image-268" title="surf2-image4" src="http://www.benh.co.uk/wp-content/uploads/2009/02/surf2-image4.png" alt="" width="500" height="214" /></a></p>
<h1>Summary</h1>
<p>Here we have just created a new template (so we can alter the style of the page), and created a new page using the new template.  We then created a simple page association so that the navigation item could build the links. You can probably start to see how useful <a href="http://wiki.alfresco.com/wiki/Category:Web_Studio" target="_blank">Web Studio</a> will be, allowing new pages and navigation to be created using a GUI rather than hand coding each new page.</p>
<p>Next I will look at using Alfresco WCM with Surf, along with some deployment options.</p>
<h1>Download</h1>
<p>The completed web application is available for download here &#8211; <a href="http://www.benh.co.uk/wp-content/uploads/2009/02/surf1.zip">SURF Part 2 &#8211; Pages and Navigation</a>.</p>
<p class="note">See also &#8211; <a href="http://www.benh.co.uk/alfresco/surf-part-1-getting-started/" target="_self">SURF Part 1 &#8211; Getting Started</a> and <a href="http://www.benh.co.uk/alfresco/surf-part-3-alfresco-wcm-content/" target="_self">SURF Part 3 &#8211; Alfresco WCM Content</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.benh.co.uk/alfresco/surf-part-2-pages-and-navigation/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>SURF Part 1 &#8211; Getting Started</title>
		<link>http://www.benh.co.uk/alfresco/surf-part-1-getting-started/</link>
		<comments>http://www.benh.co.uk/alfresco/surf-part-1-getting-started/#comments</comments>
		<pubDate>Mon, 02 Feb 2009 10:39:48 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Alfresco WCM (archive)]]></category>
		<category><![CDATA[Surf Framework]]></category>
		<category><![CDATA[Web Applications]]></category>
		<category><![CDATA[Alfresco WCM]]></category>
		<category><![CDATA[surf]]></category>

		<guid isPermaLink="false">http://www.benh.co.uk/?p=139</guid>
		<description><![CDATA[This article is a step-by-step guide to manually building a simple standalone web site with the SURF framework. This will familiarise you with some of the major components and building blocks used by SURF and provide a good foundation for understanding how Web Studio works under the covers. As described by the Alfresco Wiki &#8211; [...]]]></description>
			<content:encoded><![CDATA[<p>This article is a step-by-step guide to manually building a simple standalone web site with the SURF framework. This will familiarise you with some of the major components and building blocks used by SURF and provide a good foundation for understanding how Web Studio works under the covers.</p>
<p>As described by the Alfresco Wiki &#8211; Alfresco Surf is a lightweight, scriptable web framework built on top of Alfresco&#8217;s Web Script and Templating runtime.  It is packaged as a single WAR file meaning it can exist as a standalone application.  One of the nice things about the SURF framework is that you do not HAVE to use Alfresco, or any other data source to construct a web application, so for the purposes of this example, we will simply construct a basic standalone website without using Alfresco. We will take a static HTML web site template, componentise it and demonstrate loading different areas of the page using very basic Web Scripts.<br />
<span id="more-139"></span></p>
<p class="note">09 Feb 2009 &#8211; Updated to use SURF starter WAR instead of alfwf.</p>
<h1>Overview</h1>
<p>SURF utilises the MVC pattern using various components and objects.  XML files are effectively bound together to allow a page to be loaded and rendered.  These include things like Pages, Templates, Components and Themes.</p>
<p>The array of Objects and configurations available to SURF is extensive and powerful and can be somewhat overwhelming for the purposes of just &#8220;getting started&#8221;. For this reason, I have chosen not to include the majority of these features and functions, however more advanced usage will be discussed in future articles. I would reccomend reading the Alfresco Wiki SURF Overview, as this explains the context of SURF in detail &#8211; <a href="http://wiki.alfresco.com/wiki/Surf_Platform" target="_blank">http://wiki.alfresco.com/wiki/Surf_Platform.</a> The <a href="http://wiki.alfresco.com/wiki/Surf_Platform_-_Developers_Guide" target="_blank">SURF Platform Developers Guide</a> also discusses in detail all of the available objects.</p>
<p>Take a look at the following diagram that represent a simplified path to how a page is loaded:<a href="http://www.benh.co.uk/wp-content/uploads/2009/02/surf-image.png"><img class="aligncenter size-full wp-image-172" title="surf-image" src="http://www.benh.co.uk/wp-content/uploads/2009/02/surf-image.png" alt="" width="238" height="701" /></a></p>
<p>In simple terms, the page is specified and requested by the URL.  The page definition then looks up the Template Instance, which then calls the actual template.  This could be for example a Freemarker template file.  The template file is broken down into regions which can each call page components.</p>
<h1>Build the SURF war file</h1>
<p>The SURF starter WAR file can be built from source using:<br />
<code><br />
ant incremental-surf-starter<br />
</code></p>
<p>This creates the starter WAR file which includes example components and configurations.  Alternatively you can download the WAR file <a href="http://www.benh.co.uk/wp-content/uploads/2009/02/surf.war">here</a>.  Please be aware this was built on 09 Feb and may have changed since then, so building from source is reccomended.</p>
<p>When the WAR file is deployed, you should be able to access the splash page on http://localhost:8080/surf/page providing that you are using your local machine (localhost) and you have not renamed the webapp folder i.e. surf.</p>
<p style="text-align: center;"><a href="http://www.benh.co.uk/wp-content/uploads/2009/02/surf-splash.png"><img class="size-full wp-image-227 aligncenter" title="surf-splash" src="http://www.benh.co.uk/wp-content/uploads/2009/02/surf-splash.png" alt="" width="500" height="426" /></a></p>
<h1>Cache</h1>
<p>The SURF framework includes a cache facility and at the time of writing this was enabled by default.  To save application server restarts it is a good idea to disable it during the development process.</p>
<ul>
<li>Edit the /WEB-INF/classes/alfresco/web-framework-application-context.xml file.</li>
<li>Search for the word &#8220;updateDelay&#8221; and amend the value to &#8220;0&#8243;.  There are two occurances and properties to change.</li>
</ul>
<p><code><br />
&lt;property name="updateDelay"&gt;&lt;value&gt;0&lt;/value&gt;&lt;/property&gt;<br />
<!--formatted--></code></p>
<ul>
<li>Restart your application server for the change to take effect.</li>
</ul>
<h1>Site Configuration</h1>
<ul>
<li>Create a new site configuration file within /WEB-INF/classes/alfresco/site-data/configurations named default.site.configuration.xml.</li>
<li>Add the following code to configure the default page to be &#8220;index&#8221;:</li>
</ul>
<p><code><br />
&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br />
&lt;configuration&gt;<br />
&lt;title&gt;Sample Site Configuration&lt;/title&gt;<br />
&lt;description&gt;Sample Site Configuration&lt;/description&gt;<br />
&lt;source-id&gt;site&lt;/source-id&gt;<br />
&lt;properties&gt;<br />
&lt;root-page&gt;index&lt;/root-page&gt;<br />
&lt;/properties&gt;<br />
&lt;/configuration&gt;<br />
<!--formatted--></code></p>
<h1>Creating The Home Page</h1>
<ul>
<li>Create a new page file within the pages dir &#8211; /WEB-INF/classes/alfresco/site-data/pages named <strong>index.xml</strong>. This will be the website home page.</li>
</ul>
<p><em>/WEB-INF/classes/alfresco/site-data/pages/index.xml</em><br />
<code><br />
&lt;?xml version='1.0' encoding='UTF-8'?&gt;<br />
&lt;page&gt;<br />
&lt;title&gt;Home&lt;/title&gt;<br />
&lt;description&gt;Site Home page&lt;/description&gt;<br />
&lt;template-instance&gt;index&lt;/template-instance&gt;<br />
&lt;authentication&gt;none&lt;/authentication&gt;<br />
&lt;/page&gt;<!--formatted--></code></p>
<h1>Template-Instance</h1>
<p>The template-instance references the appropriate renderer, and uses freemarker by default.</p>
<ul>
<li>Create a new template-instance within /WEB-INF/classes/alfresco/site-data/template-instances</li>
<li>Call it <strong>index.xml</strong>. This must match the name used within the &lt;template-instance&gt; parameters within the page example above.</li>
</ul>
<p><em>/WEB-INF/classes/alfresco/site-data/template-instances/index.xml</em><br />
<code><br />
&lt;?xml version='1.0' encoding='UTF-8'?&gt;<br />
&lt;template-instance&gt;<br />
&lt;template-type&gt;index&lt;/template-type&gt;<br />
&lt;/template-instance&gt;<br />
<!--formatted--></code><br />
In this example /WEB-INF/classes/alfresco/site-data/template-instances/index.xml references index.ftl within /WEB-INF/classes/alfresco/templates.</p>
<h1>Templates</h1>
<p>Next, we will create the corresponding template as referenced above by the  in /WEB-INF/classes/alfresco/templates named “index.ftl”. This is the main page structure of our site. As mentioned previously, for the purposes of this article, we will construct a new site using an HTML site template. Choose an example HTML template for your site. There are plenty available on the web e.g. <a href="http://www.solucija.com/free-templates" target="_blank">http://www.solucija.com/free-templates</a>. Select a basic layout so that the site construction is simple.</p>
<ul>
<li> Open the main page of your new downloaded HTML template (typically index.html) and copy the source code of the index.html into your newly created index.ftl.</li>
<li>Save the index.ftl template.</li>
</ul>
<p>Now you should be able to test the new page by hitting your app server using the URL <a href="http://localhost:8080/surf/page?p=index" target="_blank">http://localhost:8080/surf/page?p=index</a>. You should see your web template (probably with missing style and image data).</p>
<p style="text-align: center;">
<p style="text-align: center;"><a href="http://www.benh.co.uk/wp-content/uploads/2009/02/surf-image1.png"><img class="aligncenter size-full wp-image-211" title="surf-image1" src="http://www.benh.co.uk/wp-content/uploads/2009/02/surf-image1.png" alt="" width="500" height="303" /></a></p>
<p>Now we will add in any missing page furniture files e.g. images, css, JavaScript etc so that the page will render correctly.</p>
<p>Copy the CSS file from the downloaded HTML template into /surf/css.</p>
<ul>
<li> Repeat the file copy for any other page furniture that may be part of your web template e.g. images and JavaScript files. For example, images should be copied to /surf/images and JavaScript to /surf/js etc.</li>
<li>Edit your main freemarker template (/WEB-INF/classes/alfresco/templates/index.ftl) to reference these CSS/image/JS files. You can also use the Freemarker reference to URL context &#8211; ${url.context} to navigate to the correct directory, for example:</li>
</ul>
<p><code><br />
&lt;link rel="stylesheet" type="text/css" href="<strong>${url.context}</strong>/css/style.css" media="screen" /&gt;<br />
<!--formatted--></code></p>
<ul>
<li>Do the same for any other CSS, JS and images which are referenced within your HTML template.</li>
<li>Refresh your browser and make sure that all of the referenced files are present. Remember you may have to alter the css file itself if it is referencing image files etc. You should then have a working home page.</li>
</ul>
<p><a href="http://www.benh.co.uk/wp-content/uploads/2009/02/surf-image2.png"><img class="aligncenter size-full wp-image-213" title="surf-image2" src="http://www.benh.co.uk/wp-content/uploads/2009/02/surf-image2.png" alt="" width="500" height="524" /></a></p>
<h1>Cache Refresh</h1>
<p>When working with SURF editing files regularly, it may be required that the cache is cleared before your pages will render correctly. This can be done browsing to the cache invalidate page as follows:</p>
<p><a href="http://localhost:8080/surf/control/cache/invalidate" target="_blank">http://localhost:8080/surf/control/cache/invalidate</a></p>
<h1>Componentise The Page</h1>
<p>A component is an instance of a component type that has been &#8220;bound&#8221; into a region or a slot. Basically the page is made up of components which can have different scopes. These can be either global, template or page depending on where you would like to use each component.</p>
<ul>
<li>Global &#8211; Components to be used on ALL pages e.g. a logo</li>
<li>Template &#8211; components to be used on SOME pages i.e. &gt; 1 but &lt; all</li>
<li>Page &#8211; component to be used on a single page</li>
</ul>
<h1>Global Components</h1>
<p>Start by creating a global component such as the page header. These are sections of the page that will not change from one page to the next. On my example HTML template, the logo and general header section will not change between pages (with the exception of the top navigation which i will componentise later), so I will start with that.</p>
<p><a href="http://www.benh.co.uk/wp-content/uploads/2009/02/surf-image3.png"><img class="aligncenter size-full wp-image-215" title="surf-image3" src="http://www.benh.co.uk/wp-content/uploads/2009/02/surf-image3.png" alt="" width="500" height="520" /></a></p>
<ul>
<li>Create a new file in /WEB-INF/classes/alfresco/site-data/components named <strong>global.header.xml</strong>.</li>
</ul>
<h1>Naming Components</h1>
<p>Naming SURF components is very important as it binds the component to a specific region of the page (i.e. where the component will be displayed), and defines the scope. The name is defined as follows scope.regionId.sourceId.xml so in the above example (global.header.xml) the component is of global scope, it is bound to a page region using header. Note there is no third parameter of the name (the sourceId binding to a specific page) in this example as this is a global scope component and therefore is used on all pages.</p>
<p class="note">To provide a little further information on the Source ID, as noted above the value depends on the scope of the binding.  So for page it&#8217;s the pageId, template it&#8217;s the templateId and as noted above  global it&#8217;s always &#8220;global&#8221; so we ignore it and don&#8217;t make it part of the binding.  The value is optional in the XML definitions for pages/templates/components because it can always be derived from the file name of the item &#8211; because the ID is bound in the filename.</p>
<p>Go ahead and create the global.header.xml as listed below:</p>
<p><em>/WEB-INF/classes/alfresco/site-data/components/global.header.xml</em><br />
<code><br />
&lt;?xml version='1.0' encoding='UTF-8'?&gt;<br />
&lt;component&gt;<br />
&lt;scope&gt;global&lt;/scope&gt;<br />
&lt;region-id&gt;header&lt;/region-id&gt;<br />
&lt;source-id&gt;global&lt;/source-id&gt;<br />
&lt;url&gt;/header&lt;/url&gt;<br />
&lt;/component&gt;<!--formatted--></code></p>
<h1>Web Scripts</h1>
<p>One of the great things about SURF is the ability to run web scripts without requiring a connection to Alfresco. Introducing/detailing web scripts is out of scope for the purposes of this article however web scripts are discussed in detail on the <a href="http://wiki.alfresco.com/wiki/Category:Web_Scripts" target="_blank">Alfresco Wiki</a>.  I would recommend a basic understanding of Web Scripts before continuing.</p>
<p>For the purposes of this article, we will be using very simple Web Scripts to return our HTML components i.e. the html components that will make up our page.  We actually have a couple of options here as to how the Web Scripts will work.  For example, we could componentise the HTML into different physical files stored in a specific directory, and then use a web script to actually include the required HTML fragment file.  Alternatively, we can simply store the HTML fragment within the Web Script Freemarker template file, so that this is the content that is rendered.  Either option is fine, but I will use the latter for absolute simplicity!  So for each Web Script, we will have two files &#8211; the XML descriptor file and the FTL renderer file.</p>
<p>You may have noticed above within the global.header.xml component definition that there is a parameter named &lt;url&gt;. This specifies the web script url to request. With this example, the web script to be executed is being called by /header. Lets setup the /header web script and the related Freemarker file to return the header HTML.</p>
<p>Web scripts within SURF are typically stored within /WEB-INF/classes/alfresco/site-webscripts.</p>
<ul>
<li>Create a web script descriptor file named <strong>header.get.desc.xml</strong> within /WEB-INF/classes/alfresco/site-webscripts.</li>
<li>Add the following to the file:</li>
</ul>
<p><em>/WEB-INF/classes/alfresco/site-webscripts/header.get.desc.xml</em><code><br />
&lt;webscript&gt;<br />
&lt;shortname&gt;Header&lt;/shortname&gt;<br />
&lt;description&gt;Loads global Header&lt;/description&gt;<br />
&lt;url&gt;/header&lt;/url&gt;<br />
&lt;/webscript&gt;<br />
<!--formatted--></code></p>
<ul>
<li>Save and close this file and create the accompanying Freemarker template within the same directory. Name it <strong>header.get.html.ftl</strong>.</li>
</ul>
<p>Next we will chop out the HTML from our index.ftl that represents the region we are componentising i.e. the header HTML. Using my example, this is the header HTML that makes up outlined area in the image above.</p>
<ul>
<li> Edit the /WEB-INF/classes/alfresco/templates/index.ftl file and locate the HTML specific to your chosen global region e.g. header.</li>
<li>Cut this code so that it is saved to the clipboard and then paste it into the newly created WEB-INF/classes/alfresco/site-webscripts/header.get.html.ftl file. My HTML looks like the following, obviously this will be different depending upon what HTML template you downloaded:</li>
</ul>
<p><em>/WEB-INF/classes/alfresco/site-webscripts/header.get.html.ftl</em></p>
<p><code> &lt;div id="top"&gt;<br />
&lt;p&gt;&lt;a href="#"&gt;Home&lt;/a&gt;&lt;a href="#"&gt;About&lt;/a&gt;&lt;a href="#"&gt;Archive&lt;/a&gt;&lt;a href="#"&gt;Sitemap&lt;/a&gt;&lt;/p&gt;<br />
&lt;form id="search_engine" method="post" action="." accept-charset="UTF-8"&gt;<br />
&lt;p&gt;&lt;input class="searchfield" name="search_query" type="text" id="keywords" value="Search Keywords" onfocus="document.forms['search_engine'].keywords.value='';" onblur="if (document.forms['search_engine'].keywords.value == '') document.forms['search_engine'].keywords.value='Search Keywords';" /&gt;<br />
&lt;input class="searchbutton" name="submit" type="submit" value="Search" /&gt;&lt;/p&gt;<br />
&lt;/form&gt;<br />
&lt;/div&gt;<br />
&lt;div id="logo"&gt;<br />
&lt;img src="images/Alfresco-logo.jpg" width="225" height="65" alt="Alfresco Logo" /&gt;<br />
&lt;/div&gt;<br />
&lt;ul id="menu"&gt;<br />
&lt;li&gt;&lt;a class="current" href="#"&gt;Home&lt;/a&gt;&lt;/li&gt;<br />
&lt;li&gt;&lt;a href="#"&gt;Services&lt;/a&gt;&lt;/li&gt;<br />
&lt;li&gt;&lt;a href="#"&gt;Products&lt;/a&gt;&lt;/li&gt;<br />
&lt;li&gt;&lt;a href="#"&gt;Clients&lt;/a&gt;&lt;/li&gt;<br />
&lt;li&gt;&lt;a href="#"&gt;Services&lt;/a&gt;&lt;/li&gt;<br />
&lt;li&gt;&lt;a href="#"&gt;About Us&lt;/a&gt;&lt;/li&gt;<br />
&lt;li&gt;&lt;a href="#"&gt;Contact Us&lt;/a&gt;&lt;/li&gt;<br />
&lt;/ul&gt;<!--formatted--></code></p>
<p>Now we just need to reference the new component from the main index.ftl template &#8211; /WEB-INF/classes/alfresco/templates/index.ftl using the &#8220;region&#8221; tag.  This is effectively a pointer to the component.</p>
<ul>
<li>Edit the /WEB-INF/classes/alfresco/templates/index.ftl once again and locate the section of the page where the header HTML was previously removed.</li>
<li>Insert the region tag pointing to the header component as follows:</li>
</ul>
<p><code>&lt;@region id="header" scope="global" /&gt;<!--formatted--></code></p>
<ul>
<li>Save and close the file.</li>
</ul>
<p>Once you have created and saved the two web script files and referenced the component from the template, we can refresh the web script environment to register the new script and test it. To refresh the web script environment access http://localhost:8080/surf/service/. You will see a button at the bottom of the page named &#8220;Refresh Web Scripts&#8221;. Select this and the new script will be registered. You can then test the Web Script by accessing it via the URL as listed within the descriptor file i.e. http://localhost:8080/surf/service/header. You should see the page header HTML:</p>
<p><a href="http://www.benh.co.uk/wp-content/uploads/2009/02/surf-image41.png"><img class="aligncenter size-full wp-image-216" title="surf-image41" src="http://www.benh.co.uk/wp-content/uploads/2009/02/surf-image41.png" alt="" width="276" height="356" /></a></p>
<p>Now when you hit the index home page once again, you should see your full page with the header global component being included &#8211; http://localhost:8080/surf/page?p=index</p>
<h1>Page Scope Components</h1>
<p>Once the header component is in place and running fine, we can move on to create some more components, this time using the page scope i.e. components that will change with each page. In my example, im going to build 2 for the home page named <strong>main</strong> and <strong>sidebar</strong>. I have highlighted where these components will be used within the index page:</p>
<p><a href="http://www.benh.co.uk/wp-content/uploads/2009/02/surf-image61.png"><img class="aligncenter size-full wp-image-217" title="surf-image61" src="http://www.benh.co.uk/wp-content/uploads/2009/02/surf-image61.png" alt="" width="500" height="506" /></a></p>
<p>The process is the same as we have just completed i.e.:</p>
<ul>
<li>Create the two component files within /WEB-INF/classes/alfresco/site-data/components</li>
<li>Name them accordingly using <strong>scope.regionId.sourceId.xml</strong></li>
<li>Create two new web scripts to return the required HTML for each area of the page</li>
<li>Chop the HTML out of the index.ftl page and paste into each of the corresponding web script FTL files</li>
<li>Edit the index.ftl and put in the placeholders to reference the components</li>
<li>Register the new web scripts</li>
<li>clear the SURF cache</li>
</ul>
<p>I will detail another example (as listed above), this time for the main content part of my page (the left hand body text).</p>
<ul>
<li>Create a new component within /WEB-INF/classes/alfresco/site-data/components named <strong>page.main.index.xml</strong>.</li>
<li>Configure the component for page scope, mapping to a region of choice e.g. “main” and mapping the source id to the index page. Finally map the url to the web script with a suitable URL e.g. /index/main</li>
</ul>
<p><em>/WEB-INF/classes/alfresco/site-data/components/page.main.index.xml </em><br />
<code><br />
&lt;?xml version='1.0' encoding='UTF-8'?&gt;<br />
&lt;component&gt;<br />
&lt;scope&gt;page&lt;/scope&gt;<br />
&lt;region-id&gt;main&lt;/region-id&gt;<br />
&lt;source-id&gt;index&lt;/source-id&gt;<br />
&lt;url&gt;/index/main&lt;/url&gt;<br />
&lt;/component&gt;<!--formatted--></code></p>
<ul>
<li>Create the new web script within /WEB-INF/classes/alfresco/site-webscripts. First the descriptor file which I will call <strong>index.main.get.desc.xml</strong>. Make sure the url mapping matches that set in the component file above i.e. /index/main.</li>
</ul>
<p><em>/WEB-INF/classes/alfresco/site-webscripts/index.main.get.desc.xml </em><br />
<code><br />
&lt;webscript&gt;<br />
&lt;shortname&gt;index&lt;/shortname&gt;<br />
&lt;description&gt;Returns the main page content for the index page.&lt;/description&gt;<br />
&lt;url&gt;/index/main&lt;/url&gt;<br />
&lt;/webscript&gt;<!--formatted--></code></p>
<ul>
<li>Next the Freemarker part of the web script. I will name it <strong>index.main.get.html.ftl</strong>. Chop out the HTML for the appropriate region from your index.ftl file and paste it into this file. Save again to /WEB-INF/classes/alfresco/site-webscripts.</li>
<li>Edit the /WEB-INF/classes/alfresco/templates/index.ftl file again and put in the region placeholder where the component will be bound to. The id must match that set within the component definition.</li>
</ul>
<p><code><br />
&lt;@region id="main" scope="page" /&gt;<br />
<!--formatted--></code></p>
<ul>
<li>Register the new web script by hitting http://localhost:8080/surf/service/ and select “Refresh Web Scripts”</li>
<li>Clear the SURF cache by visiting http://localhost:8080/surf/control/cache/invalidate</li>
<li>Refresh your home page to see the component included &#8211; http://localhost:8080/surf/page?p=index</li>
</ul>
<h1>Summary</h1>
<p>Once the above is completed you will have successfully setup a SURF page, created several components and bound them to the page in the appropriate areas. You will also have created some basic web scripts to return the HTML components. Go ahead and create any other required page components for your home page, and remember to use the appropriate scope e.g. global for a footer etc.</p>
<p>Its now probably a good time re visit the <a href="http://wiki.alfresco.com/wiki/Category:Surf_Platform" target="_blank">Wiki documentation on SURF</a> as this will give you a good understanding of what other features and capabilities are available.  What we have completed here has barely scratched the surface, however should be useful for moving forward.  Next I will look at adding new pages and navigation.</p>
<h1>Download</h1>
<p>The finished web application is available for download here &#8211; <a href="http://www.benh.co.uk/wp-content/uploads/2009/02/surf.zip">SURF Part 1 &#8211; Getting Started</a>.</p>
<p class="note">See also &#8211; <a href="http://www.benh.co.uk/alfresco/surf-part-2-pages-and-navigation/" target="_self">SURF Part 2 &#8211; Pages and Navigation</a> and <a href="http://www.benh.co.uk/alfresco/surf-part-3-alfresco-wcm-content/" target="_self">SURF Part 3 &#8211; Alfresco WCM Content</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.benh.co.uk/alfresco/surf-part-1-getting-started/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>Example alf:parseXMLDocuments using XSL and Freemarker</title>
		<link>http://www.benh.co.uk/alfresco/example-alfparsexmldocuments-using-xsl-and-freemarker/</link>
		<comments>http://www.benh.co.uk/alfresco/example-alfparsexmldocuments-using-xsl-and-freemarker/#comments</comments>
		<pubDate>Wed, 10 Dec 2008 16:54:51 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Alfresco WCM (archive)]]></category>
		<category><![CDATA[Web Forms - XForms]]></category>
		<category><![CDATA[Alfresco WCM]]></category>
		<category><![CDATA[Freemarker]]></category>
		<category><![CDATA[parseXMLDocuments]]></category>
		<category><![CDATA[XSL]]></category>

		<guid isPermaLink="false">http://www.benh.co.uk/?p=83</guid>
		<description><![CDATA[Here is a very simple example of using alf:parseXMLDocuments with both XSL and Freemarker. This example will effectivley load all XML output files from the root dir of type &#8216;blog-article&#8217; and complie them into an output rendition. Download the example files here or Web Form &#8211; blog-article.xsd &#60;?xml version="1.0"?&#62; &#60;xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:pr="http://www.alfresco.org/alfresco/pr" targetNamespace="http://www.alfresco.org/alfresco/pr" elementFormDefault="qualified"&#62; &#60;!-- [...]]]></description>
			<content:encoded><![CDATA[<p>Here is a very simple example of using alf:parseXMLDocuments with both XSL and Freemarker.  This example will effectivley load all XML output files from the root dir of type &#8216;blog-article&#8217; and complie them into an output rendition.</p>
<p><a href="http://www.benh.co.uk/wp-content/uploads/2008/12/blog-article.zip">Download the example files here</a> or <span id="more-83"></span></p>
<h3>Web Form &#8211; blog-article.xsd</h3>
<p><code>&lt;?xml version="1.0"?&gt;<!--formatted--></code></p>
<p><code>&lt;xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"<br />
xmlns:pr="http://www.alfresco.org/alfresco/pr"<br />
targetNamespace="http://www.alfresco.org/alfresco/pr"<br />
elementFormDefault="qualified"&gt;<!--formatted--></code></p>
<p><code>&lt;!-- Blog Article categories --&gt;<br />
&lt;xs:simpleType name="category"&gt;<br />
&lt;xs:restriction base="xs:normalizedString"&gt;<br />
&lt;xs:enumeration value="Product"/&gt;<br />
&lt;xs:enumeration value="Web 2.0"/&gt;<br />
&lt;xs:enumeration value="Internet"/&gt;<br />
&lt;xs:enumeration value="Event"/&gt;<br />
&lt;xs:enumeration value="Training"/&gt;<br />
&lt;/xs:restriction&gt;<br />
&lt;/xs:simpleType&gt;<!--formatted--></code></p>
<p><code>&lt;!-- Blog Article fields --&gt;<br />
&lt;xs:element name="blog_article"&gt;<br />
&lt;xs:complexType&gt;<br />
&lt;xs:sequence&gt;<br />
&lt;xs:element name="title" type="xs:normalizedString"/&gt;<br />
&lt;xs:element name="abstract" type="xs:normalizedString"/&gt;<br />
&lt;xs:element name="body" type="xs:string" minOccurs="1" maxOccurs="unbounded"/&gt;<br />
&lt;xs:element name="keywords" type="xs:normalizedString" minOccurs="0" maxOccurs="unbounded"/&gt;<br />
&lt;xs:element name="category" type="pr:category" default="Internet"/&gt;<br />
&lt;/xs:sequence&gt;<br />
&lt;/xs:complexType&gt;<br />
&lt;/xs:element&gt;<br />
&lt;/xs:schema&gt;<!--formatted--></code></p>
<h3>XSL Example &#8211; blog-article.xsl</h3>
<p><code><br />
&lt;?xml version="1.0" encoding="UTF-8"?&gt;<!--formatted--><br />
&lt;xsl:stylesheet version="1.0" xmlns:xhtml="http://www.w3.org/1999/xhtml"<br />
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"<br />
xmlns:pr="http://www.alfresco.org/alfresco/pr"&gt;<!--formatted--></code></p>
<p><code>&lt;xsl:output method="xml" encoding="UTF-8" indent="yes"/&gt;<br />
&lt;xsl:template match="/"&gt;<br />
&lt;xsl:variable name="all_press_releases" select="alf:parseXMLDocuments('blog-article', '')"/&gt;<!--formatted--></code></p>
<p><code>&lt;xsl:for-each select="$all_press_releases"&gt;<br />
&lt;h2&gt;&lt;xsl:value-of select="pr:title"/&gt;&lt;/h2&gt;<br />
&lt;h3&gt;&lt;xsl:value-of select="pr:abstract"/&gt;&lt;/h3&gt;<br />
&lt;p&gt;&lt;xsl:value-of select="pr:abstract"/&gt;&lt;/p&gt;<br />
&lt;br /&gt;<br />
&lt;/xsl:for-each&gt;<br />
&lt;/xsl:template&gt;<br />
&lt;/xsl:stylesheet&gt;<!--formatted--></code></p>
<h3>Freemarker Example &#8211; blog-article.html.ftl</h3>
<p><code> &lt;#ftl ns_prefixes={"D":"http://www.alfresco.org/alfresco/pr", "pr":"http://www.alfresco.org/alfresco/pr"}&gt;<br />
&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"&gt;<br />
&lt;html xmlns="http://www.w3.org/1999/xhtml"&gt;<br />
&lt;head&gt;<!--formatted--></code><br />
<code><br />
&lt;/head&gt;<br />
&lt;body&gt;<!--formatted--></code></p>
<p><code>&lt;#assign docs = alf.parseXMLDocuments('blog-article', '/')&gt;<br />
&lt;#list docs as x&gt;<br />
&lt;h2&gt;&lt;a href="#"&gt;${x.title}&lt;/a&gt;&lt;/h2&gt;<br />
&lt;h3&gt;${x.abstract}&lt;/h3&gt;<br />
&lt;p&gt;${x.body}&lt;/p&gt;<br />
&lt;br /&gt;<br />
&lt;/#list&gt;<!--formatted--></code><br />
<code><br />
&lt;/body&gt;<br />
&lt;/html&gt;<!--formatted--></code></p>
]]></content:encoded>
			<wfw:commentRss>http://www.benh.co.uk/alfresco/example-alfparsexmldocuments-using-xsl-and-freemarker/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>Referencing An XML Element Within An Output Path</title>
		<link>http://www.benh.co.uk/alfresco/web-forms-xforms/referencing-an-xml-element-within-an-output-path/</link>
		<comments>http://www.benh.co.uk/alfresco/web-forms-xforms/referencing-an-xml-element-within-an-output-path/#comments</comments>
		<pubDate>Thu, 27 Nov 2008 11:31:27 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Web Forms - XForms]]></category>
		<category><![CDATA[Alfresco WCM]]></category>
		<category><![CDATA[output path]]></category>
		<category><![CDATA[web forms]]></category>

		<guid isPermaLink="false">http://www.benh.co.uk/?p=53</guid>
		<description><![CDATA[When creating an XML asset using a Web Form, it is sometimes required for an element of the output XML file, to be used within the output path.]]></description>
			<content:encoded><![CDATA[<p>When creating an XML asset using a Web Form, it is sometimes required for an element of the output XML file, to be used within the output path. For example, if it was required that the save directory was input by the user. The examples below shows two output path strings that could be used to acheive this. In this example the “region” element is a user input within the web form, and the produced XML file is saved into this folder within the users sandbox.</p>
<p><span id="more-53"></span></p>
<h2>Output Path Pattern</h2>
<pre class="code">/${webapp}/partner-data/${xml['/*[name()="pe:partner_entrance"]/*[name()="pe:region"]']}/
${name}.xml</pre>
<p><strong>or</strong></p>
<pre class="code">/${webapp}/partner-data/${xml['pe:partner_entrance']['pe:region']/${name}.xml</pre>
<h2>Sample XSD (Web Form)</h2>
<pre class="code">&lt;?xml version="1.0"?&gt;

&lt;xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
	   xmlns:pe="http://www.alfresco.org/alfresco/pe"
           targetNamespace="http://www.alfresco.org/alfresco/pe"
           elementFormDefault="qualified"&gt;

  &lt;xs:element name="partner_entrance"&gt;
    &lt;xs:complexType&gt;
      &lt;xs:sequence&gt;
        &lt;xs:element name="region" type="xs:normalizedString"/&gt;
      &lt;/xs:sequence&gt;
    &lt;/xs:complexType&gt;
  &lt;/xs:element&gt;
&lt;/xs:schema&gt;</pre>
<h2>Sample XML (Produced XML File)</h2>
<pre class="code">&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;pe:partner_entrance xmlns:alf="http://www.alfresco.org"
xmlns:chiba="http://chiba.sourceforge.net/xforms"
xmlns:ev="http://www.w3.org/2001/xml-events"
xmlns:pe="http://www.alfresco.org/alfresco/pe"
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"&gt;

&lt;pe:region&gt;APAC&lt;/pe:region&gt;
&lt;/pe:partner_entrance&gt;</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.benh.co.uk/alfresco/web-forms-xforms/referencing-an-xml-element-within-an-output-path/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

