Introduction
to Liferay Structures and Templates
Introduction:
Structures and Templates is elegant
feature in liferay web content management system. When we design web content
some time we need same type of design in several places. Whenever we need such
type of design and data multiple times in the web content then we will make
that design as template.
Whenever we need in web content
simple we will select template and we will fill with data then we can see new
web content with fresh data.
Liferay have implemented this
concept with two key points
- Structure
- Template
Structure:
Structure is simple xml data source
which will provide dynamic data to template. This will decide what kind of data
you need and what is the data design.
Let us assume I want to display
image, when I want display image I need image source, width and height. So here
our structure will provide required data to display image. Each time we will
fill dynamic data in this structure.
Here structure is like skeleton of
our body. Here skeleton have skull, chest and so on.
Note:
Here skeleton structure may be
same but for each human there is different appearance we can get different
appearance based on the things we filled in skeleton.
Template:
Template will decide look and feel for
structure. We can append multiple look and feel design for one structure.
We can develop template in different
ways and we can use Velocity and XSLT.
Note:
Simple assume each human appearance
is different even though every human skeleton structure is same.
In single word we can say structure
will decide what kind of data we are going to use and template will decide look
and feel for data.
Well we understand what is structure
and template.
Liferay WCM management system has
User Interface to create structures and templates so that we can use that to
design web content with structures and templates.
When we design structure we have
many options to input the data like we have text box, text, document and media
and image.
We can say structure is simple xml
tags which consist of predefined tags according to DTD.
Example for simple structure
<?xml
version="1.0"?>
<root>
<dynamic-element
name="image" type="document_library"
index-type="" repeatable="false"/>
<dynamic-element
name="width" type="text" index-type=""
repeatable="false"/>
<dynamic-element
name="height" type="text" index-type=""
repeatable="false"/>
</root>
|
Structure View in Liferay Web
content Portlet
Note:
When you see the type it will have
different types (document_library,text ..)
Use Structure data in Velocity
Template
<h1> simple WCM with
Sturcures and Templates</h1>
<img
src="$image.getData()" width="$width.getData()"
height="$height.getData()"/>
|
Note:
Here we use getData() method
on each element name to get the input data for element and in the velocity each
variable start with $ symbol.
If the structure have following
element
<?xml
version="1.0"?>
<root>
<dynamic-element name="title" type="text"
index-type="" repeatable="false"/>
</root>
Then get the title value in
templates as follows
<h1>$title.getData() </h1>
|
Important points:
When we design structure we have
different types of elements like text, document-media, image and many
Example:
We have option called element
repeatable when we enable repeatable then we can use same element for multiples
times
Example:
Assume I am going to design slide
show then I may need multiple images for sidle show then I will use repeatable
option for element.
In the structure we can use
different levels for elements for parent element means we can define child
elements.
Example:
Assume I want display image then
image have some properties like width and height then we can design structure
so that I will use width and height properties as child element to the image
element i.e. we can say parent element
The following is example structure
with child elements
Xml Structure code for Parent and
Childs
<?xml
version="1.0"?>
<root>
<dynamic-element name="image" type="image"
index-type="" repeatable="false">
<dynamic-element
name="height"
type="text" index-type=""
repeatable="false"></dynamic-element>
<dynamic-element
name="width" type="text" index-type=""
repeatable="false"/>
</dynamic-element>
</root>
|
Access data in Velocity (VM)
Template
Get child element data
Get root element data
$image.getData()
Get image element child element
$image.height.getData()
$image.width.getData()
The final template to display
Image
<img
src="$image.getData()" width="$image.height.getData()"
height="$image. width.getData()" alt="No Image"/>
|
We already know each element have
repeatable option then we can add multiple data example assume I want display
multiple images
Repeatable feature
In the above image element will be
repeatable so that we can add multiple images and when we use repeatable for
root tag then subsequent Childs also repeated.
The following is Structure XML
<?xml
version="1.0"?>
<root>
<dynamic-element
name="image" type="image" index-type="" repeatable="true">
<dynamic-element name="height" type="text"
index-type="" repeatable="false"></dynamic-element>
<dynamic-element name="width" type="text"
index-type="" repeatable="false"/>
</dynamic-element>
</root>
|
When the element have repeatable
feature then we will use some methods in Velocity template to access structure
data
The following method give
all image elements means it collected all same level repeatable elements
$image.getSiblings()
Iterate All image elements
#foreach($currentElement in
$image.getSiblings())
##write code here
#end
|
The following is complete Velocity
Templates to display all Images
#foreach($currentImage in
$image.getSiblings())
<img src="$currentImage.getData()"
width="$currentImage.height.getData()" height="$currentImage.
width.getData()" alt="No Image"/>
#end
|
When we design velocity template we
can use all HTML tags and css styles to make better look and feel
The following is example
<style>
#image-container{
padding-left:10px;
font-size: 12px;
font-family:
"Myriad
Pro","Verdana","Arial","sans-serif";
font-size: small;
color: gray;
}
#image-container list{
list-style:none;
border:1px solid red;
}
</style>
<div "image- container
" >
<ul>
#foreach($currentImage in
$image.getSiblings())
<li><img
src="$currentImage.getData()" width="$
currentImage.height.getData()" height="$ currentImage.
width.getData()" alt="No Image"/>
</li>
#end
</ul>
<div>
|
The final out line
Access Structure data for elements
$elementName.getData()
Access Child element of
parent element
$parentElementName.ChidElementName.getData()
Get All siblings like when we use
repeatable to element
$elementName.getSiblings()
Iterate Elements
#foreach($currentElement in
$elementName.getSiblings())
##access data of current data
$currentImage.getData()
##access data of child element
$
currentElement.childElementName.getData()
#end
|
Use HTML and CSS in Templates
We can also use CSS styles in velocity
templates so that we can give better look and feel for content.
We can use all HTML tags in velocity
templates
Example Velocity Templates that
contains CSS styles and HTML
<style>
#image-container{
padding-left:10px;
font-size: 12px;
font-family: "Myriad
Pro","Verdana","Arial","sans-serif";
font-size: small;
color: gray;
}
#image-container list{
list-style:none;
border:1px solid red;
}
</style>
<div "image- container
" >
<ul>
#foreach($currentImage in
$docdowloadlinks.getSiblings())
<li><img
src="$currentImage.getData()"
width="$currentImage.height.getData()" height="$ currentImage.
width.getData()" alt="No Image"/>
</li>
#end
</ul>
<div>
|
We can use styles in following ways
Tag level CSS as follows
<li><img
src="$currentImage.getData()" width="$currentImage.height.getData()"
height="$currentImage.
width.getData()" alt="No Image" style=”border:1px
solid red;”/>
|
Use style tag in Template
<style>
##write your styles here
</style>
<div "image- container
" >
<ul>
#foreach($currentImage in
$docdowloadlinks.getSiblings())
<li><img
src="$currentImage.getData()"
width="$currentImage.height.getData()"
height="$currentImage.width.getData()" alt="No
Image"/>
</li>
#end
</ul>
<div>
|
Use CSS link tag to load CSS
<link
rel="stylesheet" type="text/css"
href="/themeName/html/css/theme.css">
|
You can also directly use Liferay
Theme level CSS classes
<div class=”custom-div”>$title.getData()
</div>
Note:
We generally define
custom-div class CSS in theme custom.css file
Example:
. custom-div{
color:red;
border:1px solid red;
}
|
Use Java Script in Templates
We can also use java script in
velocity template to perform some action or events/effects to the data.
Liferay have inbuilt Java Script
library i.e. AUI so we can directly use. Simple we will use AUI use method to
load required modules so that we can write java script
Whenever we write java script we
will use <script> tag to place java script in templates.
Example As follows
Assume I want make alert message
when I click on image
<script>
AUI().use('aui-base',function(A){
A.one("#myTemplateImage").on('click',function(){
alert("Hi You
have clicked on Template Image");
});
});
</script>
<div "image- container
" >
<img
src="$image.getData()" width="$image.height.getData()"
height="$image. width.getData()" alt="No Image"
id=”myTemplateImage”/>
<div>
|
We can also Load script form script
src tag as follows
Assume I want use JQuery Script in
Velocity Template
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"> </script>
<script>
$(document).ready(function(){
$("#myTemplateImage ").click(function(){
alert("Hi
You have clicked on Template Image");
});
});
</script>
<div "image- container
" >
<img
src="$image.getData()" width="$image.height.getData()"
height="$image. width.getData()" alt="No Image"
id=”myTemplateImage”/>
<div>
|
Use Structures and Templates in
Liferay WCM
Login as Admin and go to control
panel there we can web content link in lift side panel
Create Structure
Click Structure Button and give name
and description
In the structure screen you can find
launch editor option select that and place following xml in editor then update.
<?xml
version="1.0"?>
<root>
<dynamic-element
name="image" type="image" index-type=""
repeatable="true">
<dynamic-element name="height" type="text"
index-type="" repeatable="false"></dynamic-element>
<dynamic-element name="width" type="text" index-type=""
repeatable="false"/>
</dynamic-element>
</root>
|
Once you add above xml then save the
structure using save button
Create Velocity Template For
Structure
Now create Template using add
template button enterer template name and description.
Now select required Structure using
Select structure button
Now click on launch editor button
and place the following velocity code in editor then click on update finally
save the template.
<div "image- container
" >
<ul>
#foreach($currentImage in
$docdowloadlinks.getSiblings())
<li><img
src="$currentImage.getData()"
width="$currentImage.height.getData()" height="$currentImage.
width.getData()" alt="No Image"/>
</li>
#end
</ul>
<div>
|
Create Web content Using Structures
and Templates
Now create new web content for this
click on Web content tag and select add button there you can see your template
then select template
Once you select template then it
will ask web content name and then based on your structure you need fill data
in input fields finally save web content.
Using Web content
Now we have done all we can use that
web content on web content display portlet to display images.
Note:
Whenever we need same template with
different data or images then simple create another web content article so that
you can see new web content with different images.
No comments:
Post a Comment