Assistance with Open Source adoption


Digital Transformation: Evaluating Costs

Liferay - Fri, 06/24/2016 - 19:54

Having completed a few digital transformation projects in federal, state and local government, we would like to share a few insights.

Digital transformation in government is considered to be a major undertaking. We have seen serious moves in this area in the UK and it is brewing here in Australia with the establishment of the Digital Transformation Office.

Existing technology is part of the transformation agenda, and in our experience, is misaligned with the new, technology driven, real-time connected citizen. People nowadays prefer to do everything online, even better, on their mobile phones. They expect high quality digital experiences. What do they often find when they come to deal with the government? … .

The old friend – PDF. They have to download, print out and fill it in. On many occasions they also have to download instructions or a whole guide book to understand how to complete a form. Then of course they have to put a stamp on an envelope and post it or drive to the agency and stand in line to hand it over, wasting time and money. But that is not the end of it. After all the trouble they still might receive a letter, email or call informing them that some important information is missing and, in the best-case scenario, they will have to do it all over again, or, in the worst, that their applications have been rejected and they lost their fees.

In Australia, councils (local government agency) have 120-150 various application forms – registrations, permits, complaints – and in majority of cases only 5-10 of them have been migrated online.

The government costs associated with processing paper forms are significant. The labor costs start piling up from the moment a clerk opens an envelope containing a paper form (mail-processing costs). The form is screened for obvious mistakes and omissions and applicant is notified by mail, phone call or email (more costs). Data from the form has to be entered into an internal system (data-entry costs). The paper form is either stored (filing and storage costs) or scanned and uploaded into digital storage (scanning costs). To answer enquiries, help desks or call centers are created. A significant part of the enquiries consists of people asking questions about how to fill in a form.

Traditional channels by which government agencies communicate with the citizens, such as face-to-face, telephone and mail, are costly as they require time and resources. Digital transaction, on the other hand, is more than 50 times cheaper than face-to-face transaction, 40 times cheaper than communication over the phone and more than 6 times cheaper than using email. It makes sense to replace traditional channels, where possible, with digital options.

There are many benefits of moving paper-based transactions online, such as saving time and money for customers, raising their satisfaction and trust, and improving the ability for government employees to access data remotely. The more transactions completed online the higher the level of productivity of delivering public services, and the costs are significantly reduced.

We have created a simple online calculator which allows to estimate the Payback Period of ICT expenditure based on complexity of existing business processes and associated costs. It is located at This calculator uses real figures based on our implementation experiences on all levels of government and businesses.

The calculator can help organizations to identify and plan the sequence of services that are to be digitized. Such sequence can be based on payback period, cost of implementation, timing and complexity of change to a selected business process.

Use of open-source platforms such as Liferay, off-the-shelf fit-for-purpose tools and avoiding bespoke software development greatly boosts reduction in implementation and operation costs of digital services.

Digital Transformation in both organizations and government agencies will continue to be a strategic priority for at least another decade, don’t’ miss the train.

Victor Zorin 2016-06-25T00:54:17Z
Categories: CMS, ECM

API Integration with HaveIBeenPwned w Structure and Template

Liferay - Wed, 06/15/2016 - 18:15

We recently had a request for our users to be able to check if their email address has been a victim of a known data breach per the awesome API and data stores provided at Here is the API: and some background story of this project and why it's worthwhile. There are some already-written consumer examples shared there, but I chose to try and fashion a lightweight version of my own that could be quickly deployed to a Liferay page without developing an entire portlet for this goal.

I was able to achieve this utilizing Liferay Templates and Structures, JavaScript, Freemarker (or Velocity), HTML and CSS. I'll provide a few basic steps and enough (Freemarker) code to get you going. This mini-app greets the user and offers him/her to check their email address for known breaches. The code makes an AJAX call to the HaveIBeenPwned API and returns JSON data (if data is found) that is parsed and formatted for display in HTML / CSS. 

1) Create a simple structure. I named mine "PWNED". Add a text field (that we won't use) to it and save / publish it.

2) Create a (Freemarker) template. I named mine "PWNED". Attach this template to the "PWNED" structure from step 1. Uncheck the "Cacheable" option. Add the code below to the template, then Save / Publish it:

<#assign user = permissionChecker.getUser() /> <!DOCTYPE html> <html> <body> <style> .attention { color: red; } .breachIntro { font-size: 16px; } </style> <h2>Hello, ${user.firstName}!</h2> <p class="breachIntro">Check if your email address been victim of a known data breach:</p> <form id="checkBreaches" name="checkBreaches"> <label for="Email">Email address:</label> <input id="checkEmail" type="text" name="Email" value="" placeholder="${user.emailAddress}"> <input type="submit" name="submit" value="Check It!" onclick="loadDoc();return false;"> <p><a href="#" onclick='reloadMe();'>Refresh Page / Search Again</a></p> </form> <div id="breachInfo"></div> <script> function loadDoc() {   var xhttp = new XMLHttpRequest();   var url =  "";   if (document.getElementById("checkEmail").value == "") {   var email = "${user.emailAddress}";   }   else {     var email = document.getElementById("checkEmail").value;   }   var checkUserURL = url + email;   xhttp.onreadystatechange = function() {     if (xhttp.readyState == 4 && xhttp.status == 200) {       writeData(xhttp.responseText);     }     else if (xhttp.readyState == 4 && xhttp.status == 404){     document.getElementById("breachInfo").innerHTML = "<h4><p>404 - No data returned for  <span class=\"attention\">\"" + email + ".\"</span> This is a good thing! It appears you have no known associated breaches with this account.</p></h4>";     }   };"GET", checkUserURL, true);   xhttp.send(); } function writeData(response) { var arr = JSON.parse(response); var i; var email = document.getElementById("checkEmail").value; var out = "<h4><span class=\"attention\">Unfortunately, it looks like \"" + email + "\" has been breached. </span>Please see the details below:</h4>" + "<div class=\"breachEntries\">"; for(i = 0; i < arr.length; i++) {         out += "<div class=\"breachEntry\" id=\"breachEntry" + i + "\"><div class=\"breachDomain\"><strong>Domain of Breach:&nbsp;</strong>" + arr[i].Name +         "&nbsp;(<a href=\"http://" + arr[i].Domain + "\" target=\"_blank\"><strong>http://" + arr[i].Domain + "</a></strong>):&nbsp;" +         "</div><div class=\"breachDesc\">" +         arr[i].Description +         "</div><div class=\"breachItems\"><strong>Breached Items:&nbsp;</strong>" +         arr[i].DataClasses +         "</div><div class=\"breachDate\"><strong>Breach Date:&nbsp;</strong>" +         arr[i].BreachDate +         "</div></div><hr>";         }     out += "</div>"; document.getElementById("breachInfo").innerHTML = out; } function reloadMe() { window.location = window.location.pathname; } </script> <div>(Courtesy of "<a href="" target="_blank"></a>" and Daniel Tyger for the Liferay steps / code.) </div> </body> </html> 3) Create a web content object, using the newly-created structure / template combination from steps 1-2. Publish / save it and deploy it to a Liferay page. You should see something like the following: If you enter "" into the "Email address" field, you will see what the data results look like when parsed...:

and - a look at the resulting HTML:

You could easily paint a table, instead, and include other fields from the API I have omitted in this example...

Explanation of the code:

