Thursday, 14 September 2017

Liferay Default Theme Velocity Variables

List of velocity variables in theme template


Liferay Default Theme Velocity Variables tutorial will show light on the available velocity variables in Liferay theme. As you already know, Liferay already set parent variables in init.VM (/Liferay-home/tomcat/web apps/ROOT/HTML/themes/unstyled-theme/templates/init.vm).

Variables:

  • $theme_display
  • $portlet_display
  • $request
  • $css_folder       — -$theme_display.getPathThemeCss()
  • $images_folder —  $theme_display.getPathThemeImages()
  • $javascript_folder –$theme_display.getPathThemeJavaScript()
  • $templates_folder — $theme_display.getPathThemeTemplates()
  • $full_css_path
  • $company
  • $layout  –  Current layout
  • $user
  • $full_templates_path
  • $is_signed_in  — $theme_display.isSignedIn()
  • $current_time
  • $the_year
  • $permissionChecker.isOmniadmin() –> to check Super Admin
  • $dateUtil
  • $escapeTool
  • $propsUtil  -> To get Portal Ext Properties ($propsUtil.get(“propertye-key”))
  • $paramUtil
  • $getterUtil
  • $htmlUtil
  • $portalUtil
  • $portal
  • $prefsPropsUtil
  • $propsUtil
  • $portletURLFactory   ->    Here is sample code to create Portlet URL’s in Velocity templates.                     #set($test_plid = $portalUtil.getPlidFromPortletId($theme_display.getScopeGroupId(), false,                      “test_WAR_testportlet”))                                                                                                                   #set ($test_url = $portletURLFactory.create($request, “test_WAR_testportlet”,                                              $test_plid, “RENDER_PHASE”))                                                                                                                      $test_url.setWindowState(“normal”)                                                                                                        $test_url.setPortletMode(“view”)                                                                                                              $test_url.setParameter(“privateLayout”, “false”)                                                                                      $test_url.setParameter(“cmd”, “basicView”)
  • $stringUtil
  • $unicodeFormatter
  • $validator
  • $arrayUtil
  • $browserSniffer
  • $dateFormats
  • $dateTool
  • $dateUtil
  • $escapeTool
  • $expandoColumnLocalService
  • $expandoRowLocalService
  • $expandoTableLocalService
  • $expandoValueLocalService
  • $httpUtil
  • $imageToken
  • $iteratorTool
  • $languageUtil
  • $unicodeLanguageUtil
  • $localeUtil
  • $randomizer
  • $serviceLocator
  • $sessionClicks
  • $staticFieldGetter
  • $listTool
  • $mathTool
  • $sortTool
  • $numberTool                                                                                                                                                                                                                                                                                                                  Useful code snippets in Liferay theme Velocity templates:
  • Theme. Runtime is used to insert portlet at theme level
    • $theme.runtime(“emailnotification_WAR_kpiemailnotificationportlet_INSTANCE_adfckdkkek”)
  • to check Omni admin
    • #if ($is_signed_in && $permissionChecker.isOmniadmin())
      #dockbar()
      #end
  • To get the cotent based on locale:
    • $languageUtil.get($locale, $the_title, $page.getName($locale))

  • Wednesday, 13 September 2017

    Liferay - Build number deployment error

    Many times while deploying portlet you people might have seen following error.


    Build namespace ABC has build number X which is newer than Y.

    Lets first understand why this error is coming . Whenever we build services for our portlets buidl number inside service.properties is getting incremented. And when you deploy portlet Liferay will compare build number available inside service.properties against the build number available inside servicecomponent table. If the build number inside service.properties is less then the one inside servicecomponent table it means you are downgrading your build and your DB changes wont be affected . At that time portal will throw this exception saying

     "Build namespace ABC has build number 3 which is newer than 1". 

    To resolve this problem we need to increase the build number inside service.properties file . For above scenario we need to changes build number to either 3 or greater then 3.

    build.number=4 

    Another solution (not recommended) is you can delete entries for your portlet from servicecomponent table. For more information check this thread on Liferay Forum.

    Popup in Liferay Using Alloy-ui

    Here is the sample example to display pop up in liferay using Alloy -ui

    In pop up body you can display any thing you want

    here in our example we will display simple greeting message in pop up window

    These are Imports:

    <%@ taglib uri="http://liferay.com/tld/portlet" prefix="liferay-portlet" %>
    <%@ taglib uri="http://liferay.com/tld/theme" prefix="liferay-theme" %>
    <%@ taglib uri="http://java.sun.com/portlet_2_0" prefix="portlet" %>
    <%@ taglib uri="http://liferay.com/tld/ui" prefix="liferay-ui" %>
    <%@ taglib uri="http://alloy.liferay.com/tld/aui" prefix="aui" %>
    <%@page import="com.liferay.portal.kernel.language.LanguageUtil"%>
    <%@page import="com.liferay.portal.kernel.portlet.LiferayWindowState"%>
    <liferay-theme:defineObjects/>
    <portlet:defineObjects/>

    Render URL

    <portlet:renderURL var="simpleDialogIframe"
     windowState="<%=LiferayWindowState.POP_UP.toString()%>">
     <portlet:param name="render" value="showPopUp"/>
     </portlet:renderURL>

    In Controller Render()

    @RenderMapping(params = "render=showPopUp")
    public String showPopup(RenderRequest request, RenderResponse response){
    System.out.println("Under Render");
    return showPopUp;
    }

    Button On Click Opening PopUp

     <aui:button name="f1" value="Click" onClick="popUpModel()"/>

    PopUp Script

     <aui:script>
     function popUpModel(){
     var url = "<%=simpleDialogIframe.toString()%>";
       AUI().use('aui-base', 'liferay-util-window', 'aui-io-plugin-deprecated', function(A){
           var popupWidth = 300;
           var customPopUp = Liferay.Util.Window.getWindow({
               dialog:{
                   centered: true,
                   constrain2view: true,
                   modal: true,
                   resizable: false,
                   destroyOnClose: true,
                   destroyOnHide: true,
                   width: popupWidth,
                   height:250,
                   after:{
                       destroy: function(event){
                       }
                   }
               },
               id: "<portlet:namespace/>dialogId"
           }).plug(A.Plugin.DialogIframe,{
               autoLoad: true,
               iframeCssClass: 'dialog-iframe',
               uri: url
           }).render();

           customPopUp.show();
           customPopUp.titleNode.html('<h1>RITHWIK</h1>');

       });
    }

    </aui:script>

    in our example we have created one spring portlet in that i am opening a PopUp in PopUp I am rendering jsp 

    Friday, 19 May 2017

    Bootstrap Datepicker Change Language Dynamically

    I am now wanting to dynamically change the language of the date picker when the user changes a language of PORTAL.

    I'm trying to localize the bootstrap-datetimepicker which has a folder 'locales' that contains the different languages.

    The plugin supports i18n for the month and weekday names and the weekStart option. The default is English ('en'); other available translations are avilable in the js/locales/ directory, simply include your desired locale after the plugin. To add more languages, simply add a key to $.fn.datetimepicker.dates, before calling .datetimepicker().  

    To your View page and design your page likes this:

        <div class="span12">
              
                <span class="span5">
                    <aui:input  name="fromdate" id="from-date-input" value='${fromdateValue}'
                           inlineField="true" readonly='true' data-date-autoclose='true'>                  
                    </aui:input>
                </span>
              
                <span class="span5">
                    <aui:input  name="todate" id="to-date-input" value='${todateValue}'
                             inlineField="true" readonly='true' data-date-autoclose='true'>
                    </aui:input>
                </span>
              
                <span class="span2">
                    <input type="submit" value="Go" name="Go" onclick="<portlet:namespace/>dateValidate();" >
                </span>
              
            </div>


    Now We have to download bootstrap-datetimepicker.de.js from bootstrap site.

    NOTE:The default is English (“en”); Am using GERMAN(de) for demonstration, other available translations are available in the js/locales/ directory, simply include your desired locale after the plugin.

    Then we have JS folder in our Portlet. There we have put the file bootstrap-datetimepicker-de.js with the following content.


     datetimepicker-de.js code like that:

    /**
     * German translation for bootstrap-datepicker
     * Sam Zurcher <sam@orelias.ch>
     */
    ;(function($){
        $.fn.datepicker.dates['de'] = {
            days: ["Sonntag", "Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag"],
            daysShort: ["Son", "Mon", "Die", "Mit", "Don", "Fre", "Sam"],
            daysMin: ["So", "Mo", "Di", "Mi", "Do", "Fr", "Sa"],
            months: ["Januar", "Februar", "März", "April", "Mai", "Juni", "Juli", "August", "September", "Oktober", "November", "Dezember"],
            monthsShort: ["Jan", "Feb", "Mär", "Apr", "Mai", "Jun", "Jul", "Aug", "Sep", "Okt", "Nov", "Dez"],
            today: "Heute",
            monthsTitle: "Monate",
            clear: "Löschen",
            weekStart: 1,
            format: "dd.mm.yyyy"
        };
    }(jQuery));


    Next we can add this bootstrap to our liferay-portlet.xml file.  like

    <footer-portlet-javascript>/js/bootstrap-datepicker.de.js</footer-portlet-javascript>

    Next we can add the script to our view page JSP, If locale change Date-picker should be change en to de:

    <script>
           $(document).ready(function(){
                 var locale = "<%=themeDisplay.getLocale().toString()%>";
                 console.log("Locale Value is......."+locale);
                 var jslocale = 'en';
                 if(locale=="de_DE"){
                     jslocale='de';
                 }
                 $("#<portlet:namespace/>to-date-input , #<portlet:namespace/>from-date-input").datepicker({
                   autoclose:true,
                   format: "dd/mm/yyyy",
                   endDate: '+0d',
                   language: jslocale
                  });
                }); 

    </script> 

    To restrict the date picker from taking future date:
    I have added a Bootstrap property in above script-

     endDate: '+0d'

     Now its time for validation on datepicker:
    For my case i added these 3 validation- 
    1.From and To dates are required.
    2.From date cannot be greater than the To date.
    3.Date range must be within 1 month.

        function <portlet:namespace/>dateValidate(){
            var fromdate="";
            var todate ="";
            var startDate = "";
            var endDate = "";
            var months = 0;
            var daysDiff = 0;
            var timeDiff = 0;
            var selFromDate = $("#<portlet:namespace/>from-date-input").val();
            var selToDate = $("#<portlet:namespace/>to-date-input").val();
          
            if(selFromDate!=null && selFromDate!='' && selToDate!=null && selToDate!=''){
                  var fdate = selFromDate.split("/")
                  var tdate = selToDate.split("/")
                  var fromNewDat = new Date(fdate[2], fdate[1] - 1, fdate[0]);
                  var toNewDat = new Date(tdate[2], tdate[1] - 1, tdate[0]);
                  startDate = new Date(fromNewDat);
                  endDate = new Date(toNewDat);
                  timeDiff = endDate - startDate;
                  daysDiff = Math.floor(timeDiff / (1000 * 60 * 60 * 24));
                 }
            if (selFromDate == "" || selToDate == ""){
                $('#<portlet:namespace/>errorMessage').html('From and To dates are required');
            }else if (startDate > endDate){
                $('#<portlet:namespace/>errorMessage').html('From date cannot be greater than the To date');
            }else if(daysDiff > 30){
                $('#<portlet:namespace/>errorMessage').html('Date range must be within 1 month');
            }else {
                $('#<portlet:namespace/>errorMessage').html('');
            }  
        }

    Tuesday, 9 May 2017

    Liferay Maven Introduction & Install Maven

    Q-what is maven?
    ans-"maven is a software management and comprehension tool based on the concept of project object model.

    Maven do many things for us like resolving dependencies, create project structure, build  a project, creating war/jar etc. By using Maven you can also create portlet, theme, services without any need of SDK.

    (POM) which can manage project build , reporting and  documentation from center piece of information."


    All build system are essentials the same
    There are some step for build project
    1-compile source code.
    2-copy resource
    3-compile and run test.
    4-packge project.
    5-deploy project
    6-clean up the code.


    Development of maven wanted:-
    Advantages of maven: - Maven wanted a standard way to build the project they wanted clear definition what the project consist of an easy way to publish project information and way to share jar across several the project.
    they wanted an easy way to build the project and share your project with the colleagues or with the client
    so they come up with the tool which is called maven.. which is for building and managing  any java project
    maven is intended to make day to day java developer work easier


    POM(project object model)
    Maven uses the concept of POM.

    Q-What is pom?
    ans- POM is fundamental unit of work in maven you can say.
    "pom is XML file that contain information about the project and configuration details used by maven
    to build the project "


     Note-XML file contains some information
    1-  Describe a project
    2- This information contain name, version and artifact, source code location, Dependences of project
    3- It also retail the plugin information and profile.
    4- It uses XML by default
    5- But not the way ant uses XML.


    MAVEN Advantag and objective:- 
    1: - Making the build process easy.
    2: - Provide the uniform an information
    3: - Provide quality project information
    4: - Provide guildlines for best practice Development
    5: - Allowing transprant migration for a new feature.


    Create first maven project simple

    step1- First set class path  with maven
    step2- Copy that maven project path and pased on command line.
    step3- mvn archetype: generate  (this command is used for generate  project from existeing template ) maven project( this command will  help you to create a perfect diretory structure for you)
    ( when you entre for this command we need internate for download plugin)

    note :- Generally what happend is  if yu are not using maven than you need to make project structural  by your self.

    How to create maven project with eclipse:-
    ans:-
    step:- Goto file-new- choose project-search maven-select maven project-next-next-we need to give group id, artifact id,version,package  and leave everything is default
    and finish

    after  eclipse it will create maven project for us.
     
    How maven work internally? 

    Suppose you need any dependencies jar file maven it provide automatically download required  dependencies for that we need to dependency on jar.

    Jquery Validation for radio button

    <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.10.0/jquery.min.js"></script>
    <script type="text/javascript" src="jquery/jquery.validate.js"></script>


    <script type="text/javascript">
        $(document).ready(function() {


            <!--simple validation for  radio button ------->

          
            $("#SaveConfirm").click(function(){
                var test=0;
                console.log("here>>>>>>>>>>>");
                if(!($("#r1").is(':checked') || $("#r2").is(':checked')){
                    console.log("hide");
                    $("#error1").html("Enter select First radio buttion");
                    test=1;
                    }
                else{
                console.log("show");
                $("#error1").html("");
                console.log("show2s");
                }
              
                if(!($("#r3").is(':checked') || $("#r4").is(':checked'))){
                console.log("hide");
                $("#error2").html("Enter select second radio buttion");
                test=1;
                }
            else{
            console.log("show");
            $("#error2").html("");
            console.log("show2s");
            }
         
                if(test==1)
                    return;
              
            });
        });
    </script>


    <script type="text/javascript">
    $(document).ready(function(){


    <!--validation for if radio button is checked with JQuery?------->

      
    $('.fistRed').change(function(){
          
            if($(this).is(':checked'))
                $('#error1').html('');
        });
          
    $('.secdRed').change(function(){
      
        if($(this).is(':checked'))
            $('#error2').html('');
    })     
    });
    </script>

     

     <!--Input Fields---->


    <div colspan="2" align="center">
    <tr>
          <td><p>
            <label>
              <input type="radio" id="r1" name="radio1"  class="form-input fistRed" />
              yes</label>
            <label>
              <input type="radio" id="r2" name="radio1"  class="form-input fistRed" />
              no</label>
            <br />
          </p></td>
        </tr>
        <label class="form-label" style="color:red;" id="error1"></label><br>
        <tr>
          <td><p>
            <label>
              <input type="radio" id="r3" name="radio2"  class="form-input secdRed" />
              yes</label>
            <label>
              <input type="radio" id="r4" name="radio2"  class="form-input secdRed"/>
              no</label>
            <br />
          </p></td>
        </tr>
        <label class="form-label" style="color:red;" id="error2"></label>
            
    <div colspan="2" align="center">
    <input type="submit" value="Rigister" id="SaveConfirm">
    </div>
    </div>

    Friday, 31 March 2017

    Select folder from document library in custom portlet

     To get specific folder folderId from Document media folders hierarchy.

     Need to do, like that other than using loops.

    Step-1  Make your folders hierarchy.

    public static final String  Base_Folder= "Documents/ABC/XYZ";

    In this Base_Folder Variable we need to get FolderId to XYZ folder

        public static long getBaseLiferayFolderId(long groupId) throws PortalException,
         SystemException {
            //here we are geting parentFolderId
          String liferayBasePath = Base_Folder;
          long parentFolderId = DLFolderConstants.DEFAULT_PARENT_FOLDER_ID;
          List<String> folderNames = Arrays.asList(liferayBasePath.split(StringPool.SLASH));
          for (String folderName : folderNames) {
           if (!StringPool.BLANK.equalsIgnoreCase(folderName)) {
            parentFolderId = DLFolderLocalServiceUtil.getFolder(groupId, parentFolderId, folderName).getFolderId();
           }
          }
          return parentFolderId;
         }