This wiki does not contain official documentation and is currently deprecated and read only. Please try reading the documentation on the Liferay Developer Network, the new site dedicated to Liferay documentation. DISCOVER Build your web site, collaborate with your colleagues, manage your content, and more. DEVELOP Build applications that run inside Liferay, extend the features provided out of the box with Liferay's APIs. DISTRIBUTE Let the world know about your app by publishing it in Liferay's marketplace. PARTICIPATE Become a part of Liferay's community, meet other Liferay users, and get involved in the open source project. Web Content Field Validation
Introduction #
This article describes how to add field validations into web content (e.g. make a field mandatory for submission, or requiring that a field is numeric).
Environment #
Liferay-Tomcat Bundle 6.0 Plugins SDK - Hooks
Sample Structure #
<root> <dynamic-element name='name' type='text' validate='mandatory'></dynamic-element> </root>
List of JSP Files to be extended using Hooks #
Information about creating JSP Hooks is available in the Liferay Wiki. Create a JSP Hook for the Journal Portlet. Here is a list of files that need to be extended in order to implement validation -
1) edit_article.jsp 2) edit_article_content_xsd_el.jsp 3) edit_structure_xsd_el.jsp 4) edit_structure.jsp
Changes required in edit_structure_xsd_el.jsp #
1) Read the element in the starting the way name and type attributes are read
String elValidate = JS.decodeURIComponent(el.attributeValue("validate", StringPool.BLANK));2) Define a new hidden element "validate" in the existing table. The table already has a hidden element "_depth".
<td> <input id="<portlet:namespace />structure_el<%= count.getValue() %>_validate" tabindex="<%= tabIndex.getValue() %>" type="hidden" size="20" value="<%= elValidate %>" /> </td>
Changes required in edit_article_content_xsd_el.jsp #
1) Read the element in the starting
String elValidate = el.attributeValue("validate", StringPool.BLANK);2) Define a hidden element along with the others like name, type,depth
<input id="<portlet:namespace />structure_el<%= count.getValue() %>_validate" type="hidden" value="<%= elValidate %>" />
Changes required in edit_structure.jsp #
1) Modify the existing getXsd() function and read the validate attribute like the other attributes.
Some code snippet for the same
var elValidate = document.getElementById(portletNameSpace+"structure_el" + i + "_validate");
if (elDepth != null && elName != null && elType != null) {
var elDepthValue = elDepth.value;
var elNameValue = encodeURIComponent(elName.value);
var elTypeValue = encodeURIComponent(elType.value);
var elValidateValue = encodeURIComponent(elValidate.value);
if (cmd == "add" || cmd == "remove" && elCount != i) {
for (var j = 0; j <= elDepthValue; j++) {
xsd += xmlIndent;
}
if(elValidateValue.length == 0){
xsd += "<dynamic-element name='" + elNameValue + "' type='" + elTypeValue + "'>";
}
else{
xsd += "<dynamic-element name='" + elNameValue + "' validate='" + elValidateValue + "' type='" + elTypeValue + "'>";
}
if (cmd == "add" && elCount == i) {
xsd += "<dynamic-element name='' type=''></dynamic-element>\n";
}Changes required in edit_article.jsp #
Liferay calls the javascript function
function <portlet:namespace />saveArticle(cmd) {before saving any article. So we would need to override this function and call a validation function before submitting the form.
Sample Validation Function -
function trim(str) {
return str.replace(/^\s+|\s+$/g,"");
}
function validateArticleContent(portletNameSpace)
{
var flag = "true";
for (i = 0; i >= 0; i++) {
var elDepth = document.getElementById(portletNameSpace+"structure_el" + i + "_depth");
var elName = document.getElementById(portletNameSpace+"structure_el" + i + "_name");
var elType = document.getElementById(portletNameSpace+"structure_el" + i + "_type");
var elValidate = document.getElementById(portletNameSpace+"structure_el" + i + "_validate");
var elContent = document.getElementById(portletNameSpace+"structure_el" + i + "_content");
var elLanguage = document.getElementById(portletNameSpace+"structure_el" + i + "_localized");
if (elDepth != null && elName != null && elType != null) {
var elDepthValue = elDepth.value;
var elNameValue = elName.value;
var elTypeValue = elType.value;
var elValidateValue = elValidate.value;
var elContentValue = "";
var elLanguageValue = elLanguage.value;
if (elTypeValue == "text" || elTypeValue == "text_box" || elTypeValue == "image_gallery" || elTypeValue == "document_library" || elTypeValue == "link_to_layout") {
elContentValue = elContent.value;
elContentValue = "<![CDATA[" + elContentValue + "]]>";
if(elValidateValue == "mandatory")
{
if(trim(elContent.value) == ""){
alert('Please enter valid '+elNameValue+' value.');
flag ="false";
break;
}
}
}
}
else
{
break;
}
}
return flag == "true";
}
This concludes the example: other kinds of validation can be added in a similar fashion.