1) Create the Freemarker "user" variable we will utilize to display the user's first name and email address where we need it later in the app...:

<#assign user = permissionChecker.getUser() /> .... <h2>Hello, ${user.firstName}!</h2> ... var email = "${user.emailAddress}";

2) Create the form and the <div> for displaying the results:

<form id="checkBreaches" name="checkBreaches"> <label for="Email">Email address:</label> <input id="checkEmail" type="text" name="Email" value="" placeholder="${user.emailAddress}"> <input type="submit" name="submit" value="Check It!" onclick="loadDoc();return false;"> <p><a href="/group/mycampus/identity-theft">Refresh Page / Search Again</a></p> </form> <div id="breachInfo"></div>

3) Set up the forked AJAX function call  to the API to use either the Liferay user emailAddress or the one entered by the user into the form and to write a success message if no data is returned:

function loadDoc() ...

and upon successful data results, fire the writeData function:

    if (xhttp.readyState == 4 && xhttp.status == 200) {       writeData(xhttp.responseText);     }

4) Parse the results for display in the writeData() function:

function writeData(response) { var arr = JSON.parse(response); var i; var email = document.getElementById("checkEmail").value; var out = "<h4><span class=\"attention\">Unfortunately, it looks like \"" + email + "\" has been breached. </span>Please see the details below:</h4>" + "<div class=\"breachEntries\">"; for(i = 0; i < arr.length; i++) {         out += "<div class=\"breachEntry\" id=\"breachEntry" + i + "\"><div class=\"breachDomain\"><strong>Domain of Breach:&nbsp;</strong>" + arr[i].Name +         "&nbsp;(<a href=\"http://" + arr[i].Domain + "\" target=\"_blank\"><strong>http://" + arr[i].Domain + "</a></strong>):&nbsp;" +         "</div><div class=\"breachDesc\">" +         arr[i].Description +         "</div><div class=\"breachItems\"><strong>Breached Items:&nbsp;</strong>" +         arr[i].DataClasses +         "</div><div class=\"breachDate\"><strong>Breach Date:&nbsp;</strong>" +         arr[i].BreachDate +         "</div></div><hr>";         }     out += "</div>"; document.getElementById("breachInfo").innerHTML = out; }

Hope it works for you. Please respond if it does not. Suggestions welcome. It's brand new for me...

Daniel Tyger 2016-06-15T23:15:41Z
Categories: CMS, ECM

Learn How to Put Customers First at Liferay Symposium NA

Liferay - Mon, 06/13/2016 - 18:57


A Conversation with Customers: Liferay Digital Experience Platform

As digital transformation continues to inform the way we live, work, and play, we expect companies and brands to understand what we're looking for. Businesses have a great opportunity to hear their customers, understand the problems they face, and give them the right solution to make their lives easier. But, do most companies have an idea of how to listen to their customers?

In a recent interview with CMS Connected, Bryan Cheung, CEO, shared how listening to customers sparked Liferay's progression into the digital experience market with the launch of Liferay Digital Experience Platform (DXP). In Liferay's case, transformation was not so much disruptive as it was natural, given its portal heritage, which already had laid out integrations with backend systems and the framework to drive personalized customer experience.

A Better Direction for Customer Experience

The unique infrastructure of Liferay DXP can help build a range of customer experience solutions including web, mobile, and hybrid online/offline experiences across the entire customer lifecycle. In addition, having a single view of the customer lets companies create better, more relevant interactions down the line and gets all departments working together to care for customers.

In this retail banking example, a teller displays a singular customer view. In one page, the teller can see relevant, current information, i.e., the latest conversation between the customer and the bank (wherever it might have been), gathered from multiple systems across the organization. Based on this customer view, the teller can then make intelligent suggestions to the customer and give the bank an opportunity to offer related or complementary services. 

Cheung also shared that Liferay DXP isn't just about connecting surface level interactions. The whole point of Liferay DXP is to let businesses work smarter at what they do—without having to start all over. In this way, businesses gain another opportunity to engage, provide self-service, engender loyalty, and repeat purchases through all customer interactions.

A Natural Fit for Digital Experience Management

Over the past 15 years, Cheung notes that Liferay has set out to make technology work better for people: 

"We see Liferay Digital Experience Platform as the next logical step in our evolution as a company, and I hope that we’ve done a good job listening to your needs as we’ve designed our product."

As customers drive how they interact with brands, companies need to stay ahead of the curve with tools that deliver personalized digital experiences wherever, whenever they engage with your business.

# # #

Learn how to support your customers across the entire customer lifecycle. There's no better time or opportunity to get to know the Liferay team, key clients, and strategic partners than in Chicago this September. Don't miss Liferay Symposium North America!



Angela Wu 2016-06-13T23:57:37Z
Categories: CMS, ECM

User Creation for Load Testing

Liferay - Mon, 06/13/2016 - 01:08

In the leading edge digital world comprising of various applications built upon a portal technology, we land up to a situation of performance testing of the application. There-in we need users in bulk to be created for a load run which is a time consuming task with the manual process. In this scenario we can have a query to dump users into the corresponding tables in the Liferay schema instead of manually creating them. The query deals in with auto insertion of data into the Liferay tables like user_, contact_, group_. This makes user creation in Liferay a simpler task.

The bulk user creation process is as follows:



  • The user details (emailaddress, screenname, firstname etc.) available in external file (.xls or .csv etc.) is loaded into the test table.
  • Execute the query to load the data into corresponding tables in portal schema.


The below query to be execute to creat the users

DECLARE   v_accountId       := '10001';   v_companyId       := '10002';   v_userClassNameId := '10003';   v_userId     NUMBER;   v_userName   VARCHAR2(50);   v_userEmail  VARCHAR2(50);   v_screenName VARCHAR2(50);   v_UUID       VARCHAR2(50); BEGIN   FOR(var currentTestUser IN   (SELECT * FROM testUserData   ))   LOOP     dbms_output.put_line(currentTestUser.userid);     v_userId     := currentTestUser.userid;     v_userName   := currentTestUser.username;     v_userEmail  := currentTestUser.useremail;     v_screenName := currentTestUser.screenname;     -- Insert into contact_     INSERT     INTO Contact_       (         v_userId,          --contactId         v_companyId,       --companyId,         v_userId,          --userId,         v_userName,        --userName,         sysdate,           --createDate,         sydate,            --modifiedDate,         v_userClassNameId, --classNameId.         v_userId,          --classPK,         v_accountId,       --accountId,         0,                 --parentContactId,         v_userEmail,       --emailAddress,         v_userFirstName,   --firstName,         NULL,              --middleName,         v_userLastName,    --lastName,         0,                 --prefixId,         0,                 --suffixId,         1,                 --male,         sysdate,           --birthday,         NULL,              --smsSn,         NULL,              --aimSn,         NULL,              --facebookSn,         NULL,              --icqSn,         NULL,              --jabberSn,         NULL,              --msnSn,         NULL,              --mySpaceSn,         NULL,              --skypeSn,         NULL,              --twitterSn,         NULL,              --ymSn,         NULL,              --employeeStatusId,         NULL,              --employeeNumber,         NULL,              --jobTitle,         NULL,              --jobClass,         NULL,              --hoursOfOperation,       );     -- Insert into user_     INSERT user_     INTO VALUES       (         v_UUID,       --uuid_,         v_userId,     --userId,         v_companyId,  --companyId,         sysdate,      --createDate,         sysdate,      --modifiedDate,         0,            --defaultUser,         v_userId,     --contactId,         'Password1',  --password_,         0,            --passwordEncrypted,         0,            --passwordReset,         NULL,         --passwordModifiedDate,         NULL,         --digest,         NULL,         --reminderQueryQuestion,         NULL,         --reminderQueryAnswer,         0,            --graceLoginCount,         v_screenName, --screenName,         v_userEmail,  --emailAddress,         0,            --facebookId,         -1            --ldapServerId,         NULL,         --openId,         0,            --portraitId,         'en_US'       --languageId,         'UTC'         --timeZoneId,         'Welcome'         || v_screenName, --greeting,         NULL,            --comments,         v_userFirstName, --firstName,         NULL,            --middleName,         v_userLastName,  --lastName,         NULL,            --jobTitle,         NULL,            --loginDate,         NULL,            --loginIP,         NULL,            --lastLoginDate,         NULL,            --lastLoginIP,         NULL,            --lastFailedLoginDate,         0,               --failedLoginAttempts,         0,               --lockout,         NULL,            --lockoutDate,         1,               --agreedToTermsOfUse,         0,               --emailAddressVerified,         0                --status       );     INSERT     INTO group_ VALUES       (         v_GroupUUID, --uuid_,         v_userId,    -- groupId         v_companyId, -- companyId,         v_userId,    -- creatorUserId,         '10005',     -- classNameId,         v_userId,    -- classPK,         0,           -- parentGroupId,         0,           -- liveGroupId,         '/'         ||v_userId         ||'/'     -- treePath,         v_userId, -- name,         NULL,     -- description,         0,        -- type_,         NULL,     -- typeSettings,         1,        -- manualMembership,         0,        -- membershipRestriction,         '/'         || v_screenName -- friendlyURL,         0,              -- site,         0,              -- remoteStagingGroupCount,         1               -- active_,       );   END LOOP; END;   NOTE :  The below values should be hardcoded with corresponding values from portal schema :
  • v_accountId       := '10001';
  • v_companyId       := '10002';
  • v_userClassNameId := '10003';


  • Automated process for bulk user creation.
  • Saves time and manual effort.
  • Supports performance test activities with minimal effort.
  • Process of bulk user creation in Liferay simplifies the performance tests execution. 
Deependra Singh 2016-06-13T06:08:22Z
Categories: CMS, ECM

Liferay Symposium at the Historic Hilton Chicago

Liferay - Thu, 06/09/2016 - 17:58

Liferay Symposium North America will be held at the Hilton Chicago this year on September 26 - 27. Ideally located in Downtown Chicago, the Hilton is known as one of the finest hotels in the area, offering full amenities and high-end services. Its spacious rooms are comfortable and perfect for relaxing after a full conference day and viewing the Chicago cityscape.

Today, the Hilton is a bustling place that accommodates several different conferences throughout the year like our very own. But during the Roaring Twenties when the hotel was first built, it was connected to a series of shocking headlines, which included embezzlements, crime, and a good amount of family drama. Since then, the scandals have certainly died down, but much of the historic architecture has been well-preserved, such as the Grand Ballroom, where our exhibit hall will be located! And to add to its iconic reputation, this Hilton has hosted every POTUS since it opened in the twenties. That means, every president from President Coolidge to President Obama!

For your convenience, we have a discounted room block reserved for symposium attendees.

Availability: September 24 - 27, 2016
Rate: $269/night
Distance from MDW: 11 miles
Distance from ORD: 19 miles

Find out more information to help you with your travel plans.

Melanie Chung 2016-06-09T22:58:41Z
Categories: CMS, ECM

Plugin Customization in Liferay

Liferay - Thu, 06/09/2016 - 05:09

Plugin is the core of Liferay portal development in its various forms. “Plug-in” as the word enunciates is an add-on to perform additional features. It can be blended into an application to enhance primary capabilities. Liferay provides a wide variety of Out Of Box (OOB) features and ways of integration with external parties using its very own Marketplace plugins like:

•          SAML2.0 Provider EE

•          Calendar

•          Wiki             

The above instances of plugins are powerful tools which support multiple ways to extend the functionality of Liferay portal.

Customization and its necessity:

Liferay SDK is assorted with a number of functional portlets, hooks, themes, layout templates and web modules. In order to extend a specific functionality and its integration with business requirement the customization of plugins is essential.

Hence, extending Liferay with hook as a plugin type mitigates the Liferay portal to do almost anything. By extending a plugin, you can use all its features in your new plugin while keeping your changes/extensions separate from the existing plugin’s source code.

The below diagram depicts the flow of customizing plugins in Liferay:

Customizing hook plugin in Liferay:

The plugin customization is an implementation to create the "hook of Liferay plugin".

Here, we state the elaborated steps for customization of a Liferay OOB plugin.

NOTE : We have chosen SAML plugin to demonstrate the customization.


  1. Create a SDK hook plugin project using Liferay IDE.
  2. Remove all the auto-generated files except build.xml and the docroot folder.
  3. Copy the original WAR file of the plugin to be extended available at marketplace (here :saml-portlet- to the root folder of your new plugin.
  4. Make the following changes to build.xml inside the <project> tag to reference the original WAR .

    Add the property name and value corresponding to original.war.file and the plugin name to be customized respectively.

  5.  Copy all the files from the original plugin (here : saml-portlet- to the new plugin project.

  6. Run the “ant-merge” target.

  7. Build services for the plugin which will give a plugin service.jar (SAMLPlugin-hook-service.jar) to be placed in the server lib directory based on the server type distinguished as follows :

  8. Restart the server and deploy the war.

Tomcat installation

Jboss installation

Place the jar docroot\WEB-INF\lib\SAMLPlugin-hook-service.jar to the ext/lib in the tomcat structure.


Place the jar docroot\WEB-INF\lib\SAMLPlugin-hook-service.jar to /jboss/jboss-eap-6.1/modules/com/liferay/portal/main/SAMLPlugin-hook-service.jar


Add the below entry in module.xml

<resource-root path="SAMLPlugin-hook-service.jar" />

Benefits of plugin customization:

 The plugin customization in Liferay gives us following advantages:

  • Availability of additional features along with the OOB features.
  • API amendment to fulfil the requirements.
  • Supports integration with other application.
  • Flexibility to develop and customize.
  • Forward compatibility.
  • Reduces cost and effort.

Conclusion :

Thus, plugin customization in Liferay makes it possible to embed the additional features while Liferay plugin integration to the application.

deveshree zawar 2016-06-09T10:09:41Z
Categories: CMS, ECM

Styling Search Bar in Liferay Theme

Liferay - Wed, 06/08/2016 - 22:43

Liferay itself provides Out-Of-The-Box (OOTB) themes enabling organizations to build quick time-to-market customer engaging sites. There are times where organizations would like to build their own theme to fit their corporate branding. When building such theme, there is usually a need to style the search bar.

Details in creating a Liferay Theme can be found here

Thanks to the contribution by Marcos Castro on the Manizanita Theme (a Liferay Theme ), the theme provides me an idea on how to style the search bar (i.e. the Search Portlet) provided by Liferay. Below provides the changes required to be done for the mentioned files in the custom Liferay Theme (using Velocity for the templates).




'liferay-sign-in-modal', 'event-outside', 'transition',

function(A) {


var searchIcon ='.open-search');

var rightIconGroup ='.right-icon-group');

if (searchIcon) {



function() {

if (!BODY.hasClass('opened-search')) {

var closingSearch = rightIconGroup.once(


function() {





else {




var openSearchInput ='.portlet-search input[type="text"]');










.portlet-search {

display: inline-block;

margin-right: -2px;

form {

margin: 0;

padding: 0;

input {

margin-bottom: 3px;

padding: 0;

width: 1px;

@include border-radius(5px);

@include opacity(0);


select, input[type="image"] {

display: none;





.opened-search #banner{

.portlet-search {

form {

input {

padding: 4px;

width: 150px;

@include opacity(1);



padding: 4px;

width: 100px;

background: transparent;

border: 1px solid #ccc;

display: inline;

@include opacity(1);

@include border-radius(5px);





.open-search {

color: #555;

width: 13px;


.icon-search:before {

content: "\f054";




_diffs/templates/portal_normal.vm (or any velocity file you want to insert search in it):

<span class="right-icon-group">

<span class="portlet-search">



<a class="open-search" href="#">

<i class="icon-search"></i>



End Result:

Before Clicking Search Icon

After Clicking Search Icon

Note: This may not be the only approach. Depending on the design and deliverables (ie. html, css, javascript, images etc.) from the Creative Design or Web Design Team, the files to change and approach may differ from the above.

Kang Wei Soo 2016-06-09T03:43:28Z
Categories: CMS, ECM

Deploying Liferay Plugins in Liferay on Oracle Weblogic 12c running in "Production" mode

Liferay - Tue, 06/07/2016 - 01:12

I am thinking of what to write for my first blog. Since I have just been asked on how to deploy a Liferay plugin in Liferay on Oracle Welogic 12c Application Server, I am thinking I may as well document my findings here so that the information is not lost. However, the steps mentioned here does not apply for some types of plugin especially Liferay Hooks and, of course, Extension.

Based on Liferay Product Documentation (, there are times when Application servers running in “production” and “domain” modes only support non-exploded WAR deployments. To package your developed Liferay Plugins in a manner which can be deployed using the deployment features of the supported application servers, “ant direct-deploy” can be used.

An extract from the Documentation link above which provides the details:

" The Liferay Plugins SDK allows you to preprocess your archives and inject all the required elements. You therefore bypass the auto deployer at runtime. You simply need to call the following Ant task:

ant direct-deploy

The direct-deploy Ant task creates an exploded WAR from which you can easily create a WAR file. The location of the exploded WAR depends on the deployment directory of the application server you’ve configured in your Plugins SDK environment. See the Developing with the Plugins SDK tutorials for instructions on configuring the Plugins SDK for your app server. The Plugins SDK’s provides a default deployment directory value for each supported app server. But you can override the default value by specifying your desired value for theapp.server.[type].deploy.dir (replace [type] with your app server type) in your build.[username].propertiesfile.

If you choose not to use the Liferay Plugins SDK to do direct deployment, you can examine the build-common.xml file in the Plugins SDK to see how Liferay invokes the deployer tools."

Based on my recent exploration with Oracle Weblogic 12c (v12.2.1) Application Server, here are the high level steps in configuring and creating a fully deployable Liferay Plugin which can be deployed using the deployment feature of Oracle Weblogic.

Step 1: Configure Liferay SDK build.<user>.properties in your Build (e.g. Development) Machine where Oracle WebLogic (with Liferay installed) is running in “Development” mode.

For shortcut on how to make Oracle WebLogic run in “Development” mode, please refer to ( 

For more details on how to install Liferay in Oracle WebLogic, please refer to (

For more details on configuring Liferay SDK, please refer to (

For a sample settings, please refer to (

In this example, I am using the followings which is tuned to my environment:






Step 2: Execute “ant direct-deploy” in your Build Machine

Once executed successfully, you will see your plug-in “deployed” in “exploded” WAR in the “autodeploy” directory under the configured domain (specified in the settings in step1) of Oracle Weblogic Application Server. Once done, jar/zip up your exploded WAR with a name. To make it in sync with the naming convention of Liferay plugin, mine is named “liferay-workshop-layout-layouttpl.war” (Liferay layout plugin) as shown below.

You may also append a version like this “liferay-workshop-layout-layouttpl-”

Step 3: Deploy this WAR file to your Runtime Machine (different from your Build Machine) where Oracle WebLogic (with Liferay installed) is run in “Production” mode.

Once deployed successfully using the deployment feature of Oracle Weblogic 12c, you will see the deployed packaged as show below

Step 4: Validate that the plugin is available in your Runtime Machine after deployment is successful as shown below

Disclaimer: The post here mainly describes my exploration of the topic mentioned. It may not represent the recommended approach.





Kang Wei Soo 2016-06-07T06:12:32Z
Categories: CMS, ECM

Liferay Role Association with Users and Permissions Algoritm 6

Liferay - Mon, 06/06/2016 - 01:27

Role is basically a set of permissions. When a Role is assigned to a User, he is capable to do whatever permitted to that Role. Liferay provide well defined roles and permissions architecture that can be managed from control panel. Through this blog I wanted to describe how user are associated to roles directly or indirectly through Site, Organization and User Groups.

1)Regular Role-Regular role is created to define permissions within the portal scope. User can be associated to Regular Role either directly or if he is member of a site, organization, User Group as follows.

2)Site Role- Site  role is created to define permissions within the site scope. Site Role is assigned to site. If user is member of site either directly or indirectly if he is member of organization or User Group which are further member of that site, he has the permissions of Site Role.

3) Organizational Role- Organizational role is created to define permissions within the organization scope. Organizational Role can be assigned to organization users. If a user is member of organization, he can be assigned to organizational Role.

Permissions Algorithm-Permissions are actions that a user is authorized to do. As permissions is the core part of Liferay Architecture. For each entity, it requires a lot entries to be added in database. In Liferay 6.X Advanced Permissions Algorithm 6 is introduced that reduces the database size significantly.

There are following table in which permission entries are added.

1)ResourceAction- In Liferay we can define action for following resources.

    a) PortletResource

     b) Entity Resource

Resource actions might be like VIEW,UPDATE, DELETE. For each resource action a entry is added in the ResourceAction table. Each resource action is assigned a bitwise value. Let assume following are the values.




2)ResourcePermissions-This table contains the permissions that are assigned to a Role in a particular scope. Permissions are grouped together using bitwise OR and added as single entry.

Permissions->VIEW(001) OR UPDATE(010) OR DELETE(100)=111

So if a role as above three permissions then bitwise OR comes as a single value i.e . 111.It reduces the size of database significantly by eliminating multiple entries.

When it is needed to check that a particular Role has particular permission, algorithm 6 checks it by following rule.

IF((Role Permissions)AND( Action)==(Action)){





3)ResourceBlockPermissions-In Resource Block permissions , similar set of permissions are considered as block so as to reduce duplication. To understand this concept you can go through the blog in which resource block permission are explained very much in detail.

Sushil Patidar 2016-06-06T06:27:32Z
Categories: CMS, ECM


Liferay - Fri, 06/03/2016 - 20:22
业内知名门户(Portal)软件商Liferay已经将新产品重命名为DXP - 数字体验平台,剑指数字体验市场。


这种转变其实并不是Liferay特有的,它更像是一种自然演化。“传统portal中的功能,已无法满足当今客户的功能需求,在Liferay平台上我们需要持续开发和整合这些需求功能。所以基于这些转变,我们需要重定义我们在市场中的位置。”Liferay首席执行官Bryan Cheung如是说。





什么是Liferay DXP


Liferay DXP是由一些不同的组件构成。核心部分是portal平台本身。其次是整合的内置后台系统包括CRM、ERP、技术支持和其他系统。整合平台使用的是微服务架构,使其定制化与整合客户需求功能更加方便。


Chueng说,对于企业来说,深度数字化意味着经营方式的转变。Liferay DXP可以深入到业务流程处理,以助力客户系统设计与模块整合,使其可以重新配置和部署必要的商业服务。




基于Liferay DXP平台,可以轻松的创建网页站点、登录页面、移动站点、移动应用和表单等。亦可创建定向受众体验和为市场客户支持和服务定制个性化体验。


Liferay DPX 平台还有两个组件年内问世,营销活动管理(Campaign Management)和单一客户视图(Single View of Customer, SVOC)。SVOC组件可以用来定制化体验,它能够将零散的信息整理重构,然后集中显示。营销活动管理组件使市场营销人员通过一些活动,如促销活动、客户支持或服务,以提高目标客户的参与度。










Liferay DXP采用订阅服务以及混合式结局方案(例如,云服务中的营销活动管理和SVOC)的销售方式。在未来Liferay也会寻机提供更多的管理服务。










Neil Jin 2016-06-04T01:22:21Z
Categories: CMS, ECM

What is Senna.js and how it affects Liferay DXP

Liferay - Fri, 06/03/2016 - 14:14

If you have been in touch with the Liferay community in the past years, you've probably heard about Senna.js before.

We first introduced this project in late 2014 and since then we've been anxiously waiting for Liferay 7 and DXP to be released so we could talk more about it. Now it's a good time to see what this project brings to the table.

Ok, so what is Senna.js?

Senna.js is a super fast single page application engine that can dramatically optimize any site's performance. It's open source and doesn't require any dependency.

It was created by Eduardo Lundgren with the help of amazing contributors and it's actively maintained by Liferay engineers.

But what is a Single Page Application?

Even though this term may not be familiar with non-technical people, chances are you already interacted with dozens of applications like this. If you ever used Gmail, Facebook, or Google Docs, then you had the experience of using a SPA.

Basically, a Single Page Application (SPA) is a web app that loads all of the resources required to navigate throughout the site on the first page load. As the user clicks links and interacts with the page, subsequent content is loaded dynamically.

The application often updates the URL in the address bar to emulate traditional page navigation, but another full page request is never made. This is possible due to new browser capabilities like the HTML5 History API.

There are many frameworks for single page applications out there. First we had Backbone, then Ember, then Angular, now React. They all had their ups and downs, but we decided to create our own lightweight solution for many reasons:

First, because Senna.js was built for a single purpose, SPA, rather than being a fully-featured framework. Second, so you don't necessarily need to learn a new technology every time the JavaScript community comes with a new library.

How does it affect Liferay DXP? As I told before, Senna.js can improve the performance of any site. By optimizing speed we can make incredible advances in terms of user experience, and that's crucial for Liferay DXP to be successful.   Ok, enough with the blah blah blah, let's see the difference between having Senna.js enabled and disabled when using Liferay DXP with a 3G connection.    

I don't know about you, but we think that a 13-second difference for a single page navigation is HUGE.

Want to learn more?

Below you can find an entire talk about this topic. Also make sure you check for more technical details and examples.


And that's it! Any questions? Feel free to leave a comment :)

Zeno Rocha 2016-06-03T19:14:10Z
Categories: CMS, ECM

Power Of WCM with Theme Development

Liferay - Thu, 06/02/2016 - 04:31

Liferay provide advanced web content system that empower business users to configure and create Web Content. On other hand Liferay Theme plugin provide Configurable theme settings. This flexibility of web content management system used with theme can leverage additional power for Liferay Portal projects.

In theme there are sections like navigation, header and footer need regular changes like changing content and text of these sections. And on each change it requires development and deployment efforts. As we know Liferay Web Content Management system allows users to modify contents on the go. If we think Theme sections (Header, Footer and Navigation) as a web content. As localized web contents can be created, Business users can change localization Text anytime they want for links and text rather than adding them language properties and series of deployments through various environments. Also images used in Header Footer can be changed any time through Web Content without involvement of development Team.

By embedding web content in theme, these features can be achieved easily.

$journalContentUtil.getContent( $themeDisplay.getCompanyGroupId(), $webContentID, “”, $locale.toString(), $themeDisplay )

In the above code snippet $webContentID can be hardcoded as “HEADER. Now create web content “HEADER” using structure/template.

Sometimes there are situations when there is requirement that Business users want variety of Header, Footer and Navigation. In such situations Configurable Theme settings can be used for advanced control.

Liferay Provide configurable theme settings through which we can add some fields Text, Dropdown, and Radio. As an example take a case that user wants two Header Type and want to make it configurable

Step-1:-In this case create two web content (HEADER_TYPE_1 and HEDAER_TYPE_2) .

Step-2:-Add configurable setting in theme as follows.

<theme id="theme_id" name="Theme-Name">     <settings>         <setting configurable=”true” key="header-type" value="HEADER_TYPE_1" type=”Text”/>     </settings> </theme>

 Step-3:-And embed the web content in theme using the theme-setting value as follows.

#set($articleID=$theme.getSetting(“header-type”)) $journalContentUtil.getContent( $themeDisplay.getCompanyGroupId(),$articleID ,””, $locale.toString(), $themeDisplay)

Step-4:- When required you can change theme setting from HEADER_TYPE_1 to HEADER_TYPE_2 as shown below by navigating to theme settings.


With use of configurable theme settings provide the benefit of selecting choice of different Section (Header, Footer, Navigation) Content for different pages by using single theme plugin as well as ease of modifying the content whenever required from the control panel using the web content management.

Sushil Patidar 2016-06-02T09:31:05Z
Categories: CMS, ECM

Internal secrets of Liferay Screens: SendBuffer

Liferay - Mon, 05/30/2016 - 17:21
Lately, we’ve being working on an event tracking system for Liferay Screens. Nothing fancy: just another Flurry or Google Analytics for mobile apps. The best part is the information collected will be used to feed the Audience Targeting Rules Engine, so you’ll be able to segment your users based on their behaviour on your mobile apps.   Anyway, on the mobile end the procedure is quite simple:
  • Some screenlets (or any other part of the app’s code) will generate and add tracking events (including metadata information). You know: this button has been clicked, that view has been shown, and so on.
  • When the event count reach one specific number, the events are batched and submitted to the server. Older events are sent first, so technically the events live in a FIFO queue.
  • The submission may take several seconds, so while this is working, more events can be generated and added to the queue.
  • When the submission is successfully completed, the submitted events are finally discarded. If an error occurs during the submission, those events are added back to the  queue (in order to try again later).
After thinking twice about these steps, we realized this follows a mixture of producer-consumer together with a write-buffer pattern.   It’s a producer-consumer because:
  • There are several processes (threads, queues, whatever) creating and adding events to the queue. These are the producers.
  • There is a process removing items from the queue and sending them to the server. This is the consumer.
  • The submission is an asynchronous process. While it’s in progress, the queue is accepting new events.

And it’s a write-buffer because:

  • The buffer (or queue) can be filled. There’s a size that represent the capacity of the buffer.
  • When the buffer is full, it’s flushed. Those items are “written” (aka submitted) to the server.
  • When the submission is successfully completed, the items sent are discarded. If there’s an error sending the items, the items are added back to the buffer (and they will be re-sent later).

So with these patterns identified, we coded a Swift class that help us to handle this scenario properly.

We called it “SendBuffer”, and it’s useful for several scenarios:
  • If you need to upload items in a background process, but you want to do it in batches (instead of one by one)
  • If you need a typical producer-consumer pattern, just create the SendBuffer object with size 1. As soon as one item is added to the buffer, it will be processed right away. The buffer will continue processing items while it has more items.

Also you can find a sample application that shows graphically how the buffer behaves.

In the right you can see how items are moved back and forth:

  • When an event is added, it appears in the buffer area.
  • When the buffer gets full, the batch is moved from the buffer to the "sending area"
  • When the (fake) submission is completed, the events are moved from "sending area" to sent area. But if the submission is failed, the events are added back to the buffer.

If you see it useful, just star it in Github!

Jose M. Navarro 2016-05-30T22:21:57Z
Categories: CMS, ECM

Nesting Liferay JSON Service calls

Liferay - Mon, 05/30/2016 - 08:01

One really cool feature of Liferay JSON web services is the ability to nest service calls.

For example, what if you would like to update a web content journal article via JSON? The /journalarticle/update-article method requires the following four parameters: 


Parameter Description groupId ID for the Liferay site articleId ID for the web content journal article content XML representation of the web content version Article version number

groupId, articleId, and content are easy to come up with. But how can I find the article version number? I could make a separate call to get-article to retrieve the article metadata including the version number, but this would add extra complexity (and an extra network call) to my client code. 

Instead it is also possible to automatically look up the version number while updating with a nested call like this: 

var cmd = { "$article = /journalarticle/get-article": { "groupId": article.groupId, "articleId": article.articleId, "$update = /journalarticle/update-article": { "@version": "$article.version", "groupId": article.groupId, "articleId": article.articleId, "content": xml, "serviceContext.scopeGroupId": article.groupId } } };

How cool!

Allen Ziegenfus 2016-05-30T13:01:08Z
Categories: CMS, ECM

Liferay Connected Services - 2016 Q2 Updates

Liferay - Mon, 05/30/2016 - 05:17

Last two months Liferay Connected Service (LCS) team spent testing system for upcomming changes related to subscription management. It should allow enterprise customers more flexible license management and elastic subscription mode.

I guess now I have enough time to put some news for all of you who follow LCS progress.

  • in the next release of LCS system we  will stop support and development for all 6.1.x platforms

  • browseable page metric history have been available since April 2016
  • notifications/alerts improvements were deployed early in May 2016
  • LCS system is tested and ready for incoming family of 7.0 portal based solutions

I hope you will find time to explore and evaluate the leatest LCS features soon.

Igor Beslic 2016-05-30T10:17:17Z
Categories: CMS, ECM

Liferay Portal 7.0 CE GA2 Release

Liferay - Fri, 05/27/2016 - 11:43

I am pleased to announce the release of:  Liferay Portal 7.0 CE GA2! 

What's New
  • Inline Image Editor: The new image editor allows for simple image editing directly from within Liferay eliminating the need for an external tool while creating content.  Easily resize, crop and make colors adjustments to any image uploaded to Documents and Media from within blogs or any other application that uses an item selector.  The image editor has been designed in a way to make it easy to customize and allows for developers to create and deploy tools that modify images.

    New Upgrade Tool: Liferay 7 provides a new stand-alone upgrade tool which greatly improves the experience of upgrading your Liferay installation to the latest version.  Check out the Upgrade section in the official Liferay documentation for more details.
Release Nomenclature

Following Liferay's versioning scheme established in 2010, this release is Liferay 7.0 CE GA2.  The internal version number is 7.0.1 (i.e. the second release of 7.0).  Future CE releases of 7.0 will be designated GA3, GA4, .. and so on.  See below for upgrade instructions from 6.1, 6.0, and 5.x.


You can find the 7.0 release on the usual downloads page. 

Source Code

As Liferay is an open source project, many of you will want to get at its guts. The source is available as a zip archive on the downloads page, or on its home on GitHub. Many community contributions went into this release, and hopefully many more in future releases! If you're interested in contributing, take a look at our contribution page.

Support Matrix

Liferay's general policy is to update our support matrix for each release, testing Liferay against newer major releases of supporting operating systems, app servers, browsers, and databases (we regularly update the bundled upstream open source libraries to fix bugs or take advantage of new features in the open source we depend on). 

Liferay 7.0 CE GA2 was tested extensively for use with the following Application/Database Servers: 

Liferay CE Application Servers:

  • Apache Tomcat 8.0 with Java 8
  • Wildfly 10.0 with Java 8

Liferay CE Databases:

  • HSQLDB 2 (only for demonstration, development, and testing)
  • MySQL 5.6
  • MariaDB 10
  • PostgreSQL 9.3
New Features Summary
  • Modularity inside: The #1 feature of Liferay 7 is not a feature, but a way to empower you to build more powerful, adaptable, lightweight and innovative systems for the digital world that is coming. Liferay 7's functionality has been modularized into hundreds of modules, allowing you to use what you need for each project and take away the rest, giving you an extensibility unthinkable until now, and a much more elegant development model. And all of this based on rock solid standards of the OSGi family. 
  • New Forms Experience: Liferay 7 includes a brand new application that allows defining and publishing advanced dynamic forms. The forms can have complex multi-column layouts and span several pages. They can be published in any Liferay site just by dropping the form into a page or also Google Forms style, by providing a URL that links directly to a full page form. Many field types are included out of the box and custom types can be added by deploying custom modules. Forms can also be integrated with Liferay's workflow system to submit forms through a predefined process. 
  • Optimized Content Authoring: As content management systems get more complicated and get more options, the more complex writing content might get. But it doesn't have to. We have rethought the authoring experience to let the authors, from web content to blogs, focus on writing great content, while still having available the full power that Liferay's applications provide when they are really necessary. All this thanks to our brand new WYSIWYG editor: Alloy Editor. In addition to this, many small improvements have been added such as the ability to organize web content in folders, visual content diffs, reuse of content structures and templates across sites, and more.
  • Geolocate any content: Liferay 7 provides out of the box the ability to geolocate all web content, data lists, documents & media. It also provides the ability to leverage the power of Liferay's Asset Publisher to create lists of geolocalized content and publish them in a Map.
  • Advanced modern sites easier than ever: Nowadays sites are more complex, dynamic and visually stunning than ever before. Liferay 7 contains a series of improvements  to provide more power to site administrators to create modern sites faster. As a proof of what is now possible Liferay now includes out of the box a new site template showcasing a modern product site, leveraging Liferay 7's new features such as application decorators, new application display templates, sets of pages and more. Additional site templates & themes will be delivered in the next few months in the marketplace.
  • Improved blogs, forum and wiki: When you need to host your own blog it's hard to compete with the simplicity of the online platforms like or Medium, but Liferay 7 makes it much easier. Beautiful and streamlined by default but with all of Liferay's power underneath. Our beloved Forum and Wiki applications have also seen incremental improvements targeted towards encouraging usage and engagement.
  • Easier to use staging, even for the most advanced scenarios: Publishing from staging to live is now as easy as clicking one button. And for more advanced publishing scenarios, it's now possible to save advanced configurations and reuse them to ensure successful publications every time.

  • New image, file and media selector: Whether you are writing a web content, a blog entry, a wiki page, … being able to select an already uploaded picture, upload one now, or even take a picture or video right now to be added to your content is becoming more common than ever before. Liferay's new media selector has been designed to make these common operations easy. Not only that, it's highly extensible so that new sources of media such as google, flickr, youtube, ... can be added to any application using the selector.
  • Faster loading and reduced bandwidth usage: Liferay 7 provides a much faster perceived performance for its users thanks to a new technology that automatically converts all applications (even custom ones) as well as the navigation across pages of a site into Single Page Applications. This means that only the pieces of a page that are necessary are loaded avoiding full page refreshes, reducing bandwidth usage, load times and rendering time in the browser. 
  • Stunning visual and usability improvements in all of the out of the box applications: The User Experience in Liferay 7 has improved so much that we have even created a new design language along the way, Lexicon. You will notice its presence in the stunning new look of all of Liferay's applications which have redesigned to make the best use of the screen real estate for screens of all sizes, make its features easier to find and learn and perform tasks faster than ever before. Liferay 7 provides an implementation of Lexicon as a CSS framework based on Bootstrap that can be used as well for third party applications to achieve the same effect with much less effort than ever before.
  • Optimized product navigation: A new menu provides a unified way for administrators and registered users to access all administrative and personal applications from a single place, leaving all the screen real estate available for the site navigation and decorations. The product navigation is fully extensible to allow customizing it for any need.
  • Better developer experience: By leveraging modularity and state of the art tooling, developing for Liferay 7 is going to be easier and more powerful than ever before. We are embracing Gradle and Maven and creating plugins and some additional command line and Eclipse tools on top. 
  • Infrastructure improvements: Many improvements have been incorporated at the core platform level, including replacing Lucene with ElasticSearch as the default search engine (providing better monitoring, tuning and clustering), JAX-RS infrastructure to build custom and secured RESTful Web Services, a device manager, a new Configuration API to make any application configurable with less effort, a brand new data upgrade framework, etc.

And more: there is much more than we can list here since this release has over 1750 new features and improvements. Not only that, in the next months we plan to leverage modularity to keep delivering features on top of the base Liferay 7 platform, such as a new image editor that will be integrated into Liferay's Documents and Media and the Image Selector.


The Liferay Documentation Team has been hard at work updating all of the documentation for the new release.  This includes updated (and vastly improved/enlarged) javadoc and related reference documentation, and and updated installation and development documentation can be found on the Liferay Developer Network. Our community has been instrumental in identifying the areas of improvement, and we are constantly updating the documentation to fill in any gaps.

Deprecated Plugins

Several plugins have been deprecated in Liferay 7 and will be available in the Marketplace as a labs application after the Liferay 7 Release.  The list of deprecated plugins are:

  • Shopping Portlet
  • Mail Portlet
  • Invitation Portlet
  • Software Catalog

Bug Reporting

As always, the project continues to use to report and manage bug and feature requests.  If you believe you have encountered a bug in the new release (shocking, I know), please be cognizant of the bug reporting standards and report your issue on, selecting the "7.0.0 CE GA2" release as the value for the "Affects Version/s" field.


Good news for those of you on 6.0 or prior! Liferay introduced the seamless upgrade feature with Liferay 6.1. Seamless upgrades allow Liferay to be upgraded more easily. In most cases, pointing the latest version of Liferay to the database of the older version is enough. There are some caveats though, so be sure to check out the Upgrading section on the Liferay Developer Network for more detail on upgrading to 7.0.

Getting Support

Support for Liferay 7.0 CE comes from the wonderful and active community, from which Liferay itself was nurtured into the enterprise offering it is today.  Please visit the community pages to find out more about the myriad avenues through which you can get your questions answered.

Liferay and its worldwide partner network also provides services, support, training, and consulting around its flagship enterprise offering, which is due to be released shortly after this CE release.

Also note that customers on existing releases such as 6.1 and 6.2 continue to be professionally supported, and the documentation, source, and other ancillary data about these releases will remain in place.

What's Next?

Of course we in the Liferay Community are interested in your take on the new features in Liferay 7.0.  Work has already begun on the next evolution of Liferay, based on user feedback and community ideas.  If you are interested in learning more about how you can get involved, visit the Liferay Community pages and dig in.


This release was produced by Liferay's worldwide portal engineering team, and involved many hours of development, testing, writing documentation, translating, testing some more, and working with the wider Liferay community of customers, partners, and open source developers to incorporate all sorts of contributions, both big and small. We are glad you have chosen to use Liferay, and hope that it meets or exceeds your expectations!

The Liferay 7 Community Expedition program has also officially come to a close.  I would like to thank everyone who took time out of their busy schedules in order to participate in the program.  The program was a great success and achieved its goal of helping to improve the overall quality of Liferay 7.  We couldn't have done it without you so thank you again!

Jamie Sammons 2016-05-27T16:43:18Z
Categories: CMS, ECM

Three Ways to Embrace Digital Transformation at Liferay Symposium

Liferay - Thu, 05/26/2016 - 19:11


3 Reasons to Attend #LSNA16

As customers drive how they interact with brands, companies need to stay ahead of the curve with tools that deliver personalized digital experiences wherever, whenever they engage with your business.

Liferay Symposium gives you a forum to learn from leading industry experts, access key content for digital transformation and network with new peers.


  Build Engaging Experiences           Take in fresh keynote presentations, breakout sessions, deep dives and speed consulting, and learn how to create personalized experiences across all channels from an integrated digital experience platform.       Gain Valuable Customer Insights   See firsthand how our clients are attracting and retaining customers through dynamic case studies, customer stories, and product demos on content targeting and using data to increase conversion.       Be a Digital Leader in Your Industry   Learn best practices for redefining your company's digital strategy with actionable takeaways from Liferay founders and developers, industry experts, and world-class clients.  



Angela Wu 2016-05-27T00:11:21Z
Categories: CMS, ECM

Liferay DXP数字体验平台,荣耀绽放:端对端的客户体验

Liferay - Tue, 05/24/2016 - 10:26

知名软件厂商Liferay,已经宣布Lifeay Digital Experience Platform(DXP)的面世。





Liferay的产品副总裁Edwin Chueng,阐释了这一观点: “当今的商务市场,早就超越了仅将目光放在用户的体验这一层面。Liferay DXP通过革命性的创新体验,帮助企业博得客户信心,赢得竞标,开创更多销售机遇。在深度整合的商务流程系统中,企业可以全面掌握客户偏好和历史事件,及时为客户提供优质资源及建议。”   Liferay DXP:惊鸿一瞥

Liferay DXP平台上,销售、市场,客户支持与服务团队可以真正的为创造优质的客户体验而协作。Liferay可以汇集不同的系统中的信息,以更全面的方式在平台上展现出来借以优化客户互动体验,整合企业运维流程。

Liferay DXP也可以促进合作伙伴和员工与客户间的交流,借以缔造更佳的企业印象。 通过以下几个方面,Liferay将其实现:  
  • 弹性架构 - 以变应变:通过高复用性的微服务与高整合性的应用,Liferay可以快速实现数字策略以适应不断更新的尖端技术。

  • 体验管理:基于精准的大数据信息,从促销活动一直到客户服务处理,每一个直接面对客户的商务环节都可以量身打造。

  • 单一客户视图(SVC):基于企业中不同的数据采集点,例如:客户情绪、兴趣点或重要对话,Liferay DXP将所有信息糅合一体,为企业提供单一的客户资料视图。

  • 定向数据:通过使客户访问视频、推广链接、社区活动与社交资料来丰富客户体验。

  • 与新兴技术对接:DXP设计初衷就是为了支持新兴的移动前段框架。这些框架被众多移动前段开发者钟爱和广泛应用。



  1. 真正涵盖(促成)客户旅程:秉承Liferay portal的一贯作风,Liferay DXP更加的适应整个的客户生命周期。生命周期通常是指客户从观望(网站匿名访客)到转变成客户(注册)再到拥护(在客户门户与客户服务系统中)的过程。其他关注CMS产品通常只关注在客户的观望周期。基于Liferay以往的丰富经验,Lifeay在银行业的地位独一无二。

  2. 岂止于客户,广泛的目标受众:除了客户之外,Liferay DXP也是为企业合作伙伴和员工设计的。设计的初衷是为了确保Liferay DXP能够胜任于企业内部协作和效率优化。

  3. 完善的商务平台:Liferay DXP缔造了丰富的协作功能,基于整合后台系统,将更多独立业务部门的信息整理有效利用。

更多信息,请访问Liferay DXP官网。   原文链接: 原文作者:Kaya Ismail Neil Jin 2016-05-24T15:26:11Z
Categories: CMS, ECM

Creating configurable DDL templates with structured web content

Liferay - Tue, 05/24/2016 - 05:45

Liferay DDLs are quite useful for dealing with small sets of custom data, for which it would be overkill to create a new service. Our event microsites use DDLs extensively for displaying speaker, agenda and sponsor information. Through the the Skinny JSON Provider, our DDL data information is even served via JSON-WS for use in the Liferay Events App. How cool!

DDL templates perform the magic of transforming custom DDL data to HTML and are easy to write in Freemarker or Velocity. 

But what if you need to reuse DDL templates in various contexts? DDL templates do not, as far as I am aware, offer any options for configuration. For example, we have a common agenda DDL definition for Liferay events. Since the events themselves take place in different countries there are many aspects of the displayed agenda that are country or region specific (date formatting, header text, etc.). With standard DDL templates, there is no simple way to reuse a DDL template in different contexts.

One idea to solve this problem is to use custom web content structures. A web content structure is created with a field for the DDL record set id and whichever other fields need to be configured. Then a web content article is created where the particular record set id is set and the standard Web Content Display portlet is used to display the template. 

In the code there is hardly any difference. Instead of using the automatically set record set id value ( $, we instead use our own field definition, e.g. "record_set_id" to retrieve and process and DDL records in the template: 

## Get DDL Records #set ($ddl_records_local_service = $serviceLocator.findService("com.liferay.portlet.dynamicdatalists.service.DDLRecordLocalService")) #set ($record_set_id = $getterUtil.getLong($ #set ($records = $ddl_records_local_service.getRecords($record_set_id))

Then we are free to define whatever other fields we need for further customizing the DDL display. This has the following advantages compared to using standard DDL templates:

  • DDL template code can be reused in more situations leading to stronger more generic templates as opposed to one-off solutions for each page
  • The display of DDLs can be configured by non-programmers 
  • Instead of having to supplement DDL templates with related web content for headers and other elements, these elements can be built directly into the DDL template making pages easier to maintain. 

Here is an example of using this approach to configure the display of sponsors. The header text can be configured in the "sponsor_header_text" field. The text for displaying "Platinum" sponsors can be configured in the "sponsor_text" field. 


One thing to keep in mind is that you might run into problems with cached DDL data, as by default web content templates are cached. 

DDL Templates and Web Content structures - two great tastes that taste great together!















Allen Ziegenfus 2016-05-24T10:45:57Z
Categories: CMS, ECM

Bootstrap 3 in Liferay 6.2, yes! that's possible

Liferay - Mon, 05/23/2016 - 18:02

Hey guys, today I am going to speak about a concurrent topic, how to replace Bootstrap 2.3.2 CSS in Liferay 6.2 for new Bootstrap 3.x, I have received a lot of questions about it, and I helped all I was able, but I think this post and GitHub repository with a theme example can help more than some emails.


Before all else, I would like to say that the solution which I provide today is a personal work (not official) and only one of many ways to achieve it but for me it is the easier way because we only change the theme.


Yes, I've written the word "replace". This solution remove Bootstrap 2.3.2. and add Bootstrap 3.x (4 in the near future). It is not a way to put Bootstrap 3 on top of Bootstrap 2.3.2, I can not recommend that solution for many reasons, for example: it would duplicate the CSS weight, there would be a lot of class conflicts, or it would be very difficult to define browsers compatibility in your project.

Of course, we can not replace all Bootstrap 2.3.2 classes references along Liferay portal only when you theme is applied, but they are not many classes to rescue, so we will extend those old classes from new Bootstrap 3.x equal clases, like an example: span6 will work as col-md-6.

it can sound hard but no worries, let's see step by step (or go directly to GitHub repository with an example):


We are going to create a new _styled theme based on Boostrap 3.x, so first of all, you will need create a new theme using new SDK based on gulp or normal SDK.

Did you know where Bootstrap 2.3.2 CSS files are located in your theme? No worries, they are in “css/aui” directory, so let's work into this directory.


1º Create new aui.css file in “css” directory, then we must delete Bootstrap 2.3.2 references in this aui.css, in this way Bootstrap 2.3.2 will be removed from our theme (files will be there, but they won't be loaded).




2º Now we are are going to add the new Bootstrap, so let's go to copy "Bootstrap 3.x sass-version" files into a new directory inside “aui” called "bs3" and reference it in aui.css.

We can use differents ways to get Bootstrap 3.x sass-version, download directly from Bootstrap-sass GitHub repository, using Bower, npm, gem or compass, as you prefer.




3º Well, we have interchanged Bootstrap versions, but all old classes which have been deleted/renamed in Bootstrap 3.x do not look well so they should be created as an extension of the equal classes in Bootstrap 3.x, for this we will use my CSS file named "_bs2_extender.scss" which will do all basic extensions.

Some examples about what this file does:




4º Some Liferay CSS components do not look so well as they should because they were based on Bootstrap 2.3.2, so to fix it we will add a file called “_bs_liferay_fixes.scss” which contains some adjustments.




Now we can deploy the theme and we should see something like this:




It’s done! you have a new Bootstrap 3.x_styled-theme with which you will be able to use as a base to build your Bootstrap 3.x Liferay 6.2 themes.

In “_bs2_extender.scss” file I have extended the classes I consider the minimum to work well in Liferay 6.2, but feel free removing or adding, even collaborating in GitHub repository of this theme.

I recommend to use this theme when we want to use Bootstrap 3.x upgrades like its grid or responsive facilities. If we are still writing Bootstrap 2.3.2 markup, It wouldn’t make much sense, so be smart about what Bootstrap version do you want to use.


Thanks guys! More info about what I’m working on, Liferay themes or Liferay general world on my twitter @marcoscava

Marcos Castro 2016-05-23T23:02:50Z
Categories: CMS, ECM
Syndicate content